第04章 - 项目文件与个人设置
工程文件是 GeoLibre 的“可带走的工作区”:地图视图、图层、样式、插件状态、打印布局与故事地图都在一个 JSON 文件里。个人设置则是“留在设备上的偏好与凭据”:语言、布局、AI Provider、S3 连接,以及不进工程文件的 API key。
本章分两半:4.1–4.11 讲工程文件与保存/分享生命周期,4.12–4.13 讲设置分页与本地存储。读完你应能回答三个问题:这个功能的状态到底存在哪里、分享时什么会被剥离、换设备时哪些东西不会跟着走。
4.1 工程文件:一个文件装下工作区
4.1.1 两个扩展名与文件关联
GeoLibre 当前把工程保存为 .geolibre 文件,同时继续打开早期的 .geolibre.json 名称。两者内容相同:
| 事项 | .geolibre |
.geolibre.json |
|---|---|---|
| 当前写入 | 是 | 否 |
| 可打开 | 是 | 是(应用内、命令行、URL) |
| 文件管理器双击打开 | 是(安装包注册为 GeoLibre Project 文档) | 否;操作系统只看到 .json |
| 内容差异 | 无 | 无 |
| 获得文件关联 | — | 重命名为 .geolibre |
桌面可执行文件同时接受两种名字:
geolibre-desktop /path/to/watershed.geolibre
geolibre-desktop /path/to/legacy.geolibre.json
提示 文档与旧教程里仍常写
.geolibre.json,那不是错误,只是历史名称。新建工程保存时优先用.geolibre,团队协作时统一扩展名可以减少“双击打不开”的困惑。
4.1.2 工程里有什么
一个工程文件可以包含:
- 地图视图(中心、缩放、方位、俯仰,可选外包框)与底图设置。
- 图层列表、图层分组、每个图层的源信息与样式。
- 工程级地图偏好(边界限制、缩放范围、最大俯仰、天体、比例尺单位、坐标格式、地图 CRS 等)。
- 插件状态(清单 URL、激活的插件、地图控件位置、插件设置)。
- 图例定制、打印布局、故事地图、Dashboard 部件、书签与书签文件夹。
- 处理模型、处理历史、OBIA 工作台状态。
- 多图网格与副图相机、主图渲染引擎。
- 工程级 Style Manager 条目、评审评论、启动交互状态与自由元数据。
4.1.3 工程里没有什么
工程是引用式的,默认不包含:
- 远程数据本身(WMS、ArcGIS 服务、远程 GeoParquet/COG 等只保存 URL 与参数)。
- 大多数本地文件的二进制内容(本地栅格、MBTiles 等只保存路径;桌面版才能重新读取)。
- 你的账号、API key、S3 密钥等凭据(分享/导出时会被剥离,见 4.10.4)。
- 设备级 UI 状态(面板宽度、当前滚动位置、对话框尺寸)。
- 自动保存快照(存在 IndexedDB,不上传、不写进工程)。
例外是内嵌矢量:通过 Add Data → Vector Layer 添加的本地小矢量图层,可能会把 GeoJSON 写进工程(受大小上限约束),以便浏览器版也能保存与分享;这也是分享时“本地图层可能缺失”提示会区分“内嵌矢量”和“纯路径图层”的原因。
4.2 顶层字段
4.2.1 字段总表
| 字段 | 类型 | 说明 |
|---|---|---|
version |
string | 工程格式版本;应用写 0.2.0,旧文件与 Python 包可能写 0.1.0 |
name |
string | 工程显示名(工具栏右侧可改) |
mapView |
object | center、zoom、bearing、pitch,可选 bbox |
basemapStyleUrl |
string | MapLibre 样式 JSON URL;空字符串表示空白背景 |
basemapVisible |
boolean | Background 图层是否可见 |
basemapOpacity |
number | 背景透明度 0–1 |
blankBackgroundColor |
string | null | 空白背景的自定义颜色;null 用主题默认 |
layers |
array | 图层定义 |
selectedLayerId |
string | null | 保存时选中的图层;null 表示不恢复活动图层 |
layerGroups |
array | Layers 面板文件夹(id、name、parentId、collapsed、visible、opacity) |
styles |
object | 图层 id → LayerStyle 的映射 |
preferences |
object | 地图偏好、环境变量、地理编码设置 |
plugins |
object | 外部插件清单 URL、激活插件、控件位置、插件设置 |
legend |
object | 打印布局图例的定制(标题、分组、顺序、逐项改名/隐藏) |
printLayout |
object | 打印布局设置;未打开过编辑器时省略 |
storymap |
object | 故事地图章节与演示设置;无章节时省略 |
models |
array | 保存的处理模型(Model Builder 流水线) |
processingHistory |
array | 处理工具运行记录 |
obia |
object | 面向对象影像分析工作台状态与运行溯源 |
widgets |
array | Dashboard 图表部件 |
dashboardColumns |
number | Dashboard 网格列数 1–6,默认 2 |
mapLayout |
object | 多图网格(rows、cols、syncView) |
secondaryMapViews |
array | 主图之外的副图相机与图层可见性 |
primaryMapLabel |
string | 多图网格主图标签 |
primaryRenderer |
string | 主图引擎:maplibre(默认)/mapbox/arcgis/cesium |
styleLibrary |
array | 工程级 Style Manager 条目 |
comments |
array | 锚定到点或要素的评审评论及回复 |
interaction |
object | 打开工程时的 Identify 目标与控件可见性 |
bookmarks / bookmarkGroups |
array | 书签与书签文件夹 |
metadata |
object | 自由元数据 |
4.2.2 最小可用样例
下面是一个能通过解析的最小工程(省略了可选块):
{
"version": "0.2.0",
"name": "Demo",
"mapView": { "center": [-100, 40], "zoom": 2, "bearing": 0, "pitch": 0 },
"basemapStyleUrl": "https://tiles.openfreemap.org/styles/liberty",
"basemapVisible": true,
"basemapOpacity": 1,
"layers": [],
"styles": {},
"preferences": {},
"metadata": {}
}
4.2.3 必需字段与容错
解析入口(parseProject)只强制三个字段:version、name、mapView。缺任何一个都会抛错:Invalid GeoLibre project: missing required fields。
其余字段遵循“能修就修、修不了就默认”的策略:
| 情况 | 行为 |
|---|---|
basemapStyleUrl 缺失 |
用默认底图 |
basemapVisible / basemapOpacity 缺失 |
分别为 true / 1 |
图层的 groupId 指向不存在的分组 |
去掉该 groupId,图层回到顶层 |
selectedLayerId 指向不存在的图层 |
不恢复活动图层 |
| 相机、缩放、俯仰越界 | 规范化到合法范围,而不是让 MapLibre 静默裁剪 |
| 打印布局/故事地图/图例字段非法 | 该字段回退默认;整个工程仍可打开 |
| 书签相机缺失或重复 id | 丢弃该书签 |
| 多图网格不合法 | 回退单图 |
提示 手改工程文件时,最安全的做法是只改确定存在的键,并用应用打开验证;不要指望“写错一个字段整份文件还能完全按原意生效”。GeoLibre 的容错目标是“能打开且不崩”,不是“修复你的笔误”。
4.2.4 省略即默认
为了向后兼容,很多字段“默认值不写”:
primaryRenderer省略表示maplibre;所有在它之前保存的工程与从未离开 MapLibre 的工程保持字节级兼容。mapLayout只在网格大于 1×1 时写入。printLayout只在设置偏离默认时写入。bookmarks、bookmarkGroups、widgets、storymap在为空时省略。styleLibrary只写工程级条目,应用级库不进工程。
这带来一个实际好处:工程文件的 diff 更小,团队用 Git 管理工程时噪音更低。
4.3 图层对象与类型
4.3.1 图层对象字段
| 字段 | 说明 |
|---|---|
id |
唯一 id(通常为 UUID) |
name |
显示名 |
type |
图层类型(见 4.3.2) |
source |
源描述,随类型变化(URL、tiles、图层名、连接等) |
visible / opacity |
可见性与透明度 |
style |
图层样式(颜色、线宽、半径、栅格亮度/对比度等) |
metadata |
内部状态(刷新策略、时态绑定、嵌入数据快照等) |
beforeId |
渲染顺序提示 |
geojson |
内嵌的 FeatureCollection(如适用) |
sourcePath |
本地文件路径(桌面可重新读取) |
groupId |
所属图层分组 |
connection |
可刷新图层的连接策略(见 4.3.5) |
4.3.2 图层类型
| 类型 | 支持情况 |
|---|---|
geojson |
导入文件与 GeoJSON URL |
xyz |
栅格瓦片模板 |
wms |
WMS GetMap 瓦片图层 |
wmts |
WMTS 栅格瓦片模板 |
raster |
栅格瓦片模板;带 source.ionAssetId 与 metadata.sourceKind: "cesium-ion" 时是 Cesium Ion 影像(仅三维) |
vector-tiles |
MapLibre 矢量瓦片源 |
mbtiles |
桌面版通过本地 MapLibre 协议 |
arcgis |
ArcGIS VectorTileServer;FeatureServer 存为 geojson,MapServer/ImageServer 存为 raster |
pmtiles |
通过 Components 插件 |
cog |
COG 与 GeoTIFF 栅格 |
flatgeobuf |
通过 Components 插件;作为本地矢量文件加载时导入为 GeoJSON |
zarr |
通过 Components 插件 |
lidar |
通过 Components 插件 |
gaussian-splat |
通过 Components 插件 |
geoparquet |
经 DuckDB-WASM 导入为 GeoJSON |
duckdb-query |
SQL 查询结果图层 |
deckgl-viz |
通过 Deck.gl Layer 插件 |
video |
地理参考视频叠加 |
image |
地理参考图片叠加(KML GroundOverlay、Georeferencer、NetCDF 网格) |
3d-tiles |
通过 maplibre-gl-3d-tiles;带 ionAssetId 时由三维地球加载 |
4.3.3 样式:layer.style 与 project.styles
图层自己的 style 是保存时的样式快照;project.styles 是“按图层 id 索引的样式表”。应用在加载时会用 styles 中的条目水合图层样式(hydrateProjectLayer),因此:
- 想批量改样式,优先改
styles对应条目。 - 想复制样式到另一个工程,用导出的样式文件(4.11.1)而不是手工搬 JSON。
- 某些样式属性只对特定类型有意义(如
circleRadius对点、rasterBrightnessMin对栅格),无关属性会被忽略。
4.3.4 图层分组与顺序
layerGroups 是扁平数组,通过 parentId 表达嵌套;layers 数组保持“同组连续”,分组才能作为一个块渲染。分组有自己的 visible 与 opacity,在同步到地图前与子图层的可见性/透明度合并,子图层自身保存的值不被改写。
4.3.5 图层级扩展字段
现代工程里,图层对象还可能带这些块:
| 字段 | 作用 | 典型来源 |
|---|---|---|
capabilities |
声明 query/create/update/delete/export 能力 |
共享工程的只读/受限图层 |
popup |
点击/悬停弹窗设计(字段、顺序、格式、标题、宽度) | Style 面板的 Popup 分区 |
joins |
持久属性连接(左连接,物化列) | Layer properties → Joins |
virtualFields |
表达式驱动的虚拟字段 | Attribute Form / 字段管理 |
quickFilters |
数据驱动的快速过滤控件状态 | Layer properties → Quick filters |
filterExpression |
持久 MapLibre 布尔表达式过滤 | Select by Expression → Filter layer |
editorTracking |
创建/编辑者与时间字段自动填写 | 图层编辑器跟踪设置 |
fieldVisibility |
字段隐藏/排除;排除字段在导出与分享时被物理移除 | 属性表字段管理 |
attributeForm |
编辑控件、校验约束、条件可见性 | 属性表单设计器 |
descriptiveMetadata |
目录元数据(标题、摘要、关键词、许可、联系人、谱系、时态、链接),可导出 STAC Item | 图层 Metadata 对话框 |
connection |
可刷新图层的刷新节奏、上次同步时间、错误、失败策略 | WFS/GeoJSON URL/Add Vector Layer URL |
警告
capabilities是“图层声明的能力”,由应用在 UI 层执行,不是访问控制机制。真正的权限必须由数据库授权或服务端校验保证;不要把它当安全边界。
4.3.6 本地数据如何进入工程
| 数据 | 进入工程的方式 | 分享后的结果 |
|---|---|---|
| 本地小矢量(Add Data → Vector Layer) | 可能内嵌为 GeoJSON(受大小上限) | 随工程上传,接收方可直接看到 |
| 本地大矢量 | 只记录路径或转为查询图层 | 接收方看不到,需托管后改用 URL |
| 本地栅格(GeoTIFF/COG) | 记录路径;桌面可读 | 接收方看不到 |
| 本地 MBTiles | 记录路径;桌面协议读取 | 接收方看不到 |
| WMS/WFS/ArcGIS/远程文件 | 只记录 URL 与参数 | 接收方可加载(需网络与 CORS/凭据) |
4.4 插件状态
4.4.1 结构
plugins 记录“这个工程需要哪些插件、哪些处于激活、控件放在哪、插件自己的设置是什么”:
{
"manifestUrls": ["https://example.com/plugins/example-plugin/plugin.json"],
"activePluginIds": ["maplibre-layer-control", "maplibre-gl-swipe"],
"mapControlPositions": {
"maplibre-layer-control": "top-right",
"maplibre-gl-swipe": "top-left"
},
"settings": {
"maplibre-gl-swipe": {
"orientation": "vertical",
"position": 50,
"collapsed": false,
"active": true,
"leftLayers": ["layer-a"],
"rightLayers": ["layer-b"]
}
}
}
| 字段 | 说明 |
|---|---|
manifestUrls |
外部插件清单地址,受允许的 scheme/URL 校验 |
activePluginIds |
打开工程时要激活的插件 |
mapControlPositions |
地图控件位置(四角) |
settings |
插件自有设置;结构由插件决定 |
4.4.2 清单 URL 的安全限制
清单 URL 通过 isAllowedPluginManifestUrl 校验,只接受允许的协议与形式;工程里写一个 file:// 或非 HTTPS 地址不会被执行。外部插件本身仍属“受信任代码”,安装前应确认来源。
4.4.3 没有 plugins 的工程
省略 plugins 时,工程按内置默认插件状态打开。这也是旧工程能无缝打开的原因:新增插件字段是可选块,而不是迁移步骤。
4.5 图例、打印布局与故事地图
4.5.1 图例(legend)
打印布局的图例始终从可见图层的符号化自动派生;legend 只保存“用户编辑”,因此增删图层不会让定制失效:
{
"title": "Legend",
"groupByLayer": true,
"order": ["layer-b", "layer-a"],
"overrides": {
"layer-a": { "label": "Roads" },
"layer-b::0": { "label": "Low" },
"layer-b::1": { "hidden": true }
}
}
| 键 | 含义 |
|---|---|
title |
图例标题 |
groupByLayer |
分级/分类条目是否按图层分组显示 |
order |
顶层条目顺序(按图层 id,前者在上);未列出的图层排在后面 |
overrides |
逐项 label/hidden;键为图层 id(整条)或 layerId::index(单个分类,例如 layer-b::0) |
4.5.2 打印布局(printLayout)
打印布局属于工程,重开时恢复原样;从未打开过编辑器时不写这个键。核心字段:
{
"title": "Dentists by region",
"subtitle": "2026",
"paperSize": "a3",
"orientation": "portrait",
"pageMargin": "normal",
"showLegend": true,
"showScaleBar": true,
"showNorthArrow": true,
"showDataTable": true,
"tableLayerId": "layer-a",
"tableColumns": ["name", "count"],
"atlasEnabled": false
}
| 分组 | 字段 |
|---|---|
| 标题块 | title、subtitle、titlePlacement、titleAlign;空 title 跟随工程名,而不是冻结副本 |
| 页面 | paperSize(a4/a3/letter/legal/tabloid/fullhd/hd/uhd4k/square/custom)、orientation、customWidth/customHeight/customUnit、pageMargin、页面/图框颜色 |
| 元素 | 图例、比例尺、指北针、页脚、日期、归属信息、色带、自定义图例与信息块的 show* 开关及各自设置 |
| 数据块 | tableLayerId/chartLayerId 指向工程图层;图层缺失时块显示为空而不是整页空白 |
| 图集 | atlasEnabled 加覆盖图层、范围模式、排序、过滤与文件名模式 |
无法识别的值回退默认,因此手改文件不会把编辑器锁死。每会话状态(捕获的地图图像、当前图集页、对话框面板宽度)刻意不保存。
4.5.3 故事地图(storymap)
故事地图把工程变成滚动叙事。每章捕获一个相机视图与文字,并可让工程图层在进入/离开时淡入淡出;没有章节时整个键省略。
{
"title": "A Tour of Three Cities",
"theme": "dark",
"showMarkers": true,
"markerColor": "#3fb1ce",
"chapters": [
{
"id": "intro",
"title": "San Francisco",
"description": "A hilly city. <em>HTML allowed.</em>",
"alignment": "left",
"location": { "center": [-122.4194, 37.7749], "zoom": 11, "pitch": 45, "bearing": 0 },
"mapAnimation": "flyTo",
"onChapterEnter": [{ "layerId": "layer-a", "opacity": 1, "duration": 2000 }],
"onChapterExit": [{ "layerId": "layer-a", "opacity": 0 }]
}
]
}
alignment为left/center/right/full。mapAnimation为flyTo/easeTo/jumpTo。- 透明度变化引用工程图层 id;章节还可带图片、隐藏标记与旋转动画。
- 从 Project → Story Map… 构建与演示,或导出为自包含 HTML。
4.6 仪表盘、书签与交互
4.6.1 Dashboard 部件
widgets 把图表绑定到图层属性,dashboardColumns 控制网格列数(1–6,默认 2):
{
"widgets": [
{ "id": "w1", "layerId": "layer-a", "type": "histogram", "field": "pop", "bins": 12 },
{ "id": "w2", "layerId": "layer-a", "type": "bar", "category": "kind", "aggregation": "sum", "valueField": "pop" }
]
}
| 类型 | 关键字段 |
|---|---|
histogram |
field、bins |
scatter |
xField、yField |
bar / pie |
category、aggregation(bar 为 count/sum/mean;pie 仅 count/sum)、valueField |
line / box |
field |
indicator |
indicatorAggregation(count/sum/mean/min/max/median)、prefix、suffix |
selector |
category、multiple |
list |
listFields、sortBy、sortDir、limit |
color 可选,接受 #rgb/#rrggbb;无关键被忽略。部件绑定到 GeoJSON 矢量图层或 DuckDB 查询图层;绑定到缺失图层时显示为空。
4.6.2 书签
bookmarks 按面板顺序保存地图视图,bookmarkGroups 是可选的文件夹(不嵌套):
{
"bookmarkGroups": [{ "id": "hoods", "name": "Neighborhoods", "collapsed": false }],
"bookmarks": [
{
"id": "downtown",
"name": "Downtown",
"lng": -83.92,
"lat": 35.96,
"zoom": 14,
"pitch": 30,
"bearing": 340,
"createdAt": 1700000000000,
"groupId": "hoods",
"extra": { "visibleLayerIds": ["cities"] }
}
]
}
- 范围:
lng−180..180、lat−90..90、zoom0–24、pitch0–85,bearing归一到 0–360。 extra.visibleLayerIds记录打开该书签时要显示的图层,其余隐藏。- 相机缺失/越界或
id重复的书签在加载时被丢弃;指向不存在文件夹的groupId被丢弃。 - 工程最多保存 500 个书签(
MAX_PROJECT_BOOKMARKS)。
4.6.3 交互(interaction)
interaction 是“打开工程时应用的一次性状态”,由 Python 包从 set_identify 与 show_control/hide_control 写入:
{
"interaction": {
"identify": ["layer-a", "layer-b"],
"controls": { "search": true, "globe": false }
}
}
identify可为图层 id、all(所有可见可查询图层)、图层 id 数组,或null(关闭);不存在的 id 被跳过。controls的键可以是工具栏面板(bookmark、search、measure、minimap、print)或内置地图控件(navigation、fullscreen、compass、geolocate、globe、scale、attribution、logo);其他名字被忽略。- 应用保存工程时原样写回这个块;在界面里开关 Identify 或控件不会改它。这保证 Notebook 生成的工程在网页/桌面打开时保持作者设定的初始状态。
4.7 保存、另存、模板与副本
4.7.1 Save 与 Save As
- Save 写回工程已有的路径。
- Save As… 提示新名称与位置。
- 两者都会捕获保存瞬间的地图视图、底图、图层、样式、偏好与插件状态。
- 从 URL 打开的工程没有可写本地路径,Save 与 Save As 都退化为保存对话框。
- 浏览器构建里,Chromium 系浏览器使用浏览器保存对话框;否则要求输入文件名并下载到下载目录。
4.7.2 Duplicate project
Project → Duplicate project 把当前工程复制成一个新的未保存工程,适合在不影响原文件的前提下做分支实验。它是“另开一份”,不是“另存为同一份”。
4.7.3 模板
Project → Save as template… 把当前工程保存为个人模板库中的可复用模板,可填名称与描述。勾选 Strip data layers 后,模板保留底图、图层分组、样式、图例、部件与布局,但剥掉数据图层内容——适合作为团队“房屋风格”的起点。新建工程时,模板出现在底图库上方的 Saved Templates。
提示 模板库是应用级(IndexedDB)而不是工程级。它不会随工程分享,也不会进
.geolibre;需要在团队间共享时,用样式文件与图层文件代替。
4.7.4 打开方式与只读
Project → Open From 支持 File、URL、Gallery。从 URL 打开的工程默认没有本地写权限,适合查看与复制;Gallery 里的条目可以一键打开,也可以“打开副本”。桌面版还支持双击 .geolibre 或把工程拖到地图上切换工程(会保留未保存提示;坏文件报“工程错误”而不是“图层加载失败”)。
4.8 历史、快照与崩溃恢复
4.8.1 自动保存
GeoLibre 在你工作时自动保存快照:一次更改(加图层、改样式、移动相机)稳定约 3 秒后写入浏览器的 IndexedDB。
关键区别:
| 动作 | 写哪里 | 影响原文件吗 |
|---|---|---|
| 自动保存快照 | 本机 IndexedDB | 否 |
| Save / Save As | .geolibre 文件 |
是 |
| Share 上传 | 分享服务端 | 否(除非你另有副本) |
快照从不写 .geolibre 文件,只有 Save 会。
4.8.2 History
Project → History… 按从新到旧列出当前工程的快照,每条显示图层数与缩放级别:
- Restore 把快照载回工作区,作为可撤销的一步。
- 没有手动删除;快照达到上限后自动淘汰最旧的。
- 快照按工程分键(已保存工程用路径,未保存工程用名称),只存在生成它的设备上,不上传、不分享。
4.8.3 Compare 与单图层恢复
Compare 显示快照与当前工程(或两个快照之间)的差异,按可折叠分区组织:
- 新增/删除/重命名/重排/改样式的图层(含每个样式、标注、过滤与源设置的前后值,以及内嵌要素的增删改计数)。
- 相机、底图与投影。
- 插件。
- 工程标题、详情与偏好。
与“当前工程”比较时,Restore this layer 只恢复快照里的单个图层(包括把已删除的图层加回来),不动其他部分,并且可以撤销。恢复已删除图层会一并带回删除时被清掉的相关内容:Dashboard 部件、要素评论、图例顺序与覆盖、故事地图的透明度步骤、其他地图窗格中的可见性,以及引用了它的打印布局表格/图表/图集块;你在快照之后做过的其他修改保持不变。
4.8.4 上限
| 限制 | 值 |
|---|---|
| 每个工程的快照数 | 最多 20 |
| 单个快照大小 | 最多 10 MB |
| 全部快照总量 | 最多 50 MB |
| 自动保存触发 | 更改稳定后约 3 秒 |
超过单个快照上限的大工程不会被自动保存;达到总量后从最旧的开始淘汰。
4.8.5 崩溃恢复
在独立浏览器(非 iframe 嵌入)中,GeoLibre 会在工作时标记会话为打开状态。如果标签页/浏览器异常消失,且存在比上次显式保存更新的自动保存,下次启动会提供 Recover unsaved work?,可选择恢复或丢弃。
桌面版与嵌入部署保留 History 列表,但不弹这个恢复提示。
4.8.6 不进入工程的状态
以下状态只在本机,且通常不进 .geolibre:
- 面板宽度/折叠、对话框尺寸、滚动位置。
- 最近工程列表(localStorage)。
- 模板库、应用级 Style Manager、Layer Library(IndexedDB)。
- 自动保存快照(IndexedDB)。
- API key、token、S3 密钥(桌面进系统凭据库)。
- 插件安装记录(浏览器 IndexedDB;桌面在应用数据插件目录)。
4.9 导入 QGIS 与 ArcGIS Pro
4.9.1 QGIS 工程
Project → Import → Import QGIS Project… 读取 .qgs/.qgz,重建:
- 图层(文件型矢量 + 应用能打开的栅格)。
- 图层分组(含嵌套)、分组可见性、图层顺序。
- 样式与保存的地图视图。
导入器逐层报告而不是整单失败:不支持的提供者、不支持的文件格式、缺失源、网络共享路径、远程源都会被列出;同一原因的图层合并成一行并带数量,展开可看图层名。浏览器版无法重开本地磁盘路径,这类图层会被标为跳过;同样的工程在桌面版可加载。
4.9.2 ArcGIS Pro 工程
Project → Import → Import ArcGIS Pro Project… 读取 .aprx 或独立的 .mapx。它直接解析文件里的 CIM JSON,不需要安装 ArcGIS Pro 或 ArcPy。
一个 ArcGIS Pro 工程可能有多幅地图;GeoLibre 导入第一幅二维地图,保留:
- 保存的范围。
- 文件型要素图层与 GeoTIFF 栅格。
- 嵌套分组、可见性、简单符号、字段标注。
- ArcGIS 矢量瓦片门户项与缓存地图服务。
不支持的内容(File Geodatabase、场景、网络共享路径)会在其余部分导入后按原因分组列出。File GDB 图层会被明确标成该类,而不是笼统的“不支持格式”:桌面版可用 Add Data → File Geodatabase (GDB) 添加其要素类,而 .gdb 里的栅格需要先导出为 GeoTIFF。浏览器版无法重开本地数据路径。
4.9.3 跳过原因与处理
| 原因 | 处理 |
|---|---|
| 不支持的提供者/格式 | 在 QGIS/Pro 中导出为 GeoJSON/GeoPackage/GeoTIFF 后重新导入 |
| 缺失源 | 修复路径或先下载数据 |
| 网络共享路径 | 复制到本地或改用 URL 服务 |
| 远程源 | 改在 GeoLibre 中通过 Add Data 添加对应服务 |
| 浏览器无法读取本地路径 | 改用桌面版,或把数据托管为 URL |
| File Geodatabase | 桌面版用 GDB 导入;栅格先转 GeoTIFF |
4.9.4 迁移建议
- 先在 QGIS/Pro 里把不支持的图层“降级”为通用格式,再导入,报告会更干净。
- 样式优先用 QML/SLD 交换,而不是期待所有符号 1:1 还原;复杂标注需要手工重建。
- 导入后立即做一次 Share 就绪检查,能提前发现跨域、凭据与本地路径问题。
4.10 分享、脱敏与导出 HTML
4.10.1 Share 流程
Project → Share… 把当前工程上传到 share.geolibre.app(或部署配置的自托管服务),返回公开 URL。上传的文件就是本地保存的同一份工程,因此接收方看到的图层、样式与视图一致。
连接账号的三种方式:
| 宿主 | 方式 |
|---|---|
| Web | Share 对话框或 Settings 里 Sign in,弹窗到分享服务同意页;登录保持于浏览器会话 |
| 桌面 | 同样的同意页在系统浏览器打开并回到应用;登录保存在系统凭据库,重启后仍有效 |
| 移动/Notebook/兜底 | 在 share.geolibre.app/settings 创建个人 API token,填入 Settings → Environment Variables → Share.GeoLibre API token |
4.10.2 分享就绪检查
分享对话框打开时会检查工程引用的数据源,列出接收方可能加载不了的图层及原因:
| 提示 | 含义 | 处理 |
|---|---|---|
| 使用了分享时会被移除的凭据 | token/key 被剥离,接收方拿到 URL 但没有密钥 | 把服务改为公开,或让接收方自带 key |
| 浏览器无法访问该主机 | 主机没有 CORS 头或没有响应 | 同源部署,或改用桌面版打开 |
| 服务返回未找到 | 签名 URL 过期或文件移动 | 更新 URL |
| 指向私有或本地网络地址 | 内网服务只对同网段可达 | 确认接收方在同一网络,或改为公网地址 |
检查在浏览器内、且不带你的凭据执行,因此它看到的就是接收方看到的结果。它不会阻止上传——把内网地图分享给内网同事是正常需求,列表是提示而不是闸门。
4.10.3 本地数据警告
工程保存引用,不保存数据;share.geolibre.app 只存工程文件,从不上传你电脑上的文件。因此从本地 GeoTIFF、GeoPackage、Shapefile 等添加的图层,在你这里正常,在接收方那里“图层存在但画不出来”。没有 URL 的查询图层(PostGIS、DuckDB SQL、sidecar 结果)同理。
分享对话框会把这些列在 N layers will be missing from the shared map 下,按钮变成 Share anyway。要真正包含它们:
- 托管数据:栅格转 COG,矢量转 PMTiles 或 GeoParquet,放到公开 HTTPS(GitHub、Hugging Face、对象存储),再用 URL 添加。
- 让小矢量随工程走:通过 Add Data → Vector Layer 添加的本地矢量会自动内嵌到上传中,因此不会出现在缺失列表;但每条要素都会在打开工程时解析,大数据仍应托管。
- 私有网络地址不算“本地文件”,它会留在较软的就绪检查列表里,而不是这条硬警告里。
警告 即使不点 Share,手动把保存的
.geolibre上传到分享站点也会发生同样的图层缺失。对话框在配置 token 之前就会警告,正是为了避免这种“静默丢图层”。
4.10.4 凭据脱敏
任何离开本地工作区的工程都必须先通过 redactCredentials(project)。GeoLibre 把这条不变量应用于:
- Share 上传。
- 单文件 HTML 导出。
- 嵌入快照。
- 协作快照。
规则要点:
- 图层
source.requestHeaders可以引用环境变量,例如Authorization: Bearer 变量引用;引用按原样保存,请求时从启用的环境变量行解析;变量未设置或为空时该头不发送。只有“可选 scheme 词 + 一个引用”的值能通过脱敏,其他头值被移除。 preferences.environmentVariables的每一行默认视为 secret:脱敏会移除;桌面版在名字唯一且非空时把值存进系统凭据库。- 标记
secret: false的行是普通值,会留在文件里,并随 Share 与导出保留。 - 脱敏还会移除 URL 中的认证参数;外部插件设置默认不进入分享快照,接收方保留清单与激活信息,但需要自行配置设置。
4.10.5 导出 HTML
Project → Export → Export as HTML… 把整个工程写成单个独立 HTML 文件,可在无服务器、离线状态下打开。它适合:
- 交付给不想安装任何东西的客户。
- 放到静态站点或 U 盘。
- 归档一个“可交互的快照”。
注意它同样经过脱敏:凭据不会写进 HTML,依赖凭据的图层会像分享一样失效;本地路径图层也不会自动带上数据。
4.11 样式文件、图层文件与图层库
4.11.1 样式文件
- Project → Export → Export Layer Styles… 把每个图层的样式写成一个 JSON,按图层名索引。
- Project → Import → Import Layer Styles… 应用到当前工程,名称匹配的图层在一个可撤销步骤里重设样式,并报告没有匹配上的样式。
- Settings → Startup → Default layer styles 选择样式文件后,每个新加入且名称匹配的图层会自动套用;已打开工程里的图层保留自己的样式。
- GeoLibre 会保存该文件的副本,编辑原文件后需要重新选择。
4.11.2 图层文件
- Project → Export → Export Layers… 写出
"type": "geolibre-layers"的 JSON,供 Settings → Startup → Default layers 使用,让每个新建工程自动带上这些图层。 - 每个图层保留样式、标注、可见性、透明度与文件夹,但数据只保存引用:瓦片/服务 URL、远程文件 URL,或桌面可重读的本地路径。
- 要素不会被内嵌,因此“只存在于工程中的要素”(手绘、处理结果、浏览器打开的文件)会被跳过,GeoLibre 会列出被跳过的图层。
- 导出时移除 API key 与 token,与分享一致。
4.11.3 Layer Library
Layer Library 是“完整配置好的图层”库,入口在 Browser 面板的 My Data:
- 保存源、样式、标注、过滤、连接、虚拟字段与属性表单。
- 一键加入任何后续工程;可改名、删除,导出/导入 JSON 包。
- 保存的是源规格而不是数据,因此 COG、PostGIS 表、远程 GeoParquet 总是反映源的当前内容;纯内存或本地文件的图层会在大小上限内内嵌要素。
- 与“图层文件”的区别:图层文件是启动时批量注入的模板,Layer Library 是手动挑选的可复用条目。
4.11.4 三者对照
| 机制 | 存储位置 | 作用范围 | 含数据吗 |
|---|---|---|---|
| 样式文件 | 你选择的 .json |
按图层名批量套样式 | 否 |
| 图层文件 | 你选择的 .json(geolibre-layers) |
每个新工程的默认图层 | 否(仅引用) |
| Layer Library | IndexedDB(应用级) | 手动加入任意工程 | 仅小数据内嵌 |
4.12 设置分页逐项说明
4.12.1 总览
Settings 菜单打开一个多分页对话框:
| 分页 | 管什么 |
|---|---|
| Language | 界面语言、Whitebox 语言包 |
| Map | 导航限制、天体、比例尺单位、坐标格式、地图 CRS |
| Layout | 面板与工具栏标签可见性 |
| Appearance | 浅色/深色、强调色 |
| Interface | 体验级别、数据源/插件/菜单开关、界面文件 |
| Geocoding | 地址搜索 Provider、key、端点、Locator |
| AI Providers | AI 助手的模型与凭据 profile |
| Environment | 分享账号/token、运行时环境变量 |
| Cloud Storage | S3 连接与 S3 Browser 默认位置 |
| Updates | 更新检查(仅桌面) |
| Startup | 启动工程、默认视图、默认图层/样式 |
| Style Manager | 个人符号预设库 |
| Manage Plugins | 插件市场 |
4.12.2 Language
- Interface language 以各自文字显示,并附英文名;从右到左语言会镜像整个布局。
- Whitebox language packs 单独管理:Download pack 下载所选语言官方包,Import file 安装本地包,Remove pack 回到英文。语言包只存在当前设备;下载只发送 locale 代码,不发送工程数据。禁用下载的构建只提供 Import file。
4.12.3 Map Preferences
| 设置 | 说明 |
|---|---|
| Restrict map bounds / Bounds | 限制平移范围(西、南、东、北) |
| Min zoom / Max zoom | 允许缩放范围 0–24 |
| Max pitch | 最大俯仰 0–85 度 |
| Render world copies | 缩小时是否重复世界副本 |
| Celestial body | 决定距离/面积/比例尺测量的天体半径 |
| Map coordinate reference system | 用另一种 CRS 平铺绘制 MapLibre 地图(极地立体、Plate Carrée、行星网格或自定义 EPSG) |
| Scale bar units | Metric / Imperial / Nautical,同时影响 Elev、Eye alt 与快速分析缓冲预设 |
| Coordinate format | 十进制度、DMS、DDM、UTM、MGRS、USNG、投影坐标(选投影时出现 EPSG 字段) |
Use Current View 用当前地图设置边界,Reset 恢复默认。这些偏好随工程保存。
提示 在地球投影下 Use Current View 捕获的边界可能略有漂移,对话框会提示。需要严格边界时先切到 Mercator。
4.12.4 Layout 与 Appearance
- Layout:Show toolbar labels、Show project info、四个面板的显示开关(Layers、Style、Browser、Comments)。
- Appearance:Mode(Light/Dark)与 Accent color(Blue、Violet、Emerald、Rose、Amber、Custom)。
- 小屏上面板会自动隐藏,这是响应式行为,不受 Layout 开关限制。
4.12.5 Interface
- Experience level:Beginner / Intermediate / Advanced,下面可逐项开关 Data sources、Plugins、Menus(含菜单内条目)。改动任一开关会切到 Custom;Reset 恢复默认。
- 管理员管理 profile 时,此页只读;Help 与 Settings 的入口永远保留。
- Interface file:Export… 写出语言、面板布局、强调主题与 profile;Import… 应用本地文件;Import from URL 从 http(s) 地址加载(服务需允许跨域)。只改文件里包含的设置,文件不含凭据、插件来源或本地路径,也不会锁 profile。
4.12.6 Geocoding
- Provider:Nominatim 为默认且无需 key;需要 key 的 Provider 在此填 API key。
- Forward endpoint / Reverse endpoint:可改到自托管实例。
- Contact email:Nominatim 要求。
- 使用 ArcGIS GeocodeServer (organization) 时,端点字段变为命名 Locators 列表,每项含服务 URL、可选门户与 Check service。
- key 存储在系统钥匙串(可用时),否则进工程文件;它们以查询参数发送,会出现在请求 URL 里。
4.12.7 AI Providers
- 每个配置是一个命名 profile(如 Work Gemini、Local Ollama):选 Provider、填字段、Save profile。
- 标记一个 Set as default,助手打开时使用;配置一个即可开始聊天。
- 凭据保存在当前设备,绝不进工程文件;有系统钥匙串时 secret 字段进钥匙串。
- 桌面版空白 key 字段会回退到匹配的操作系统环境变量;界面里填的值优先。
- Provider 列表与字段见第18章。
4.12.8 Environment Variables
- Share.GeoLibre account:登录/登出分享服务(网页弹窗;桌面系统浏览器)。
- Share.GeoLibre API token:个人 token,作为分享的兜底(移动端、Notebook 嵌入等)。
- Environment variables:命名键值对(Earth Engine、Street View 等集成),可逐条启用/禁用,secret 值掩码。变量名必须以字母或下划线开头,只含字母、数字与下划线。
- 桌面版 AI 助手还会读取允许列表中的系统环境变量(如
OPENAI_API_KEY),界面值优先。
提示 运行时环境变量是“个人/临时”层:不需要重建即可生效。要固化到自托管部署,用构建期环境变量或部署的
deployment.json,而不是让每个用户手填。
4.12.9 Cloud Storage
Settings → Cloud Storage 保存 S3(及 S3 兼容)连接:访问密钥、AWS profile(含 SSO)、环境变量与 IAM 角色;并设置 S3 Browser 的默认位置。私有桶的密钥部分在桌面版进系统凭据库。
4.12.10 Startup
| 选项 | 行为 |
|---|---|
| Open the default workspace(默认) | 新建未命名工程 |
| Reopen the last project | 打开最近使用的本地工程 |
| Open a specific project | 总是打开选定的本地工程;未选择前该模式不可用 |
| Enable 3D globe by default | 空工作区以三维地球还是 Mercator 打开 |
| Default map view | 空工作区的中心经纬度与缩放;Use Current View 复制当前视图 |
| Open the S3 Browser at startup | 启动时显示 S3 Browser |
| Default layer styles | 选择图层样式文件,新加入的匹配图层自动套用 |
| Default layers | 选择图层文件,注入每个新的未命名工程 |
限制与细节:
- 只有本地工程会被恢复;分享链接按
https://URL 记入最近列表,但启动恢复会跳过远程条目。 - 地址栏里的工程/
?data=参数总是优先,启动恢复被跳过。 - 启动工程被移动或删除时,GeoLibre 打开默认工作区、用横幅说明,并从最近列表移除该文件。
- 浏览器构建只有空工作区投影选项,三个工程恢复模式仅桌面可见。
- Android 会把启动工程复制到应用私有存储后重开(系统给的文件引用在进程结束后失效);在别处编辑过的内容需要重新从 Project → Open From → File… 打开。
4.12.11 Updates、Style Manager 与 Manage Plugins
- Updates(桌面):是否在启动时检查新版本、哪些发布类型提醒;完全离线工作流可关闭检查。
- Style Manager:个人符号/色带/标注预设库,可跨工程应用;也可从图层菜单 Layer actions → Styles → Saved styles (Style Manager)… 进入。工程级条目另存于
styleLibrary。 - Manage Plugins:插件市场(安装、更新、移除、源管理),详见第21章。
4.13 本地存储、凭据与备份
4.13.1 存储分层
| 数据 | 位置 | 是否随工程 |
|---|---|---|
| 工程内容 | .geolibre 文件 |
是 |
| 设备设置(语言、布局、主题、profile) | localStorage(网页与桌面 WebView) | 否 |
| 最近工程 | localStorage | 否 |
| 自动保存快照 | IndexedDB | 否 |
| 模板库、应用级 Style Manager、Layer Library | IndexedDB | 否 |
| 浏览器安装的插件包 | IndexedDB | 否 |
| 桌面插件包 | 应用数据插件目录 | 否 |
| 凭据(token、API key、S3 secret) | 桌面系统凭据库;网页/移动/Jupyter 为 localStorage | 否 |
| 会话级 UI 状态(临时选择、未提交输入、打开的面板) | 内存 | 否 |
4.13.2 凭据去哪
- 桌面(Tauri)通过
secure_store_*命令把每个凭据写进系统凭据库:macOS Keychain、Windows Credential Manager、Linux Secret Service。 - 网页、Jupyter 嵌入与移动端没有系统凭据库,只能放 localStorage;这意味着同源脚本(包括你安装的插件)可以读取。
- 凭据读取在桌面版每次页面加载只允许一次,之后会“封印”,防止后加载的插件读取已保存 token。
- 写入失败不会回退到明文:界面会提示,失败的值只在本会话内存中可用。
警告 不要把敏感值写进会分享的工程。即使暂时保存在本地,Share/HTML 导出/协作快照都会走脱敏;但“本地工程文件”本身仍可能含未脱敏的凭据,尤其是你在网页版手动保存的工程。
4.13.3 脱敏边界
| 出口 | 是否脱敏 |
|---|---|
| Share 上传 | 是 |
| Export as HTML | 是 |
| 嵌入快照 | 是 |
| 协作快照 | 是 |
| 本地 Save / Save As | 默认保留(桌面可把可存凭据移入钥匙串) |
| 图层样式文件 / 图层文件 | 样式文件本身不含凭据;图层文件在导出时移除 API key 与 token |
| 模板 | 不含数据图层时也不含其凭据 |
重复或匿名的 secret 环境变量行无法以唯一账户存入钥匙串,因此本地保存/另存会提供与“钥匙串不可用”时相同的保留/剥离选择。
4.13.4 备份与迁移
- 备份工程:复制
.geolibre文件即可;数据在外部,备份时要一并备份本地数据文件或记录远程 URL。 - 迁移设置:用 Settings → Interface → Export… 带走语言、布局、主题与 profile;AI/S3/分享凭据需要在新设备重新配置(或在桌面凭据库中手动迁移)。
- 迁移插件:桌面插件在应用数据目录,网页插件在 IndexedDB;跨设备最稳妥的方式是从市场重新安装。
- 不要备份 IndexedDB 快照当作长期版本控制;需要版本历史时把工程放进 Git,或用导出的 HTML/PDF 作为发布快照。
4.14 本章小结
- 工程以
.geolibre保存,仍可打开.geolibre.json;文件管理器关联只对.geolibre生效。 - 工程是引用式的:保存视图、图层源、样式与状态,默认不保存远程数据与凭据。
- 顶层字段覆盖视图、图层、偏好、插件、图例、打印、故事地图、部件、书签、交互与元数据;缺字段有规范化默认,但
version/name/mapView必需。 - 图层对象除基础字段外,还可带能力、弹窗、连接、虚拟字段、快速过滤、表达式过滤、编辑跟踪与目录元数据。
- 自动保存写 IndexedDB(3 秒去抖,20 个/10 MB/50 MB 上限),只有 Save 写工程文件;崩溃恢复仅在独立浏览器中提示。
- QGIS/ArcGIS Pro 导入逐层报告跳过原因;File GDB、场景与网络路径需要替代方案。
- Share 有就绪检查与本地数据警告;所有离开本地的出口都经过
redactCredentials。 - 设置分页覆盖语言、地图、布局、外观、界面、地理编码、AI、环境变量、云存储、更新、启动、样式管理与插件。
- 设备级状态与凭据不进工程;桌面凭据在系统凭据库,网页在 localStorage,这是必须知道的信任差异。
4.15 实践练习
- 读工程:新建一个工程,加入一个图层并改样式,保存后用文本编辑器打开,找出
layers、styles、mapView与preferences四个块,记录它们的最小结构。 - 手改验证:把
mapView.zoom改成一个越界值(如 99),重新打开,观察应用如何规范化;再把selectedLayerId改成不存在的 id,确认不会报错。 - 快照恢复:连续做三次修改(加图层、改样式、移动相机),打开 History 比较两个快照,用 Restore this layer 恢复单个图层,再用撤销回退。
- 分享检查:添加一个本地 GeoTIFF 与一个远程 GeoJSON,打开 Share 对话框,记录就绪检查与本地数据警告分别列了什么。
- 脱敏审计:在 Environment 里添加一个 secret 变量与一个
secret: false变量,导出 HTML,用文本搜索确认哪个值被剥离、哪个保留。 - 迁移设置:导出界面文件,在另一浏览器 profile 导入,列出被带过去与未被带过去的设置,并解释原因。