第26章 - 实战案例与综合应用

前 25 章分别讲了界面、数据、样式、分析、自动化、部署与排障。真实的 GIS 工作却从来不是按功能目录组织的:一个「洪灾快速制图」任务会同时用到影像检索、COG 渲染、图层混合、故事地图与分享。本章用十个端到端案例把这些零件串起来,再补上迁移、教学与团队协作三个常见场景,最后给出学习路径与能力自评表。

每个案例的结构统一为:目标 → 数据 → 步骤 → 结果 → 扩展。步骤里的菜单路径、参数名保留英文原文,方便与界面和官方文档对照。案例中的公开数据集 URL 均可直接打开;涉及账号与密钥的步骤会单独标注。

提示:不必按顺序做完全部案例。26.1 节给出了一张「按目标选案例」的索引,先挑与你工作最接近的那个。


26.1 案例方法与通用准备

26.1.1 按目标选案例

你的目标 建议案例 主要能力
做一张能发出去的专题图 案例一 数据加载、分级设色、图例、排版导出
数据太大、加载太慢 案例二 GeoParquet / FlatGeobuf / COG / PMTiles
做三维城市或时间动画 案例三 3D extrusion、Time Slider
讲月球/火星的故事 案例四 行星底图、椭球、测量
灾害发生后几小时内出图 案例五 事件影像、COG、Layer Swipe
做选址或覆盖分析 案例六 SQL、Processing、Model Builder
做地形与流域 案例七 DEM、Hillshade/Slope/Contour、Whitebox
把重复流程自动化 案例八 AI 助手、Model Builder、Python 导出
发布与嵌入网页 案例九 Share、embed、Story Map
私有化部署团队平台 案例十 项目服务、GeoLens、同源部署

26.1.2 通用准备

  1. 确定构建形态。浏览器构建(web.geolibre.app 或自托管)能完成绝大多数案例;本地文件对话框、本地 MBTiles、本地栅格读取、工程保存/打开需要桌面端;sidecar 独占的工具有明确提示。
  2. 准备一个工作目录(桌面端)或记下浏览器的下载目录,案例里会反复导出文件。
  3. 关键节点保存工程。用 Project → Save 存 .geolibre.json,重要分支另存一份。
  4. 记住两个入口:命令面板(Ctrl/Cmd + K)能搜到几乎所有命令;Help → Diagnostics 是出问题时的第一站。

26.1.3 案例中反复出现的样例数据

数据 URL / 入口 用途
Natural Earth 国家(GeoParquet) https://data.source.coop/giswqs/opengeos/countries.parquet 案例一、六、八
Natural Earth 面板 Plugins → Web Services → Natural Earth 需要别的 Natural Earth 主题时
USGS 3DEP DEM Plugins → Web Services → USGS 3DEP 案例七
Vantor 灾害影像 Plugins → Web Services → Vantor Open Data 案例五
STAC 目录 Plugins → Web Services → STAC Catalogs 案例二、五

26.2 案例一:第一张专题地图

26.2.1 目标与数据

项 内容
目标 用国家边界做一张按 GDP 分级设色的专题图,带图例、比例尺与标题,导出 PNG/PDF
数据 https://data.source.coop/giswqs/opengeos/countries.parquet(字段含 NAME、CONTINENT、POP_EST、GDP_MD_EST,几何列 geom)
前置 无;浏览器构建即可
预计 10–15 分钟

26.2.2 步骤

  1. 加数据:Add Data → Vector Layer,粘贴上面的 URL,点 Load。图层列表出现 countries。
  2. 先看数据再定样式:打开 Attribute table,选中该图层,点 Explore 查看每个字段的类型、完整度与分布;确认 GDP_MD_EST 有足够非空值。
  3. 分级设色:展开右侧 Style 面板:
    • Style type 设为 Graduated;
    • Attribute 选 GDP_MD_EST;
    • 设置 Classes(5–7 类通常够用);
    • 选一个 Scheme(分级方法)与 Colormap;
    • 点 Apply style type。
  4. 调细节:在 Style 面板里改描边颜色与不透明度,让相邻国家有清晰边界;必要时打开标签。
  5. 看图例:图例由图层符号系统自动生成(见第 07 章)。检查分级区间与颜色是否一一对应,必要时改分级方法。
  6. 排版导出:Project → Print Layout…:
    • Size 选 A4,Orientation 选 Landscape;
    • 勾选 Legend、Scale bar、North arrow,必要时加 Date 与 Footer text;
    • 在 Scale (1:N) 里输入比例尺或从 Presets… 选;
    • 用 Draw extent on map 框定出图范围(按住 Shift 匹配页面比例);
    • 导出 PNG、PDF 或 SVG。

26.2.3 结果

一张带标题、图例、比例尺、指北针的专题图;工程保存后含图层、样式、地图视图与排版设置。同一份工程可以通过 Project → Share 发布(见案例九)。

26.2.4 扩展

  • 换成 Categorized 按 CONTINENT 上色,对比「分级」与「分类」的适用场景。
  • 用 Attribute table → Statistics 检查分级断点是否被极端值拉偏。
  • 把图例改成 Custom legend,删掉不需要的条目。
  • 试 Atlas(一页一个要素)批量出图。

26.3 案例二:云原生数据链路

26.3.1 目标与数据

项 内容
目标 同一份数据分别以 GeoParquet、FlatGeobuf、PMTiles、COG 提供,比较加载方式与体感,并完成一次本地转换
数据 案例一的国家 GeoParquet;一份本地 GeoJSON 或 Shapefile;一份本地 GeoTIFF
前置 转换到 PMTiles/COG 在桌面端更完整;浏览器可用 WASM 引擎
预计 20 分钟

26.3.2 步骤

  1. 流式读 GeoParquet:Add Data → GeoParquet Layer,粘贴 URL,勾选 Stream GeoParquet (no copy) 再 Load。该选项用 HTTP range 请求就地查询,不把文件整体复制进内存;对按空间排序(例如 Hilbert 序)写出的文件效果最好,因为只需取相关 row group。
  2. 读 FlatGeobuf:Add Data → FlatGeobuf Layer,填一个 .fgb URL。格式自带空间索引,只取视野内要素。
  3. 读 COG:Add Data → Raster Layer,填一个 COG(.tif)URL。加载后可在 Style 面板调亮度、对比度、饱和度与色相。
  4. 转换本地数据:Processing → GeoLibre Toolbox → Conversion:
    • Vector to GeoParquet:浏览器端走 DuckDB-WASM,输出按 Hilbert 排序;
    • CSV to GeoParquet:需要经纬度列;
    • Vector to FlatGeobuf、Vector to PMTiles:浏览器端走 WebAssembly;
    • Raster to COG:浏览器端只读 GeoTIFF,桌面端 sidecar 支持更多输入格式。
  5. 验证:把转换产物重新加载回地图,与原始图层叠加对比,确认要素数、属性列与几何范围一致。
  6. 在 SQL 里直接读:打开 SQL 工作区,对远程 parquet 跑 SELECT COUNT(*) FROM https://…,观察它没有先全量下载。

26.3.3 结果

工程里同时存在四种云原生图层;每个图层只持有 URL 与样式,工程文件体积很小。这就是「大工程」的正确打开方式(对照第 25 章)。

26.3.4 扩展

  • 用 Vector to PMTiles 给自己的一张底图做瓦片归档,再在 Basemaps 插件里用 custom style 引用。
  • 比较同一数据在 GeoJSON 与 FlatGeobuf 下的首屏时间与内存占用。
  • 把转换步骤放进 Model Builder,做成可复用的「发布前处理」模型。

26.4 案例三:城市建筑 3D 与时间滑块

26.4.1 目标与数据

项 内容
目标 把曼哈顿建筑轮廓按真实高度挤出成 3D,按建造年代着色,并用时间滑块从 1850 播到 2025
数据 NYC Open Data 的建筑轮廓(含高度与建造年份字段)、MTA 地铁线路与站点
参考 官方示例工程 https://share.geolibre.app/giswqs/manhattan-buildings-through-time
前置 建筑数据量较大,建议先按案例二转成 FlatGeobuf 或 PMTiles
预计 30–40 分钟

26.4.2 步骤

  1. 取数据:从 NYC Open Data 下载建筑轮廓(GeoJSON 或 Shapefile),或用 Plugins → Web Services → Socrata 搜 NYC 的开放数据门户直接加载。地铁线路与站点可从 MTA 的开放数据获取。
  2. 减轻负担:数据量大时先用 Conversion 把建筑转成 FlatGeobuf/PMTiles,并只保留 height、construction_year 等必要字段(属性裁剪,见 25.7.3)。
  3. 3D 挤出:选中建筑图层,在 Style 面板打开 3D extrusion,把高度绑定到高度字段,用高度缩放系数校准单位(米/英尺)。MapLibre 侧对应 fill-extrusion,Cesium 与 ArcGIS 场景各有实现。
  4. 按年代着色:把 Style type 设为 Graduated(或 Categorized 按年代分组),属性选建造年份,选一个从暖到冷的顺序色带,让「老建筑」与「新建筑」视觉可分。
  5. 绑定时间滑块:在图层动作里选 Bind to Time Slider…,字段选建造年份;然后在 Plugins 菜单启用 Time Slider(插件 id time-slider),时间轴会以该字段驱动要素过滤。把范围设成 1850–2025,逐步推进即可看到城市「逐年长出来」。
  6. 叠加地铁:把 MTA 线路作为线图层、站点作为点图层加在上面,调整不透明度与层级,确保 3D 建筑不会遮住地铁。
  7. 相机与图例:固定一个俯视微倾的相机位置(时间动画期间不要移动相机,让数据动而镜头不动),确认自动图例反映了年代分级。
  8. 保存与分享:保存工程;如需公网演示,按案例九分享,并在链接里用 maponly 或 layout=viewer 控制界面。

26.4.3 结果

一个可交互的 3D 城市:建筑按真实高度挤出、按年代着色,时间滑块从 1850 到 2025 推进时城市逐代填充;地铁网络叠加其上,图例自动生成。

26.4.4 扩展

  • 把 3D 挤出图层导出为 glTF/OBJ/STL,进入建模或 3D 打印流程。
  • 用 Layer Swipe 对比两个年代的城市形态。
  • 换 Cesium 引擎看同一份数据在地球曲率下的效果,比较性能差异。

26.5 案例四:行星底图与测量

26.5.1 目标与数据

项 内容
目标 在月球或火星底图上量距离与面积,确认结果按该天体的椭球计算
数据 OpenPlanetaryMap 与 USGS Astrogeology 提供的行星底图(已内置)
覆盖天体 月球、火星、水星、金星、伽利略卫星(Io、Europa、Ganymede、Callisto)、Titan、Pluto、Charon
前置 无;浏览器构建即可
预计 15 分钟

26.5.2 步骤

  1. 选天体:新建工程时 New project 对话框的底图会按天体分组(The Moon、Mars 等);已有工程则用 Layers 面板头部的行星切换器(轨道图标)直接换。
  2. 确认椭球:切换天体时会把工程的 ellipsoid 一起设置,距离、面积与比例尺都按该天体计算。也可以在 Settings → Celestial body 里核对。
  3. 加一层业务数据:例如着陆点、撞击坑编目或你自己的巡视路线(Add Data → Vector Layer)。数据需要是经纬度坐标系,底图由瓦片 Worker 重投影到 Web Mercator。
  4. 测量:打开 Controls 里的测量工具(距离/面积),在地图上点选。注意 Eye alt 会按当前天体缩放,所以「视点高度」不会被报成地球高度。
  5. 看比例尺与坐标:状态栏的坐标读数与比例尺都跟随当前投影与椭球;截图或出图前确认单位。
  6. 氛围(可选):在 Plugins 菜单启用 Atmospheric Effects,给地球/行星加星场背景。
  7. 保存:工程保存后,天体与椭球随工程一起持久化。

26.5.3 结果

一张月球或火星地图,测量值以该天体半径为准;同一段线在地球与火星上会得到不同的公里数——这正是本案例要验证的点。

26.5.4 扩展

  • 在同一工程里切换天体,记录同一段线的距离差异,并用手算(球面距离公式)核对。
  • 用 View → Rendering engine 切到 Cesium,比较 2D 与 3D 地球/行星视图下的操作差异。
  • 在 Settings → Map coordinate reference system 里试极地立体投影或 Plate Carrée,观察形状变化。

注意:行星底图来自不同机构,命名与分辨率不一致;发表前要核对数据来源与许可(USGS、NASA/JPL、OpenPlanetaryMap 各有署名要求)。


26.6 案例五:洪灾与灾害影像快速制图

26.6.1 目标与数据

项 内容
目标 在灾后数小时内做出「灾前 / 灾后」对比图,标出淹没范围并发布链接
数据 Vantor Open Data 的事件影像(COG);Planet Open Data 的灾害发布;OpenAerialMap 的无人机影像;必要时 NASA OPERA DSWx-S1 水体制图产品
参考 官方视频《Mapping the 2026 Nepal Floods with Free High-Resolution Satellite Imagery》的思路
前置 建议桌面端(下载与本地缓存更方便),浏览器也能完成
预计 30–45 分钟

26.6.2 步骤

  1. 锁定事件与范围:打开 Plugins → Web Services → Vantor Open Data,先按 event 过滤,再按 phase 区分 pre-event 与 post-event。搜索范围限制在当前视图或用 bounding box drawn on the map 画框。
  2. 预览足迹:结果足迹会画在地图上并在悬停时高亮,先确认云量、覆盖与拍摄时间符合需求。
  3. 选渲染引擎:添加 COG 前先决定 COG rendering engine:
    • GPU(deck.gl):交互流畅,适合快速浏览;
    • WebAssembly tiler:本地解码,保真度高;
    • TiTiler 服务器:把解码放到服务端,适合大范围或弱客户端。 这个选择是全局的,会影响地图上所有栅格。
  4. 加载两期影像:先加 pre-event,再加 post-event;把它们放在同一底图之上,调整不透明度。
  5. 对比:在 Plugins 菜单启用 Layer Swipe(插件 id swipe),选两个图层作为左右两侧,拖动滑杆对比。对城市内涝,这一步比任何配色都直观。
  6. 标出范围:如果有淹没范围矢量(例如 OPERA DSWx 产品导出的 GeoJSON),作为半透明面图层叠加,并用 Style 面板做斜线填充或高对比描边。
  7. 加参照物:用 OSM Downloader 拉取同范围的建筑与道路(注意 Overpass 的查询面积限制:全部要素 0.25 平方度、过滤查询 4 平方度),评估受影响对象。
  8. 出图与发布:Project → Print Layout… 出 PNG/PDF,或 Project → Share 得到链接后用 layout=viewer 嵌入新闻页;需要叙事就用 Project → Story Map(见案例九)。
  9. 记录来源:在工程描述或故事地图页脚写清影像来源、日期与许可——灾害图被转载时,署名是最容易被丢掉的部分。

26.6.3 结果

一张带滑杆对比的灾前/灾后地图,附淹没范围与参照物,可在浏览器里打开或嵌入网页。

26.6.4 扩展

  • 用 NASA Earthdata 面板叠加同期降水或云图,解释致灾过程。
  • 用 Time Slider 播多期影像,观察退水过程。
  • 把「取事件影像 → 加图层 → 出图」写进 Model Builder 或 Python 脚本,下次同类事件直接复用。

26.7 案例六:选址分析(SQL + Processing + Model Builder)

26.7.1 目标与数据

项 内容
目标 找出「距主干道 500 米内、且在洪水风险区外、人口密度达标」的候选地块,并输出带属性的结果图层
数据 道路线、行政区/地块面、洪水风险面、人口统计表(可先用国家样例数据练手)
前置 需要理解坐标单位:缓冲距离在 EPSG:4326 上是度,不是米
预计 40 分钟

26.7.2 步骤(Processing 路线)

  1. 投影感知的缓冲:Processing → GeoLibre Toolbox → Vector → Buffer,输入道路图层,Distance 设 500,Units 选 meters,Engine 选 Sidecar (GeoPandas)(桌面端)或 Python (Pyodide)(浏览器端)。客户端 Turf.js 引擎在经纬度上按度计算,大范围会失真。
  2. 裁剪:用 Clip 保留缓冲区内的地块,属性保留输入侧。
  3. 擦除风险区:用 Difference 从候选地块中减去洪水风险面。
  4. 挂接属性:用 Spatial join 把行政区属性附加到地块(关系选 within 或 intersects),再用 Attribute join 按行政区代码把人口统计表接上(一对一,可指定要带过来的字段、inner/left join)。
  5. 检查:打开 Attribute table 看结果字段是否齐全,用 Statistics 抽查面积与人口分布。
  6. 导出:Processing → GeoLibre Toolbox → Conversion → Vector to GeoParquet,或从属性表导出 CSV。

26.7.3 步骤(SQL 路线,可对照验证)

同样的逻辑可以在 SQL 工作区一次写完,便于复查与版本化:

-- 1) 缓冲区(示例:经纬度数据,0.005 度约 500 米,实际请先投影)
CREATE TABLE road_buffer AS
SELECT ST_Union(ST_Buffer(geom, 0.005)) AS geom FROM roads;

-- 2) 与地块相交,并排除洪水区
SELECT p.id, p.population, ST_Area_Spheroid(ST_FlipCoordinates(p.geom)) / 1e6 AS area_km2
FROM parcels p, road_buffer b
WHERE ST_Intersects(p.geom, b.geom)
  AND NOT EXISTS (SELECT 1 FROM flood_zones f WHERE ST_Intersects(p.geom, f.geom));

提示:SQL 结果返回几何列时可以直接 Add as layer,再用属性表核对与 Processing 路线的差异。两条路线结果不一致,通常是投影或拓扑容差造成的。

26.7.4 步骤(Model Builder 固化)

  1. Processing → Model Builder,把上面的步骤画成图:
    • + Input 两个输入节点(道路、地块);
    • 从左侧工具面板拖 Buffer、Clip、Difference、Spatial join;
    • 用输出端口连到下一个工具的输入端口(端口有数据类型,矢量与栅格不能互连);
    • + Output 指定结果图层名。
  2. 看校验:画布会实时列出每个节点的问题(未选输入图层、端口未连接、端口类型不符、模型成环、缺少输出节点等)。Run 在所有问题清除前是禁用的。
  3. 运行:Run 按依赖顺序执行,节点卡片显示运行/完成/失败,底部日志显示每个工具的消息;失败会在第一个出错节点停下。
  4. 保存与复用:Save 把模型存进工程;Export 导出 .model.json 供同事导入(导入上限 16 MB、2,000 节点、4,000 连接)。
  5. 导出 Python:模型成功运行后,Copy Python script 可复制等价的 geolibre Python 代码(见第 19 章),便于放进 Notebook 或定时任务。

26.7.5 结果

一个带面积、人口与道路距离属性的候选地块图层;同一逻辑有三种落地形式:交互工具、SQL、可复用模型。

26.7.6 扩展

  • 把「候选点」换成「设施点」,用 Drive time / Walk time 快速分析(需要配置 Valhalla 端点)评估可达性。
  • 用 Rule-based 样式按评分分级显示候选地块。
  • 把模型导出为 Python,在 Jupyter 里用 geolibre.Map 批量跑多个城市。

26.8 案例七:地形与流域分析

26.8.1 目标与数据

项 内容
目标 从 DEM 生成山体阴影、坡度、等高线与流域范围,并解释每个产物的用途
数据 USGS 3DEP 的 DEM(1 m、1/3 弧秒、1 弧秒等)或自备 GeoTIFF
前置 Hillshade / Slope / Aspect 有浏览器引擎;Contour 与按掩膜裁剪需要桌面端 sidecar
预计 30 分钟

26.8.2 步骤

  1. 取 DEM:Plugins → Web Services → USGS 3DEP,按当前视图、画框、坐标或 1:24,000 图幅搜索;选高程数据集与格式,点 Load on Map 把 GeoTIFF 流式加载为栅格图层(Download 保存源文件)。
  2. 山体阴影:Processing → GeoLibre Toolbox → Raster → Hillshade,选 DEM,调方位角、高度角与 z-factor。把阴影图层放在彩色图层下面,把上层图层的混合模式设为 Multiply,让地形起伏透出来(比降不透明度更好)。
  3. 坡度与坡向:Raster → Slope 与 Raster → Aspect,用 Colormap 上色,并从 Controls 打开 Colorbar 显示数值刻度。
  4. 等高线:Raster → Contour,设置等高距(interval)。它只有 sidecar 引擎,因此需要桌面端;输出的线图层可以标注与样式化。
  5. 裁剪到研究区:Raster → Clip by extent(包围盒,浏览器可跑)或 Clip by mask layer(矢量掩膜,需 sidecar)。
  6. 流域与河网:两条路线——
    • Whitebox 工具箱(Processing 菜单顶部的九个分类之一,水文分析类)在浏览器里用 WebAssembly 跑填洼、流向/流量累积与流域划分,名称沿用 WhiteboxTools 的算法命名;
    • USGS NLDI(Plugins → Web Services → USGS NLDI)是点击式的工作流:在地图上点一个位置,追踪河网流线(flowline / raindrop path)、上下游流域(basin)与 COMID,并可导航到水文站、井、HUC12 出水口等目录。
  7. 对照验证:把 DEM 派生的河网与 NLDI 的 NHD 流线叠加,检查主干走向是否一致;不一致通常意味着填洼或流向算法参数不同。
  8. 保存与导出:地形产物多为栅格,Raster to COG 后作为远程图层引用,避免工程膨胀。

26.8.3 结果

一套地形底图(阴影 + 坡度 + 等高线)加流域/河网图层,可用于洪水、侵蚀或选址分析的基础底图。

26.8.4 扩展

  • 用 Blend mode 组合阴影与土地利用分类,做地形–地表覆盖叠加图。
  • 把坡度重分类为等级(Processing 的栅格重分类工具),用于适宜性评价。
  • 用 Time Slider 播放多期 DEM 差分(需先把差值做成栅格序列)。

26.9 案例八:AI 助手与模型构建器自动化

26.9.1 目标与数据

项 内容
目标 用自然语言让 AI 助手生成一个「道路缓冲 100 米并裁剪到县界」的模型,检查后运行并导出 Python
数据 道路图层与县界面图层(可用案例六的数据)
前置 配置一个 AI 提供方;本地 Ollama 可不联网
预计 20 分钟

26.9.2 步骤

  1. 配置提供方:Settings → AI Providers,选择一个:
    • Ollama(本地):填 OLLAMA_BASE_URL(例如 http://localhost:11434),无需 API key,数据不出本机;
    • OpenAI / Anthropic / Google:填对应 API key;
    • OpenRouter / Vercel AI Gateway / Bedrock / 自定义 OpenAI 兼容端点:按面板提示填。 托管密钥由浏览器直接发往提供方,不经过 GeoLibre 服务器。
  2. 打开助手:Processing → AI Assistant(或命令面板),面板停靠在窗口底部,可拖动上边缘调整高度。
  3. 描述任务:输入「buffer the roads by 100 m and clip the result to the county」。助手会调用 GeoLibre 自己的工具(SQL、样式、地图控制等),通过 store 修改状态,因此在大部分情况下可以 Ctrl/Cmd + Z 撤销。每一步工具调用(包括生成的 SQL)都会出现在对话记录里。
  4. 检查生成的模型:助手会查工具、按工具定义校验每个参数、把模型存进工程,并在 Model Builder 里打开它。先审阅再运行:检查输入图层是否正确、单位是米还是度、裁剪的掩膜图层是否选对。
  5. 运行:在 Model Builder 里点 Run,观察节点状态与底部日志;结果会作为新图层加入地图。
  6. 导出:成功后点 Copy Python script,得到调用 m.run_model_builder(...) 的脚本,可粘进 Python 控制台或 Notebook(输入图层需已在那个地图里加载)。
  7. 保存模型:Save 存进工程,或 Export 成 .model.json 分享给同事。

26.9.3 结果

一个可复用的模型,加上一份等价的 Python 脚本;整个过程中你能看到 AI 具体调用了哪些工具、生成了什么 SQL。

26.9.4 扩展

  • 让助手「把结果按坡度分级上色」,再让它「生成一张 Print Layout 的图例」。
  • 用本地 Ollama 完全离线跑同一流程,比较生成质量与延迟。
  • 把模型里的参数(缓冲距离)改成不同值批量跑,观察结果差异。

警告:AI 生成的参数可能看起来合理但单位错误(例如把米当度)。运行前务必核对参数单位与坐标系,尤其是缓冲、距离与面积类操作。


26.10 案例九:分享、嵌入与故事地图发布

26.10.1 目标与数据

项 内容
目标 把完成的工程发布成公开链接、嵌入第三方网页,并做一版滚动叙事的故事地图
数据 任意已完成的工程(建议用案例一的专题图)
前置 分享需要账号(OAuth 登录或个人 API 令牌);嵌入需要部署方允许你的页面源
预计 30 分钟

26.10.2 步骤:分享

  1. Project → Share…。Web 端点击 Sign in 打开 share.geolibre.app 的同意页;桌面端在系统浏览器完成登录并把会话存进系统钥匙串;移动端、Notebook 与兜底场景可在 Settings → Environment Variables → Share.GeoLibre API token 粘贴个人令牌。
  2. 看分享前检查:对话框会在上传前检查工程引用的数据源,列出接收方加载不到的图层及原因(凭据在上传时被剥离、路径仅本机可见等)。
  3. 确认标题并上传,得到形如 https://share.geolibre.app/<user>/<slug>.geolibre.json 的链接。
  4. 验证:用无痕窗口打开链接,确认图层与视图正确;用 Project → Share 之外的入口(例如?url= 深链接)也试一次。

26.10.3 步骤:嵌入

  1. 最简嵌入(纯地图,无工具栏/面板/状态栏):
<iframe
  src="https://web.geolibre.app/?url=https://share.geolibre.app/you/my-map.geolibre.json&maponly"
  title="GeoLibre map"
  width="100%"
  height="600"
  style="border: 0;"
  loading="lazy"
  allow="fullscreen; geolocation"
></iframe>
  1. 按需调外观:layout=viewer(只读浏览,保留图层与查找)、layout=compact(窄工具栏)、toolbar=none、panels=none、theme=dark;layout=viewer 加 draw 可让读者在只读视图里画几何。
  2. 运行时通信(需要部署方把你的页面源加入 sharing.embedOrigins):
import { connect } from "@geolibre/embed";

const map = await connect(document.querySelector("iframe"), {
  origin: "https://web.geolibre.app",
});

map.on("selectionChanged", ({ featureIds }) => showRecordFor(featureIds[0]));
await map.setView({ bbox: field.bbox });
await map.highlightFeature({ layerId: "fields", filter: { parcel_id: field.id }, fit: true });

注意:web.geolibre.app 没有为第三方页面开放运行时 API。要在自己站点里驱动地图,必须用自己托管的构建并在部署策略里加上你的页面源。

26.10.4 步骤:故事地图

  1. Project → Story Map 打开构建器。故事保存在 .geolibre.json 里,随工程走。
  2. 先看样例:故事为空时点 Load sample story,Present 滚动一遍,理解章节与相机的关系。
  3. 加章节:把地图移到目标视图,点 Add chapter 捕获当前相机;填 Title、Description(支持内联 HTML)、可选 Image URL;选 Panel alignment(left/center/right/full)与 Map animation(flyTo/easeTo/jumpTo)。
  4. 做图层淡入淡出:在 On enter / On exit 里添加图层效果,选图层与目标不透明度,让数据随章节出现或消失。
  5. 全局设置:标题/副标题/署名/页脚、面板主题、标记点、Inset minimap、起始页与结束页。
  6. 导出与交付:
    • Present 现场演示;
    • Export HTML 生成自包含的单文件页面,可托管在任意静态服务器(会内联被章节效果引用的内存 GeoJSON 图层);
    • Handout (PDF) 一屏一页导出 PDF,可带可点击的位置标记;
    • Export JSON / CSV 便于在表格里批量编辑章节。

26.10.5 结果

三层交付物:一个可打开的分享链接、一个嵌进网页的地图、一个可独立托管的叙事页面或 PDF 手册。

26.10.6 扩展

  • 把故事地图的章节地图截图用作 Print Layout 的插图。
  • 用 CSV 导入批量生成几十个章节(列名固定,见官方文档),适合城市巡礼类叙事。
  • 在自托管环境里把 shareUrl 指向自己的项目服务器,分享链接就全部落在自己域名下。

26.11 案例十:自托管 GeoLibre + GeoLens 私有数据平台

26.11.1 目标与数据

项 内容
目标 在一台虚拟机上搭出「同一域名、同一登录、数据不出内网」的 GeoLibre + GeoLens 平台
组件 geolibre-web(静态构建 + sidecar)、geolibre-server(项目/身份)、geolibre-collab(可选)、GeoLens(目录 + PostGIS)
前置 Docker 与 Compose;域名与 TLS 证书;一个反向代理与 SSO 方案
预计 1–2 小时(不含数据导入)

26.11.2 步骤

  1. 起 GeoLibre 三件套:
POSTGRES_PASSWORD='强密码,避免 at 符与百分号' docker compose up --build

打开 http://localhost:8080 验证;API 在 http://localhost:8000,中继在 ws://localhost:8787。

  1. 装 GeoLens(同机、同 Compose 网络或同一反代之后):
curl -fsSL https://getgeolens.com/install.sh | sh

在其 .env 里至少设置 PUBLIC_APP_URL、PUBLIC_API_URL、ENVIRONMENT=production、JWT_SECRET_KEY;GeoLibre 与 GeoLens 不同源时才需要 CORS_ALLOWED_ORIGINS。

  1. 统一入口:一个反向代理终止 TLS,把 /gis 转到 GeoLibre,/api 与瓦片转到 GeoLens,/projects 指向静态工程目录;SSO 层放在最前面(见第 22 章的 Caddy 示例)。
  2. 改公网地址:把 GEOLIBRE_SHARE_URL、GEOLIBRE_COLLAB_URL、GEOLIBRE_VIEWER_URL、GEOLIBRE_CORS_ORIGINS 换成公网 HTTPS/WSS 地址,重启容器。
  3. 连接目录:在 GeoLibre 里打开 Plugins → GeoLens,服务器填根地址(不要带 /api);同源部署时请求自带会话 cookie,私有数据集可能不需要额外 key;非会话授权时填 GeoLens API key。
  4. 验证数据主权:打开浏览器 DevTools 的 Network,确认数据与瓦片请求都打在自己的域名下;用无痕窗口(未登录)访问同一 URL,应被 SSO 拦下。
  5. 收尾加固:按第 22 章的检查单处理 GEOLIBRE_CONVERSION_ROOTS、GEOLIBRE_DISABLE_SIDECAR、CSP 回环白名单,并用 deployment.json 固化品牌、能力与插件白名单。

26.11.3 结果

一个同源私有平台:GeoLibre 负责可视化与分析,GeoLens 负责目录、权限与瓦片;数据、令牌与工程都在自己的域名与账号体系下。

26.11.4 扩展

  • 打开 GeoLens 的数据集编辑(enable_dataset_editing),在 GeoLibre 里用 GeoEditor 改要素并写回。
  • 用组织与组把数据集分给不同团队(组织角色见第 22 章)。
  • 加上协作中继,做小范围实时协同编辑。

26.12 迁移、教学与协作三个场景

26.12.1 从 QGIS / ArcGIS Pro 迁移

GeoLibre 能直接读两种桌面 GIS 的工程:

来源 入口 能带过来的 会被跳过并报告的
QGIS .qgs / .qgz Project → Import → Import QGIS Project… 图层、图层组(含嵌套)、组可见性、图层顺序、样式、保存的地图视图 不支持的数据提供方、不支持的文件格式、缺失源、网络共享路径、远程源(按原因分组并计数)
ArcGIS Pro .aprx / .mapx Project → Import → Import ArcGIS Pro Project… 第一个 2D 地图的保存范围、基于文件的要素图层与 GeoTIFF 栅格、嵌套组、可见性、简单符号、基于字段的标注、ArcGIS 矢量瓦片门户项、缓存地图服务 文件地理数据库、场景、网络共享路径等(要素与栅格分开报告,因为绕行方式不同)

迁移要点:

  1. 浏览器构建读不到本地路径。在浏览器里导入时,引用本地磁盘路径的图层会被列为跳过;同一个工程在桌面端导入才能加载它们。
  2. 文件地理数据库要单独处理:桌面端可用 Add Data → File Geodatabase (GDB) 添加要素类;.gdb 里的栅格必须先导出为 GeoTIFF。
  3. 样式可以单独搬:选中矢量图层,Layer actions → Styles 子菜单可导入/导出 GeoLibre URL 样式 JSON、Mapbox/MapLibre 样式 JSON、OGC SLD 与 QML(样式体系见第07章 样式符号化与图例)。
  4. 迁移后重做布局:打印布局与故事地图是 GeoLibre 自己的模型,需要在 Project → Print Layout… 或 Project → Story Map 里重建。
  5. 接受「报告而不是失败」:导入器宁可把带不过来的东西列清楚,也不整份失败。把报告当作迁移清单,逐项决定补数据还是换源。

26.12.2 教学与展馆 kiosk

教学场景要的是「稳定、可控、不误操作」,展馆要的是「不需要人值守」。

  1. 收紧能力:用部署策略把能力限制到必要集合。展馆通常 "capabilities": [](或只给 export:data 让访客导出图片);课堂给 project:edit,data:add,processing:run,export:data,但不给插件安装与设置。
  2. 简化界面:interface.level 设 beginner 并 lock: true,避免学生把面板关掉后找不到。
  3. 固定入口:用 ?url=<绝对 URL> 深链接直接打开当堂工程;展馆用 layout=viewer 或 maponly 嵌入,避免进入编辑态。
  4. 离线保障:把底图打包成离线区域(仅已安装的 PWA 有效),或直接自托管底图瓦片;教室网络不稳定时这一步最关键。
  5. 出图交作业:Project → Print Layout… 固定模板(A4、图例、比例尺、指北针、页脚),学生只需替换数据。
  6. 合规:确认部署不带遥测(Docker 镜像无法开启 GA),并检查第三方底图/影像的署名要求。

26.12.3 团队协作

  1. 账号与权限:用项目服务建组织,分配 administrator / publisher / member / viewer;跨团队共享用组,sharedUpdate 决定成员能否改内容。
  2. 工程托管:Project → Share 上传到自己的服务器;私有工程用组共享而不是公开链接;链接分享可设 role、过期时间与密码。
  3. 实时协同:部署协作中继并配置 GEOLIBRE_COLLAB_URL(wss://)。会话里主持人可以设模式(只读/可编辑)、锁定图层、发邀请链接、踢出或封禁参与者;参与者能看到彼此光标与视口。
  4. 审计与回溯:工程活动日志记录版本保存、可见性变更、传输与匿名访问的聚合计数;项目历史提供快照对比与单层恢复。
  5. 备份:数据库 + 对象存储 + 中继 SQLite 同批备份(第 22 章给了命令),并定期做恢复演练。

26.13 学习路径与能力自评

26.13.1 四阶段学习路径

阶段 目标 建议章节 验收
入门 装得上、打得开、存得下 第 01–04 章 独立完成安装、打开示例、保存并重开工程
数据与制图 能把数据变成一张可发布的图 第 05–10 章、第 20 章 完成案例一,输出带图例与比例尺的 PDF
分析 能回答「哪里、多少、为什么」 第 11–17 章 完成案例六或七,并用两条路线交叉验证
工程化 能自动化、能部署、能排障 第 18–19、21–25 章 完成案例八与案例十,写出一份部署检查单

26.13.2 能力自评表

按 1–4 级自评(1 = 需要照着做,4 = 能教别人):

能力域 1 级 2 级 3 级 4 级
数据接入 会用 Add Data 加 URL 能判断该用 GeoParquet/FGB/PMTiles/COG 能做格式转换并解释取舍 能设计数据发布流水线
样式与制图 会改颜色 会做分级/分类与图例 会做 Print Layout 与故事地图 能制定团队制图规范
空间分析 会点开处理工具 会组合缓冲/叠加/连接 会用 SQL 与 Model Builder 能设计可复用模型与校验
三维与影像 会加 3D 图层 会做挤出与时间滑块 会选渲染引擎并权衡性能 能做灾害级快速制图
自动化 会开 AI 助手 能让助手生成并检查模型 会导出 Python 并改参数 能接入 Notebook/CI
部署运维 会起 Docker 镜像 会配置分享与协作地址 会写部署策略与反向代理 能做同源私有平台与审计
排障 会强制刷新 会读 Diagnostics 能按层定位性能瓶颈 能提交可复现的高质量报告

26.13.3 继续深入的方向

26.13.4 四周练习计划

把上面的路径压缩成可执行的四周安排,每周只求一个可交付物:

周 主题 交付物 自检问题
第 1 周 安装 + 数据接入 一个含 3 种格式图层的工程 每个图层的来源、坐标系与字段含义是否说得清?
第 2 周 样式 + 制图 一张 A4 专题图(PDF) 图例、比例尺、指北针、数据来源是否齐全?
第 3 周 分析 + 自动化 一个可重跑的模型 + 等价 SQL 换一份数据能否只改参数就跑通?
第 4 周 发布 + 运维 一个分享链接 + 一份部署检查单 未登录浏览器能否看到不该看的数据?

26.13.5 案例复盘模板

每做完一个案例,用下面五行记录下来,累积成自己的「打法库」:

  1. 目标:一句话说明这张图/这次分析要回答什么问题。
  2. 数据:来源、许可、坐标系、要素数量、已知质量问题。
  3. 关键步骤:只记「不做就会返工」的那几步(投影、单位、连接类型、渲染引擎)。
  4. 踩过的坑:现象 + 根因 + 最终修法(这条最值钱)。
  5. 可复用资产:模型文件、样式文件、部署策略片段、脚本。

26.14 本章小结

本章用十个案例把 GeoLibre 的能力串成工作流:

  1. 专题制图:加载 → 探索 → 分级设色 → 自动图例 → Print Layout 导出,是一条可以反复复用的最短闭环。
  2. 云原生链路:GeoParquet(流式)、FlatGeobuf(空间索引)、PMTiles(瓦片归档)、COG(栅格)各司其职;工程只留 URL 与样式。
  3. 三维与时间:Style 面板的 3D extrusion 加 Time Slider,把静态建筑数据变成可播放的城市生长动画。
  4. 行星制图:行星切换器同时切换椭球,测量与比例尺随天体变化。
  5. 灾害制图:事件影像(Vantor / Planet / OpenAerialMap)+ COG 渲染引擎选择 + Layer Swipe,是数小时内出图的最短路径。
  6. 选址分析:Processing 工具、SQL、Model Builder 三条路线互为验证;模型可导出 Python。
  7. 地形与流域:Hillshade/Slope/Aspect/Contour 加 Whitebox 水文与 NLDI 河网,构成地形分析底座。
  8. AI 与自动化:助手负责起草模型,人负责校验参数,Model Builder 负责复现,Python 负责批量。
  9. 发布:分享链接、iframe 嵌入(含运行时 API 与源白名单)、故事地图与 PDF 手册,覆盖从网页到展馆的交付。
  10. 自托管:同源部署 + GeoLens + 项目服务 + 协作中继,构成数据不出内网的私有平台;配套的迁移、教学与团队协作场景让这套能力真正落地。

26.15 实践练习

  1. 端到端小项目:选一个你关心的县/市,用案例一的流程做一张专题图,再用案例二把主数据转成 FlatGeobuf 或 PMTiles 后重做一次,记录两次的工程体积与加载时间。
  2. 对比实验:用案例五的方法做同一事件的两期影像对比,分别用 Layer Swipe 与两个并排 iframe(maponly)呈现,比较交互与性能。
  3. 双路线验证:把案例六的选址逻辑分别用 Processing 工具与 SQL 实现,找出结果差异的要素并解释原因(投影、容差或连接类型)。
  4. 模型复用:把案例六的流程做成 Model Builder 模型,导出 .model.json 与 Python 脚本,换一份数据再跑一次,记录需要改动的参数。
  5. 发布三件套:为同一份工程产出分享链接、嵌入页面与故事地图(含 PDF 手册),并检查三者在未登录浏览器里的表现。
  6. 部署演练:按案例十在一台测试机上搭起 GeoLibre + GeoLens,用未登录浏览器验证数据不可达,并写出你的部署检查单。