第十四章:多后端系统详解
GeoPipeAgent 的多后端架构允许同一个 YAML 流水线在不同的 GIS 工具引擎上执行。本章详细介绍 7 种后端的特点、配置和使用场景。
14.1 后端架构设计
所有后端都继承自 GeoBackend 抽象基类,实现统一接口:
class GeoBackend(ABC):
def name(self) -> str # 后端标识符
def is_available(self) -> bool # 检测依赖是否已安装
def buffer(...) # 缓冲区
def clip(...) # 裁剪
def reproject(...) # 投影转换
def dissolve(...) # 融合
def simplify(...) # 简化
def overlay(...) # 叠加分析
BackendManager 在首次使用时检测所有后端的可用性,并缓存结果:
class BackendManager:
def default() -> BackendManager: # 单例,自动检测可用后端
def get(preferred=None) -> GeoBackend: # 获取指定或默认后端
默认后端选择逻辑:BackendManager.get() 不带参数时,返回 backends 列表中第一个可用后端(优先级按 _BACKEND_CLASSES 定义顺序)。通常情况下 native_python 始终可用并排在第一位。
14.2 七种后端详解
14.2.1 native_python:GeoPandas + Shapely
最常用的默认后端,纯 Python 实现,基础安装即可使用。
| 属性 | 说明 |
|---|---|
| 标识符 | native_python |
| 依赖 | geopandas, shapely(随基础安装自动安装) |
| 性能 | 适合中小数据量(万级要素以内) |
| 数据传输 | 无 I/O 开销(内存直接传递 GeoDataFrame) |
工作原理:直接调用 gdf.buffer(distance)、gdf.clip(clip_gdf) 等 GeoPandas/Shapely 方法,无需文件 I/O,速度快。
14.2.2 gdal_cli:GDAL 命令行工具
调用 ogr2ogr 等 GDAL CLI 命令处理数据,适合大文件或需要精确 GDAL 行为的场景。
| 属性 | 说明 |
|---|---|
| 标识符 | gdal_cli |
| 依赖 | GDAL CLI 工具(ogr2ogr、gdalwarp 等)在 PATH 中 |
| 安装 | Ubuntu: apt-get install gdal-bin;macOS: brew install gdal |
| 检测 | 通过 shutil.which("ogr2ogr") 检测 |
| 性能 | 大文件性能优异(流式处理),但有文件 I/O 开销 |
工作原理:将 GeoDataFrame 写入临时文件 → 构建 ogr2ogr 命令 → 执行 → 读取输出临时文件 → 删除临时文件。
# 使用 GDAL CLI 后端处理大型 Shapefile
- id: reproject-large
use: vector.reproject
params:
input: "$load-big-data"
target_crs: "EPSG:4549"
backend: gdal_cli
14.2.3 gdal_python:GDAL/OGR Python 绑定
使用 GDAL Python 绑定(osgeo.ogr)直接调用 GDAL API,提供比 CLI 更细粒度的控制。
| 属性 | 说明 |
|---|---|
| 标识符 | gdal_python |
| 依赖 | osgeo Python 包(from osgeo import ogr) |
| 安装 | Ubuntu: apt-get install python3-gdal;或 pip install GDAL |
| 检测 | import osgeo.ogr |
14.2.4 qgis_process:QGIS Processing CLI
调用 qgis_process 命令行工具,使用 QGIS Processing 算法执行空间分析,兼容 QGIS 生态系统插件。
| 属性 | 说明 |
|---|---|
| 标识符 | qgis_process |
| 依赖 | QGIS Desktop 安装,qgis_process 在 PATH 中 |
| 安装 | 参考 QGIS 官网,Windows/macOS/Linux 均支持 |
| 检测 | shutil.which("qgis_process") |
| 优势 | 可使用所有 QGIS 内置和第三方插件算法 |
# 使用 QGIS Processing 后端
- id: buffer-qgis
use: vector.buffer
params:
input: "$load-data"
distance: 100
backend: qgis_process
14.2.5 pyqgis:PyQGIS Python API
通过 QGIS 的 Python API(PyQGIS)执行操作,适合需要 QGIS 高级功能的场景。
| 属性 | 说明 |
|---|---|
| 标识符 | pyqgis |
| 依赖 | QGIS Python 绑定(from qgis.core import QgsApplication) |
| 检测 | import qgis.core |
| 注意 | 通常需要 QGIS 安装并配置 Python 环境变量 |
14.2.6 generic_cli:通用命令行后端
最灵活的后端,允许执行任意命令行命令,通过标准输入/输出或文件参数传递数据。
| 属性 | 说明 |
|---|---|
| 标识符 | generic_cli |
| 依赖 | 无额外依赖(始终可用) |
| 用途 | 集成任何支持文件输入输出的 GIS 工具(PostGIS 导出、MapServer、custom scripts 等) |
14.2.7 curl_api:HTTP/REST API 后端
通过 curl 调用 REST API,允许将云端 GIS 服务集成到流水线中。
| 属性 | 说明 |
|---|---|
| 标识符 | curl_api |
| 依赖 | curl 命令在 PATH 中 |
| 用途 | 调用 ArcGIS REST API、GeoServer WPS、自定义 GIS 微服务等 |
14.3 后端选择策略
步骤支持的后端
不同步骤支持不同的后端子集,通过步骤注册信息中的 backends 列表定义:
@step(
id="vector.buffer",
backends=["native_python", "qgis_process"], # 仅支持这两种后端
...
)
若指定了步骤不支持的后端,会使用步骤的默认后端。若步骤没有 backends(如 IO 步骤),则不使用后端(直接调用 GeoPandas/rasterio)。
查看各步骤支持的后端
# 表格格式查看(含 Backends 列)
geopipe-agent list-steps
# JSON 格式查看详细信息
geopipe-agent list-steps --format json
# 查看特定步骤的后端支持
geopipe-agent describe vector.buffer
不同场景的后端建议
| 场景 | 推荐后端 | 原因 |
|---|---|---|
| 日常分析(< 50 万要素) | native_python |
无需额外安装,速度快 |
| 大型 Shapefile(> 100 万要素) | gdal_cli |
流式处理,内存占用低 |
| 需要 QGIS 特有算法 | qgis_process |
完整 QGIS 算法库 |
| 调用 REST API 服务 | curl_api |
标准 HTTP 集成 |
| 集成自定义脚本 | generic_cli |
最大灵活性 |
14.4 检查可用后端
# 列出所有后端及其可用状态
geopipe-agent backends
输出示例:
[
{"name": "native_python", "available": true},
{"name": "gdal_cli", "available": true},
{"name": "gdal_python", "available": false},
{"name": "qgis_process", "available": false},
{"name": "pyqgis", "available": false},
{"name": "generic_cli", "available": true},
{"name": "curl_api", "available": true}
]
14.5 在流水线中使用多后端
同一流水线可以在不同步骤中指定不同后端:
pipeline:
name: "多后端混合流水线"
steps:
- id: load-data
use: io.read_vector
params: { path: "data/roads.shp" }
# 使用默认 native_python 后端
- id: query-major-roads
use: vector.query
params:
input: "$load-data"
expr: "road_class == 'highway'"
# 大型数据重投影使用 GDAL CLI 后端
- id: reproject-big
use: vector.reproject
params:
input: "$query-major-roads"
target_crs: "EPSG:3857"
backend: gdal_cli
# 缓冲使用默认 native_python
- id: buffer
use: vector.buffer
params:
input: "$reproject-big"
distance: 1000
14.6 后端不可用时的处理
当指定后端不可用时,BackendManager.get(preferred) 抛出 BackendNotAvailableError:
{
"error": "BackendNotAvailableError",
"message": "Backend 'qgis_process' is not available. Available: ['native_python', 'gdal_cli']"
}
最佳实践:在流水线中使用 on_error: fail 快速发现配置问题,而不是静默降级。
14.7 本章小结
本章详解了 GeoPipeAgent 的多后端架构:
BackendManager:单例模式自动检测可用后端,按优先级排列- 7 种后端:
native_python(默认)、gdal_cli、gdal_python、qgis_process、pyqgis、generic_cli、curl_api - 步骤级
backend字段:精确控制每个步骤使用的后端 - 后端选择策略:默认使用
native_python,大文件用gdal_cli,特殊算法用qgis_process