第12章 - 地理处理工具箱
GeoLibre 的 Processing 菜单里装着两套互不相干的工具箱,外加 SQL、Python、AI、建模、看板等入口。菜单上”Vector”“Raster”“Conversion”这些名字各出现两次——一次属于 Whitebox 工具箱,一次属于 GeoLibre 自己的工具箱。它们不是重复实现,也不打开同一个对话框。
本章先把这两套工具箱彻底分开,再讲工具怎么找、参数怎么填、任务怎么跑、结果落到哪、缺依赖时怎么修。阅读顺序建议照此进行:先分清工具箱,再谈工具。
说明:本章基于 GeoLibre 3.4。工具名、参数名与菜单路径保留英文原文。事实来源为
docs/user-guide/processing.md、docs/tutorials/vector-analysis.md、docs/tutorials/terrain-analysis.md、docs/architecture.md(Python sidecar 小节),以及源码packages/processing/src/{types,registry,runner,vector-tools,vector-tool-runner,wasm-tool-runner}.ts、apps/geolibre-desktop/src/lib/{whitebox-menu-catalog,whitebox-tool-url,whitebox-semantic-search,processing-params}.ts。
12.1 两类工具箱:一张图分清
12.1.1 菜单的真实结构
Processing
├─ AI Assistant
├─────────────────────────
├─ Whitebox Toolbox ← 打开工具箱对话框
├─ Conversion ▸ ┐
├─ Hydrology ▸ │
├─ LiDAR ▸ │
├─ Network ▸ │
├─ Projection ▸ ├ 同一个工具箱,按分类浏览(1,000+ 工具)
├─ Raster ▸ │
├─ Remote Sensing ▸ │
├─ Terrain ▸ │
├─ Vector ▸ ┘
├─────────────────────────
├─ GeoLibre Toolbox ▸ ← GeoLibre 自带工具
│ ├─ Conversion ▸
│ ├─ Vector ▸
│ ├─ Network ▸
│ ├─ Spatial Statistics ▸
│ ├─ Raster ▸
│ ├─ DGGS ▸
│ ├──────────────────────
│ ├─ Geocode Addresses
│ ├─ Batch tools
│ ├─ AI Segmentation
│ ├─ Object Detection
│ └─ Segment Everything
├─────────────────────────
├─ Model Builder
├─ Object-Based Analysis
├─ SQL Workspace
├─ Python Console
├─ Jupyter Notebook
├─ Dashboard
├─ History
├─ Planetary Computer
└─ Earth Engine
两个分隔线之间的整块都属于 Whitebox Toolbox;GeoLibre Toolbox 下面的所有东西都是 GeoLibre 自己的。同一个分类名在菜单里出现两次,是因为它们真的属于两套东西。
12.1.2 两套工具箱的差异
| Whitebox Toolbox | GeoLibre Toolbox | |
|---|---|---|
| 菜单位置 | Whitebox Toolbox 条目,以及它下面那九个分类子菜单 | 分隔线以下的 GeoLibre Toolbox 子菜单 |
| 内容 | 1,000+ 工具:Whitebox Next Gen 套件 + GeoLibre 自己用 Rust 写的 geolibre-rust 工具 | GeoLibre 为这个应用手写的工具 |
| 分类来源 | 工具清单自动生成(跟随上游命名) | 手工策展 |
| 点一个工具打开什么 | 同一个对话框,工具预选,表单由参数清单生成 | 每个工具族一个专门对话框(Vector / Raster / Conversion / …) |
| 在哪运行 | 默认浏览器里的 WebAssembly,可选 Python sidecar | 视工具而定:Turf.js / Pyodide / sidecar |
| 输入 | 地图图层或文件路径 | 通常是地图上的图层 |
| 输出 | 落图或写文件(栅格输出为 COG) | 落图(Conversion 类写文件) |
12.1.3 最容易混的两条路径
| 菜单路径 | 实际是什么 | 打开哪个对话框 |
|---|---|---|
| Processing → Vector → GeoLibre (WASM) | Whitebox 工具箱里由 GeoLibre 贡献的那几百个矢量工具(Rust 编译成 WASM),与 Whitebox Next Gen 的工具在同一个目录里,所以用 GeoLibre (WASM) 子标题标出来源 |
Whitebox Toolbox 对话框 |
| Processing → GeoLibre Toolbox → Vector | GeoLibre 自己的矢量工具箱:Buffer、Clip、Spatial join 等,带引擎选择器 | Vector tools 对话框 |
同样”撞名”的还有单个工具:
| 名字 | 两处分别是什么 |
|---|---|
| Vector to PMTiles | Processing → Conversion → GeoLibre (WASM) → Vector to PMTiles 是 WASM 目录工具,开 Whitebox 对话框;Processing → GeoLibre Toolbox → Conversion → Vector to PMTiles 是 Conversion 对话框,有自己的文件选择器与缩放/压缩/图层名选项 |
| Raster to PMTiles | 同上,两处都有 |
提示:本教程后面提到”Conversion 工具”时,一律指 GeoLibre Toolbox → Conversion 那一个(有文件选择器的那套)。
12.1.4 该用哪个
| 需求 | 建议 |
|---|---|
| 对地图上已有的图层做日常分析(缓冲、裁剪、空间连接) | GeoLibre Toolbox:工具少、对话框有引导、可选引擎 |
| 需要地形、水文、遥感、LiDAR 的专门算法 | Whitebox Toolbox:那是它的主场 |
| 需要某个具名算法(如 “Fill Depressions”) | Whitebox Toolbox,或用 Ctrl/Cmd+K 直接搜 |
| 要投影感知的缓冲/叠加 | GeoLibre Toolbox 的 Vector,引擎选 Sidecar 或 Pyodide |
| 要把结果写成云原生文件 | GeoLibre Toolbox → Conversion |
警告:Whitebox 对话框里还有一个 source 下拉框(All sources / GeoLibre tools / Whitebox tools)。它只过滤Whitebox 目录内的工具来源,”GeoLibre tools”在那里指的是同一批 WASM 工具,与 GeoLibre Toolbox 的对话框毫无关系。这是第三个容易混淆的”GeoLibre”字样。
12.2 GeoLibre Toolbox 全览
12.2.1 Vector:最常用的一个
Processing → GeoLibre Toolbox → Vector 打开矢量工具对话框:左侧工具列表,右侧参数,顶部有引擎选择器。工具按分组排列:
Geometry
| 工具 | 作用 |
|---|---|
| Buffer | 按固定距离生成缓冲面;可选 outside / inside / both,可把缓冲合并成一个无属性要素 |
| Centroids | 每个要素的质心点 |
| Convex hull | 全部要素的凸包 |
| Dissolve | 合并成一个几何,可按字段分组 |
| Bounding box | 全部要素的外包矩形 |
| Simplify | Douglas-Peucker 抽稀 |
| Reproject | 把坐标重新解释为某个源 CRS 并转到 WGS84;需要 Sidecar 或 Python 引擎 |
| Explode | 多部件拆成单部件,保留父要素属性 |
| Aggregate by attribute | 按属性值分组融合,并带一个汇总统计 |
| Smooth | Chaikin 算法圆角(与 Simplify 相反,会增加顶点),保留 Z |
| Extract vertices | 线/面的每个顶点变成点要素,保留父要素属性 |
| Points along geometry | 沿线或面边界按固定间距(或固定个数)布点 |
| Regular grid | 规则格网(fishnet):按地图视图、图层范围或手工 bbox |
| Voronoi / Delaunay | 泰森多边形(裁剪到点范围)或 Delaunay 三角网 |
| Cell-site coverage | 按方位角、半径、波束宽度生成天线扇区(字段或固定值) |
| Decode polyline | 把属性里的编码折线(精度 5 或 6)解成线图层 |
| Encode line to polyline | 把 LineString/MultiLineString 编码成字符串写进新字段 |
Overlay
| 工具 | 作用 |
|---|---|
| Clip | 用叠加图层裁剪输入(保留输入属性) |
| Intersection | 只保留两层面状图层的重叠部分(合并两侧属性) |
| Difference | 从输入中减去叠加图层(保留输入属性) |
| Union | 两层面状图层合并成一个(两个引擎都不保留属性) |
Join
| 工具 | 作用 |
|---|---|
| Spatial join | 按空间关系(intersects / within / contains)把连接图层的属性挂到输入要素;可选 inner 或 left;任意几何类型 |
| Attribute join | 按键字段把连接表(无几何)的属性挂到输入要素;一对一(第一条匹配行胜出);可选要带入的字段与 inner/left |
Select
| 工具 | 作用 |
|---|---|
| Select by value | 按属性条件提取成新图层(=、≠、>、≥、<、≤、contains、starts with、is empty、is not empty);两侧都是数字时按数字比较 |
| Select by location | 按与第二图层的空间关系(intersects / within / contains / disjoint)提取 |
| Random extract | 按要素数或百分比随机抽样 |
Movement & time
| 工具 | 作用 |
|---|---|
| Trajectory speed | 按目标与时间排序,把相邻定位连成带距离、时长、速度的线段 |
| Detect stops | 找出停留:连续定位在给定距离内且持续超过最小时长,每个停留出一个点 |
| Space-time proximity | 找出时空都接近的点对(两个目标相遇),输出每条合格点对一条线,带距离与时间差 |
Data management / Data quality
| 工具 | 作用 |
|---|---|
| Merge layers | 多选图层合并,统一属性 schema,可把来源图层名记进新字段 |
| Check validity | 找出非法几何(自相交环、孔洞在壳外等)并在图上标出 |
| Fix geometries | 用 ST_MakeValid 修复,合法要素原样通过 |
| Check topology rules | 按拓扑规则(重叠、缝隙、自相交、悬挂)校验并标出违规 |
| Fix topology | 吸附近接端点、修悬挂、把点投影到线上;真正孤立的自由端不动 |
12.2.2 三个引擎
矢量工具对话框顶部有引擎选择器(Run 之前):
| 引擎 | 实现 | 前提 | 特点 |
|---|---|---|---|
| Client (Turf.js) | 纯浏览器 | 无 | 离线可用,直接在图层 GeoJSON 上算;距离按度 |
| Sidecar (GeoPandas) | Python sidecar | 桌面 + vector extra |
投影感知;extra 缺失时对话框自动回退到客户端引擎 |
| Python (Pyodide) | 浏览器里的 Python | 首次要下载运行时(几十 MB) | 与 sidecar 同一套 GeoPandas/Shapely 代码,结果一致;Web 版也能用 |
Pyodide 的运行时默认从公共 jsDelivr CDN 加载,这是一条信任假设;生产或离线环境可用 VITE_PYODIDE_INDEX_URL 指向自建镜像,彻底去掉 CDN 依赖。
警告:客户端引擎在经纬度上按”度”计算。1000 米的缓冲写进 Client 引擎会变成 1000 度,结果绕地球。要做米制缓冲,选 Sidecar 或 Pyodide(它们会先重投影)。
12.2.3 Raster:地形与遥感
Processing → GeoLibre Toolbox → Raster 打开栅格对话框。多数工具是”文件路径进、文件路径出”,在 rasterio sidecar 上跑,结果再上地图。八个工具有 Client (browser) 引擎,完全不需要 sidecar:
| 分类 | 工具 | 引擎 |
|---|---|---|
| Terrain | Hillshade、Slope、Aspect | 三者都可 Client |
| Reproject | Reproject、Resample | 仅 sidecar |
| Clip | Clip by extent(bbox,按栅格自身 CRS)、Clip by mask layer(矢量掩膜) | 前者可 Client,后者仅 sidecar |
| Raster to Vector | Polygonize、Contour | 仅 sidecar |
| Vector to Raster | Interpolation (IDW / Kriging) | 仅 sidecar |
| Analysis | Zonal statistics、Raster calculator、Spectral index、Reclassify、Mosaic / merge、Focal statistics | Raster calculator / Spectral index / Reclassify / Focal statistics 可 Client;其余仅 sidecar |
同一个子菜单里还有两个特殊条目:
- Download Global DEM 在顶部:从公开的 AWS Terrain Tiles 下载当前视图或手绘框的 DEM(无需 key),然后在 Whitebox 对话框里打开;
- Georeferencing 在底部:用地面控制点把无地理参考的影像钉到地图上,最小二乘仿射拟合,报告逐点残差与 RMS。
12.2.4 Conversion、Network、Spatial Statistics、DGGS
这四组在 12.7 与下面几段分别展开,这里先给一张”能不能在浏览器跑”的速查:
| 组 | 工具数 | 浏览器可用 | 需要 sidecar |
|---|---|---|---|
| Conversion | 9 | ✅ 全部有客户端引擎 | 桌面版优先走 sidecar(能写任意 GDAL 格式) |
| Network | 3 | ✅(但走外部 Valhalla 服务) | ❌ |
| Spatial Statistics | 7 | ✅ | ❌ |
| DGGS | 3 | ✅(H3/S2/A5/DGGRID/DGGAL) | ❌ |
Network 的三个工具是 Isochrone / service area、OD cost matrix、Sequential route (directions),全部请求 Valhalla 服务器;默认用公共 FOSSGIS 实例(valhalla1.openstreetmap.de),所以提交的坐标会离开设备,自托管部署可指向自己的服务器。
Spatial Statistics 的七个工具:Global Moran’s I、Local Moran’s I (LISA)、Getis-Ord Gi* hotspots、Average nearest neighbor、Kernel density (heatmap)、Emerging Hot Spot (space-time cube)、Composite score (suitability index)。
其中 Composite score 是”适宜性指数”的完整实现:
- 选两个以上数值字段;
- 每个字段选归一化:Min-max、Z-score、Rank、Quantile;
- 给相对权重(界面同时显示它占总权重的百分比);
- 选方向:Higher is better / Lower is better;
- 选合成方式:加权算术平均,或”强项不能补偿弱项”时的几何平均;
- 决定缺值怎么处理:从结果中去掉,或按已有字段重新归一化权重(没有默认值,两者都合理,但只有一个是你想要的那个);
- 可选 Keep normalized components(把每个字段的归一化值写成独立列,便于审计);
- 设 Score range(默认 0–100,也可 0–1)与 Score field name。
Rank 与 Quantile 对并列值采用中位秩,所以相等的输入永远得到相等的分数。结果以新图层落图,并自动用分级渲染按分数着色。
DGGS 三个工具:DGGS Generator(按图层几何/范围、地图视图或手工 bbox 铺格)、DGGS Binning(把点聚合到格子里,计数或 sum/mean/min/max)、DGGS Compact(压缩或展开到统一分辨率)。
12.2.5 其余入口
| 入口 | 作用 | 依赖 |
|---|---|---|
| Geocode Addresses | 地址表 → 点图层 | 地理编码 provider(见第10章/设置) |
| Batch tools | Batch:一个工具跑多个图层;Models:链式串联并随项目保存 | 客户端引擎 |
| AI Segmentation | 影像 → 矢量要素(segment-geospatial / SamGeo + Meta SAM 3),文本提示或自动分割 | 独立的 samgeo-api 服务(建议 GPU),由 sidecar 代理 |
| Object Detection / Segment Everything | 浏览器内 onnxruntime-web,无需 sidecar |
浏览器 |
12.3 Whitebox Toolbox:1,000+ 个工具
12.3.1 来源与规模
工具来自两处,混在同一个目录里:
- Whitebox Next Gen 套件(上游项目 Whitebox-Next-Gen-ArcGIS 的工具清单);
- GeoLibre 自己的 WASM 工具(geolibre-rust 编译成 WebAssembly),在菜单里以
GeoLibre (WASM)子标题标出。
菜单目录是自动生成的(scripts/gen-whitebox-menu-catalog.mjs),文件头明确写着”不要手改”。仓库快照里是 1,068 个工具、9 个分类:
| 分类 | 数量级 | 典型内容 |
|---|---|---|
| Vector | 约 313 | 几何、叠加、属性、拓扑 |
| Raster | 约 256 | 地图代数、邻域、重分类、投影赋值 |
| Remote Sensing | 约 154 | 指数、分类、变化检测 |
| Hydrology | 约 100 | 填洼、流向、汇流累积、流域 |
| Terrain | 约 99 | 坡度、曲率、可视域、地形位置 |
| LiDAR | 约 65 | 分类、滤波、栅格化 |
| Conversion | 约 49 | 格式与栅格/矢量互转 |
| Network | 约 26 | 拓扑、最短路径、OD |
| Projection | 4 | 见下 |
Projection 分类只有 4 个工具,值得单独记住:
| 工具 id | 名称 | 用途 |
|---|---|---|
reproject_vector |
Reproject Vector | 矢量转向目标 CRS(dst_epsg) |
reproject_lidar |
Reproject Lidar | 点云转 CRS |
georeference_raster_from_control_points |
Georeference Raster From Control Points | 用控制点给无坐标栅格赋地理参考 |
orthorectification |
Orthorectification | 正射校正 |
另有 assign_projection_vector(Assign Projection Vector,在 Vector 分类的 WASM 子标题下)与 assign_projection_raster(在 Raster 分类下)——这两个只改声明,不动坐标。
12.3.2 在哪运行:Run locally (WASM)
Whitebox 工具跑在浏览器里,通过一个带栅格与矢量 I/O 的 WebAssembly 运行时——不需要 Python sidecar,不需要服务器,数据不出本机。因此整套工具箱在 GeoLibre Web、Android、iOS 上都能用。
Run locally (WASM) 复选框控制执行引擎:
| 状态 | 含义 |
|---|---|
| 勾选(浏览器默认) | 在当前选中的图层或文件上用 WebAssembly 跑 |
| 不勾选(桌面默认) | 把任务发给 Python sidecar;它能读浏览器读不到的本机路径,批量跑目录时更合适 |
Mac App Store 构建没有 sidecar 可切,所以那个复选框根本不出现,WASM 是唯一运行时。工具列表在两种模式下完全相同,只有执行引擎变。
12.3.3 输入与输出
| 输入类型 | 说明 |
|---|---|
| 地图图层 | 参数旁的图层下拉;矢量图层以内存 GeoJSON 交出 |
| 文件路径 | 有浏览按钮;侧车模式下必须填 sidecar 能读到的路径(见 12.9) |
| 输出类型 | 行为 |
|---|---|
| 矢量 | 加到地图;输出格式下拉另有 GeoParquet (download, keeps CRS)、FlatGeobuf、Shapefile |
| 栅格 | 写成 Cloud Optimized GeoTIFF(COG),加到地图 |
| LiDAR | 在浏览器引擎下作为点云图层加入(必要时先转 COPC);失败才下载成文件;LiDAR 图层的 Export 可存 LAS / LAZ / COPC |
注意:Whitebox 的矢量输出下拉里那句
projectedHint很重要——选了投影 CRS 的输出会下载成文件而不上地图,因为地图只显示 EPSG:4326。要看到结果,就输出 4326,或改用矢量工具。
12.4 找到工具:四条路径
12.4.1 分类浏览
Processing 菜单里每个 Whitebox 分类都有子菜单,子菜单里再分子类。工具名直接来自清单,跟随上游命名(英文,即使界面语言是中文)。目录是离线打包的,所以没网也能浏览。
12.4.2 搜索
- Whitebox 对话框左侧顶部有 Search tools 过滤框(子串匹配,即时);
- Processing 菜单自身也有 Search processing tools…(菜单层面的搜索,可跨两套工具箱);
- 命令面板(
Ctrl/Cmd+K)会把每个处理工具单独列出:Tools 下面是 GeoLibre Toolbox 的矢量、网络、统计工具,Whitebox Toolbox 下面是每个 Whitebox 工具。选一个就打开对话框并预选该工具。
命令面板的排序规则值得一提:工具名在任何语言下都保持英文可搜,完全匹配的标题排第一,且会隐藏当前界面配置隐藏掉的条目。
12.4.3 语义搜索
Whitebox 对话框的搜索框还支持按意思找工具——输入 “remove sinks so water drains off the edge”,它会找到 fill_depressions,而子串匹配一条也找不到。
它的三条设计规则决定了你什么时候会看到它:
- 不可用时就完全隐形:没有配置 System One 端点(默认)时,什么都不会发生,界面与之前一模一样;
- 很少触发:不是每敲一个字就查——输入停顿 500 ms 后才发请求,且要求查询是多词短语,或单词但子串命中的工具少于 3 个;
- 只增不重排:语义结果作为独立的”Best matches”分组显示在子串结果上方,不会把你正在读的列表打乱。
提示:语义搜索依赖 AI provider 的 System One 端点(第18章)。没有配置时它是”不存在”而不是”坏了”——别把它当成 bug 排查。
12.4.4 深链接 ?tool=
Whitebox 对话框里的 Copy link 会生成一个带 ?tool=<工具 id> 的 URL,打开即预选该工具、并带上当前参数:
https://web.geolibre.app/?tool=extract_cog_subset&url=https%3A%2F%2F…%2Fdem.tif&bbox_crs=4326
规则:
| 规则 | 说明 |
|---|---|
| 参数变成工具参数 | 除保留参数外的每个查询参数都会填进表单(同名参数取第一个) |
| 保留参数 | tool、layout、embed、iframe、toolbar、panels、hidePanels、maponly、draw、theme、welcome、locale、lang、collab、plugin |
| “工具模式优先” | 带 ?tool= 时,url 是工具输入,不再是工程 URL |
| 未知 id | 仍然打开对话框,但不预选,让用户自己挑 |
| 桌面版 | window.location 是 tauri://…,不可分享,所以链接基址回退到 https://web.geolibre.app/ |
文档、教学、bug 报告都适合用这种链接——它把”哪个工具 + 哪些参数”变成一条可复现的记录。
12.5 参数表单:从清单长出来的界面
12.5.1 参数类型
Whitebox 对话框的表单是根据工具清单生成的,而 GeoLibre Toolbox 的表单是手写的。两套都建立在同一组参数类型上(packages/processing/src/types.ts):
| 类型 | 界面 | 例子 |
|---|---|---|
layer |
单图层下拉 | Input layer |
layers |
多选图层 | Merge layers |
number |
数字输入(可带 min/max/step) | Buffer distance |
string |
文本框 | Source CRS |
boolean |
复选框 | Dissolve output |
select |
下拉(options 提供值/标签) |
输出格式、统计方法 |
field |
字段下拉,依赖另一个 layer 参数的选中图层 | Group by field |
path |
路径输入 + 文件对话框(fileFilters 限定扩展名) |
输入/输出文件 |
field-weights |
多行权重编辑器(字段 + 归一化 + 权重 + 方向) | Composite score |
三个”条件显示”能力让长表单变得可用:
| 机制 | 效果 |
|---|---|
required |
必填;缺失时报 Missing required parameter: <label> |
geometryFilter |
把图层下拉限制在点/线/面,例如 Buffer 只列有几何的图层 |
visibleWhen |
只有另一个参数取到(或不在)某组值时,该字段才显示;隐藏的字段也跳过必填校验 |
description |
字段下方的帮助文字 |
12.5.2 三种”智能参数”
参数名与类型会被进一步识别,换成专门的控件:
| 识别规则 | 变成 | 说明 |
|---|---|---|
名字以 epsg / epsg_code 结尾、类型为 int/double |
CRS 选择器(Browse + 检索) |
覆盖 epsg(Assign Projection)、dst_epsg(Reproject)、output_epsg 等;字符串型的 CRS 覆盖参数不在此列 |
名字形如 *_field / *_attribute、类型为 string |
字段下拉 | 从对应图层参数选中的图层里取属性名;接口约定里约有 170 个工具用到 |
名字形如 *_dist / *_radius / spacing / tolerance 且类型为 double |
距离 + 单位选择器 | 整数参数不享受此待遇(换算后多为小数) |
距离单位这一项要特别说明,因为它是”结果差一万倍”的常见来源:
| 选项 | 说明 |
|---|---|
| Degrees | 直接把数字当度传给工具 |
| Meters / Kilometers / Feet / Miles | 按选中图层的纬度换算成度再传 |
对话框会显示换算结果与提示 Sent to the tool as N°, converted at <lat>. A degree varies with latitude and direction, so this is approximate.。这条便利只在所有数据集输入都是地图图层的内存 GeoJSON 时提供——理由是 RFC 7946 固定了这些坐标是 WGS84;一旦有栅格、LiDAR 或文件路径输入,坐标单位就不可知,选择器不会出现。
12.5.3 文件与输出
path参数带 Choose file 按钮与扩展名过滤;- 数据输入参数(
raster_in、vector_in、lidar_in、file_in)与输出参数(*_out)总是带路径选择; - 矢量输出有格式下拉:
GeoJSON (add to map)、GeoParquet (download, keeps CRS)、FlatGeobuf、Shapefile; - 输出文件名会按工具与输入自动给一个默认值。
12.6 运行、进度、取消与历史
12.6.1 一次运行的完整过程
- 选工具(菜单、搜索、命令面板或深链接);
- 填参数——必填项标
required; - 选引擎(矢量工具的引擎选择器,或 Whitebox 的 Run locally (WASM));
- Run;
- 状态在 Pending → Running → Succeeded / Failed 之间变化,右侧日志滚动;
- 结果落图;栅格是 COG,LiDAR 是点云图层;
- 一次运行写入 Processing → History。
12.6.2 进度与取消
- 长任务(网络分析、大栅格、LiDAR)在运行中可取消;取消通过
AbortSignal传给工具,网络请求会被中止; - Whitebox 的 sidecar 路径是”提交任务 + 轮询”模型,所以取消意味着停止轮询并通知 sidecar;
- 关闭对话框不保证后台任务停止——矢量工具的取消是显式的按钮,不是关窗。
12.6.3 结果落图
| 结果类型 | 落图方式 |
|---|---|
| 矢量 | 新 GeoJSON 图层;可用 ResultLayerOptions.graduatedField 让宿主自动按某字段分级着色(Composite score 就是这么做的) |
| 栅格 | COG 图层 |
| LiDAR | 点云图层(必要时转 COPC) |
| 文件型输出 | 下载/写入,不加入地图 |
多数工具在完成后会 fitBounds 到结果范围;可以在 Settings → Map Preferences 里关掉”添加数据后自动缩放”(zoomToNewLayers)。
12.6.4 Processing History
Processing → History 记录本项目里的每一次处理运行,新的在前:
| 列 / 动作 | 说明 |
|---|---|
| 工具 | 工具名与 id |
| 引擎 | 在哪个引擎上跑的(客户端 / WASM / sidecar / Pyodide) |
| 时长 | 跑了多久 |
| 输入 / 输出 | 进了哪些图层、出了哪些图层 |
| Re-run | 用同样参数再跑一次 |
| Edit & re-run | 打开工具并带入同样的参数 |
| Copy JSON | 复制这次运行的 JSON 描述 |
| Copy Python | 复制等价的 geolibre Python 代码 |
两套工具箱写的是同一个历史,右键快速分析(buffer / drive-time / viewshed)也写进去。Clear history 清空;工具下线后再点 Re-run 会提示 Tool "<id>" is no longer available。
提示:Copy Python 是”把手工操作变成脚本”的最短路径。先在界面里把参数调对,再复制 Python,比直接写脚本试参数快得多。
12.7 转换工具与云原生输出
Processing → GeoLibre Toolbox → Conversion 有 9 个工具,全部围绕”写出现代格式”:
| 工具 | 输出 |
|---|---|
| Vector to Vector | 任意 DuckDB spatial 支持的格式;输入输出格式由扩展名判断 |
| Vector to GeoParquet | Hilbert 排序、压缩的 GeoParquet |
| Vector to FlatGeobuf | Hilbert 排序、云优化、带空间索引 |
| Vector to Shapefile | Hilbert 排序、打包成 zip(字段名截断到 10 字符) |
| Vector to GeoPackage | Hilbert 排序,方便交给 QGIS/ArcGIS |
| CSV to GeoParquet | 带坐标的 CSV → GeoParquet |
| Vector to PMTiles | 矢量瓦片档案 |
| Raster to PMTiles | 单波段经色带渲染成 Web Mercator PNG 瓦片档案 |
| Raster to COG | Cloud-Optimized GeoTIFF |
12.7.1 为什么要 Hilbert 排序
Hilbert 曲线把二维空间上邻近的要素映射到一维上邻近的位置,于是文件里的要素按空间局部性排列。对带空间索引/范围读取的格式(FlatGeobuf、GeoParquet)来说,这意味着按视口读时命中更少的页。这就是那三个工具都强调 “Hilbert-sorted” 的原因。
12.7.2 引擎与格式矩阵
| 浏览器 | 桌面(sidecar) | |
|---|---|---|
| Vector to Vector 可写格式 | GeoJSON、CSV、GeoParquet、GeoPackage、FlatGeobuf、Shapefile | 任意 GDAL 格式(FlatGeobuf、GeoPackage、Shapefile、KML、GML、SQLite…) |
| 其余转换 | 有客户端引擎 | 优先 sidecar |
| Raster to PMTiles | ✅ | ✅ 但没有 sidecar 端点,永远走 WASM |
对话框的状态行会写明它准备用哪个引擎。所有 Conversion 工具都有客户端引擎,所以在浏览器与 Mac App Store 构建上都能用。
12.7.3 输出位置的限制
sidecar 可以把转换的输入与输出限制在白名单目录里,通过 GEOLIBRE_CONVERSION_ROOTS 设置(Docker 镜像默认 /data)。桌面版不设这个变量——路径就是你自己的文件系统,没有什么要限制的。Docker 必须设,因为那里的 sidecar 通过 nginx 同源可达,不能让它读写容器里任意路径。
警告:Processing → Conversion(分隔线以上那个)是 Whitebox 的转换分类,与这里讲的 GeoLibre Toolbox → Conversion 不是一回事。两处都有 “Vector to PMTiles” 与 “Raster to PMTiles”,但对话框、参数、输出都不一样。
12.8 侧车(sidecar)与 extras
12.8.1 它是什么
一个本地 FastAPI 服务(127.0.0.1:8765),桌面版按需启动,可选。它承担三类工作:
- 栅格工具(rasterio);
- sidecar 版转换工具;
- 可选的 GeoPandas 矢量引擎。
Whitebox 工具箱可以用它,但不需要它(默认走 WASM)。矢量工具的客户端引擎与浏览器版转换也不需要。
12.8.2 安装与 extras
基础安装刻意做得很小,每组工具一个 extra:
cd backend/geolibre_server
python -m venv .venv
source .venv/bin/activate
pip install -e .
# 转换工具(DuckDB、rio-cogeo、freestiler)
pip install -e ".[conversion]"
# 矢量工具,GeoPandas 引擎(GeoPandas、Shapely)
pip install -e ".[vector]"
# 栅格工具(rasterio、numpy、contourpy)
pip install -e ".[raster]"
# AI Segmentation 代理(只是 HTTP 客户端;模型在 samgeo-api)
pip install -e ".[ml]"
从仓库根目录安装时用完整路径,例如 pip install -e "backend/geolibre_server[conversion]"。另有 sedona extra(SedonaDB sidecar,第11章)与 mssql extra(SQL Server)。
运行:
uvicorn geolibre_server.app.main:app --host 127.0.0.1 --port 8765
sidecar 会自举一个受管运行时;要复用当前环境,设 GEOLIBRE_CONVERSION_PYTHON=$(which python)。
12.8.3 自动回退
| 场景 | 行为 |
|---|---|
矢量工具的 sidecar 引擎不可用 / 缺 vector extra |
对话框回退到客户端引擎(Turf.js) |
| 转换工具有浏览器引擎 | sidecar 缺席时自动走客户端 |
| 栅格工具没有客户端引擎 | 直接不可用,需要 sidecar |
| 浏览器构建 | sidecar 通过 /sidecar 同源代理(需自托管部署提供),否则只有客户端引擎 |
12.8.4 状态检测
Whitebox 对话框会显示 Checking runtime. → N tools available. 或 Whitebox runtime is unavailable.;sidecar 模式下还有 Start server / Stop server 按钮。CORS 只对 localhost:5173 与 Tauri 的 origin 开放,所以从别的端口提供 Web 构建时 sidecar 会拒绝。
12.8.5 amd64 限制
freestiler 与 whitebox-workflows 没有发布 linux/arm64 的 wheel,所以在 amd64 上才会安装;在 arm64 上 sidecar 会把这些工具报告为不可用。这不影响浏览器自己的 PMTiles 与 Whitebox 引擎——它们是 WebAssembly,任何架构都能跑。
提示:遇到”某些转换工具在 arm64 上灰掉”不是配置错误,而是上游 wheel 的架构限制。用 WASM 引擎或换 amd64 主机即可。
12.9 批处理与输出
12.9.1 Batch tools
Processing → GeoLibre Toolbox → Batch tools 有两个模式:
| 模式 | 行为 |
|---|---|
| Batch | 选一个矢量工具 + 多个输入图层,共用其余参数,逐层运行;中途取消会报告”已添加 N/M 个图层” |
| Models | 把工具链起来,每步输出喂给下一步;链随项目保存 |
两个模式都建立在客户端矢量工具之上,都跑客户端引擎。
12.9.2 与 Model Builder 的分工
| Batch tools → Models | Model Builder | |
|---|---|---|
| 形态 | 表单里的线性链 | 画布上的有向图 |
| 支持的数据 | 矢量工具 | 客户端矢量工具 + Whitebox 目录(可含栅格链) |
| 校验 | 运行时报错 | 构建时检查缺输入、未连端口、类型不匹配、环 |
| 导出 | 随项目保存 | 随项目保存、Import/Export 文件、Copy Python script |
图形化建模的完整内容见 第13章 模型构建器与自动化工作流。
12.9.3 输出到底去了哪
| 输出 | 位置 |
|---|---|
| 矢量(默认) | 新图层,随工程保存(不落盘) |
| 矢量(选 GeoParquet/FlatGeobuf/Shapefile) | 下载目录(桌面版写到对话框里的路径) |
| 栅格 | 新 COG 图层;导出时可在 Layer actions → Export 里存成 GeoTIFF |
| LiDAR | 点云图层;需要文件时用图层的 Export 存 LAS/LAZ/COPC |
| 转换工具的产物 | 一律写文件,不加入地图 |
警告:浏览器版”写文件”最终是下载。批量转换几十个文件时,浏览器会连续触发下载,需要允许”多文件下载”,否则只有第一个成功。
12.10 常见错误与限制
| 现象 | 原因 | 处理 |
|---|---|---|
Whitebox runtime is unavailable. |
WASM 运行时加载失败 | 刷新页面;或取消 Run locally (WASM) 改用 sidecar |
Could not load the local (WASM) tool runner… |
本地运行器加载失败 | 刷新重试;桌面版可改用 sidecar |
Could not load Whitebox catalog snapshot. |
目录清单缺失 | 检查构建完整性;页面上若显示 Showing GitHub catalog only. 说明回退到了在线清单 |
The sidecar cannot read browser-selected files for <参数>. |
侧车模式选了一个”浏览器里选的文件” | 勾回 Run locally (WASM),或填 sidecar 能访问的文件系统路径 |
Missing required parameter: <label> |
必填项空着 | 填上;注意被 visibleWhen 隐藏的字段不参与校验 |
Layer "<name>" has no in-memory GeoJSON… |
选了瓦片/远程图层 | 换成真正的矢量图层,或先物化成 GeoJSON |
Layer "<name>" is not fetchable… |
图层无法提供给该引擎 | 同上 |
| 转换报”路径不允许” | 触到 GEOLIBRE_CONVERSION_ROOTS 白名单 |
输出到白名单目录内,或自托管时调整该变量 |
| arm64 上部分转换工具不可用 | freestiler / whitebox-workflows 无 arm64 wheel |
用 WASM 引擎,或改用 amd64 |
| 侧车启动失败但浏览器能用 | 只有客户端引擎在跑 | 检查 uvicorn 是否在 8765、CORS origin 是否匹配 |
| 投影输出的矢量不加入地图 | projectedHint:地图只显示 EPSG:4326 |
输出 4326,或改用矢量工具 |
| 缓冲半径明显不对 | Client 引擎按度计算 | 换 Sidecar/Pyodide,或用距离单位选择器 |
12.10.1 三条硬边界
- 引擎决定能力:WASM 引擎读不了任意本机路径;sidecar 读不了浏览器里选的文件;两者不能互相替代。
- 浏览器版没有 sidecar 的格式广度:
Vector to Vector在浏览器里只写六种格式。 - Whitebox 的矢量输出不是”图层”:默认格式是 GeoJSON 才加入地图,其余格式只下载。
12.11 本章小结
- 两套工具箱:Whitebox(1,000+ 工具、单一对话框、WASM 优先)与 GeoLibre Toolbox(手写对话框、Turf.js/Pyodide/sidecar 引擎)。菜单里 Vector/Raster/Conversion 各出现两次,不是重复。
- GeoLibre Toolbox 的 Vector 分 Geometry / Overlay / Join / Select / Movement & time / Data management / Data quality 七组;Reproject 与投影感知的缓冲需要 Sidecar 或 Pyodide。
- Raster 有八个工具能在浏览器跑(Hillshade、Slope、Aspect、Clip by extent、Raster calculator、Spectral index、Reclassify、Focal statistics),其余需要 rasterio sidecar。
- Whitebox 目录自动生成,仓库快照 1,068 个工具、9 个分类;Projection 只有 4 个工具。
- Run locally (WASM) 决定引擎:浏览器默认勾选、桌面默认不勾、MAS 构建没有这个选项。
- 参数表单从清单生成:layer / number / string / boolean / select / field / path / field-weights;
epsg参数变 CRS 选择器,*_field变字段下拉,double 型的距离参数带单位换算器。 - 距离换算依赖 WGS84 假设:只要有栅格/LiDAR/文件路径输入,单位选择器就不出现——因为坐标单位不可知。
- Processing History 统一记录两套工具箱与快速分析,提供 Re-run、Edit & re-run、Copy JSON、Copy Python。
- Conversion 九个工具全部有客户端引擎,Hilbert 排序是为了范围读取效率;
Vector to Vector在桌面能写任意 GDAL 格式,浏览器只写六种;Raster to PMTiles永远走 WASM。 - sidecar 可选:extras 为
conversion/vector/raster(另有ml、sedona、mssql),失败自动回退,GEOLIBRE_CONVERSION_ROOTS限制转换路径,arm64 上缺两个 wheel。 - 批处理两条路:Batch tools 的 Batch(多图层)与 Models(链式),对比 Model Builder 的图形态。
- 输出分三类:落图(矢量/栅格/LiDAR)、下载文件(非 GeoJSON 的矢量输出、所有转换产物)、以及”投影结果不加入地图”这条刻意设计。
12.12 实践练习
-
分清两套工具箱:从 Processing → Vector → GeoLibre (WASM) 打开一个工具,记录对话框标题与参数控件;再从 Processing → GeoLibre Toolbox → Vector → Buffer 打开,比较两者的引擎选择器、工具列表与输出方式,写一段话说明为什么它们不是重复实现。
-
引擎差异:对同一个面图层做 1000 米缓冲,分别用 Client (Turf.js) 与 Python (Pyodide),比较结果范围与面积;解释为什么客户端引擎的结果大得离谱,以及对话框的距离单位选择器如何缓解这个问题。
-
CRS 参数:打开 Processing → Projection → Reproject Vector,观察
dst_epsg参数的 Browse 按钮,用utm 17n搜出两个候选并选一个;再打开 Assign Projection Vector,比较两者的参数与”是否真的改坐标”。 -
转换与体积:把同一个图层分别转成 GeoParquet、FlatGeobuf、GeoPackage 与 Zipped Shapefile,记录四份文件的大小与字段名;解释 Shapefile 的字段名变化原因,以及为什么前两者强调 “Hilbert-sorted”。
-
历史与复现:随便跑三个工具(一个矢量、一个栅格、一个转换),打开 Processing → History,对其中一条用 Edit & re-run 改一个参数再跑,然后用 Copy Python 把结果贴进 Python 控制台执行,比较两种方式的结果是否一致。
-
缺依赖排查:在浏览器构建里打开 GeoLibre Toolbox → Raster → Contour,记录引擎选择器的可选值;再打开 Reproject,记录两者差异,并说明哪些工具必须有 sidecar、为什么浏览器版无法提供。
延伸阅读
- 仓库文档:
docs/user-guide/processing.md、docs/tutorials/vector-analysis.md、docs/tutorials/terrain-analysis.md、docs/architecture.md(Python sidecar)、docs/getting-started.md(Optional extras) - 源码:
packages/processing/src/{types,registry,runner,vector-tools,vector-tool-runner,wasm-tool-runner,raster-client,sidecar-client}.ts、apps/geolibre-desktop/src/lib/{whitebox-menu-catalog,whitebox-tool-url,whitebox-semantic-search,processing-params}.ts、apps/geolibre-desktop/src/components/processing/ - 相关章节:第11章 SQL 工作区与 DuckDB 空间分析、第13章 模型构建器与自动化工作流、第14章 地形与水文分析、第15章 矢量空间分析