本节摘要:桌面 GIS 是数据处理和分析的重器。本节讲 QGIS 二次开发、ArcGIS Pro、插件开发——把桌面 GIS 变成你的工具。
阅读完本节,你应当能够:
桌面 GIS 是数据处理、分析、制图的重器,适合:

| 平台 | 特点 | 二开 |
|---|---|---|
| QGIS | 开源免费 | PyQGIS Python 插件 |
| ArcGIS Pro | 商业,功能全 | ArcPy/.NET SDK |
| GRASS/SAGA | 开源专业分析 | 命令行/集成 |
QGIS 插件用 Python,通过 PyQGIS API 操作:
from qgis.core import QgsProject, QgsVectorLayer # 加载图层 layer = QgsVectorLayer("path.shp", "layer_name", "ogr") QgsProject.instance().addMapLayer(layer) # 调用处理算法 from qgis import processing result = processing.run("native:buffer", { 'INPUT': layer, 'DISTANCE': 500, 'OUTPUT': 'memory:' })
插件结构:
metadata.txt:插件元数据__init__.py:入口main_plugin.py:主逻辑ui_dialog.ui:Qt Designer 界面QGIS 处理框架(Processing Framework)是核心,提供几百个算法,插件可调用:
# 批量裁剪 for f in layers: processing.run("native:clip", { 'INPUT': f, 'OVERLAY': mask, 'OUTPUT': f'out/{f.name()}.shp' })
也可自定义算法加到处理框架,供其他工具调用。
import arcpy arcpy.Buffer_analysis("roads.shp", "roads_buffer.shp", "500 Meters")
ArcPy 是 ArcGIS 的 Python API,功能全但商业授权。
⚠️ 常见坑:QGIS 插件不处理版本兼容——QGIS 升级 API 变,插件失效。注明兼容版本,跟进 API 变化。
💡 关键直觉:桌面 GIS 是数据处理重器。开源用 QGIS(PyQGIS 插件),商业用 ArcGIS Pro(ArcPy)。核心是处理框架,可调算法也可自定义。二开做自动化、自定义工具、界面扩展。
一个最小插件至少有四个文件,理解它们才能写出可维护的插件:
my_plugin/ ├── metadata.txt # 插件元数据:名称、版本、QGIS 最低版本 ├── __init__.py # 入口,暴露 classFactory 函数 ├── my_plugin.py # 主类,负责工具栏按钮和逻辑 └── my_plugin_dialog.py # 对话框界面逻辑
# metadata.txt 关键字段 [general] name=My Plugin qgisMinimumVersion=3.28 version=1.0.0 description=批量处理图层
# __init__.py 入口 def classFactory(iface): from .my_plugin import MyPlugin return MyPlugin(iface)
开发时把插件目录放到 QGIS 的插件目录(Python 插件管理里能看到"已安装"),改代码后重启 QGIS 生效。调试用 QGIS 内置的 Python 控制台最方便,可以逐行调 PyQGIS API。
不开发完整插件,用 QGIS Python 控制台也能完成大量日常自动化:
from qgis.core import QgsVectorLayer, QgsProject, QgsVectorFileWriter # 打开图层 layer = QgsVectorLayer("parcels.shp", "parcels", "ogr") QgsProject.instance().addMapLayer(layer) # 按属性筛选并导出 expr = QgsExpression("landuse = '住宅'") selected = layer.getFeatures(QgsFeatureRequest(expr)) # 用 processing 导出 from qgis import processing processing.run("native:extractbyexpression", { 'INPUT': layer, 'EXPRESSION': "landuse = '住宅'", 'OUTPUT': 'residential.shp' })
这类脚本可以直接挂到 QGIS 的"处理工具箱"里,或放进批处理流程,是内业数据生产的高效工具。
当现成算法不够用时,可以写自定义 Processing 算法,这样它能出现在工具箱里,被模型构建器和批处理调用:
from qgis.core import (QgsProcessingAlgorithm, QgsProcessingParameterVectorLayer) class MyAlgorithm(QgsProcessingAlgorithm): def initAlgorithm(self, config=None): self.addParameter(QgsProcessingParameterVectorLayer('INPUT', '输入图层')) # 再定义输出、处理逻辑 def processAlgorithm(self, parameters, context, feedback): layer = self.parameterAsVectorLayer(parameters, 'INPUT', context) # 在这里写核心处理代码 return {'OUTPUT': result}
第 6 章结束。下一章讲 GIS 高级主题。