6.2 桌面 GIS 应用与插件开发


6.2 桌面 GIS 应用与插件开发

本节摘要:桌面 GIS 是数据处理和分析的重器。本节讲 QGIS 二次开发、ArcGIS Pro、插件开发——把桌面 GIS 变成你的工具。

读前必看(上)

阅读完本节,你应当能够:

  1. 选桌面 GIS 平台
  2. 用 QGIS 做二次开发
  3. 开发 GIS 插件

概念脉络

一、桌面 GIS 的角色

桌面 GIS 是数据处理、分析、制图的重器,适合:

  • 批量数据处理:转换、清洗、裁剪
  • 复杂空间分析:叠加、网络、统计
  • 专业制图:出图排版
  • 数据生产:矢量化、编辑

二、主流桌面 GIS

图 6-2 桌面 GIS 平台对比

图 6-2 桌面 GIS 平台对比

平台 特点 二开
QGIS 开源免费 PyQGIS Python 插件
ArcGIS Pro 商业,功能全 ArcPy/.NET SDK
GRASS/SAGA 开源专业分析 命令行/集成

三、QGIS 插件开发

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 界面

四、PyQGIS 核心 API

  • QgsProject:项目,管理图层
  • QgsVectorLayer / QgsRasterLayer:图层
  • QgsMapCanvas:地图画布
  • processing:处理框架,调算法
  • QgsProcessing:自定义算法

五、处理框架

QGIS 处理框架(Processing Framework)是核心,提供几百个算法,插件可调用:

# 批量裁剪 for f in layers: processing.run("native:clip", { 'INPUT': f, 'OVERLAY': mask, 'OUTPUT': f'out/{f.name()}.shp' })

也可自定义算法加到处理框架,供其他工具调用。

六、ArcPy(ArcGIS Pro)

import arcpy arcpy.Buffer_analysis("roads.shp", "roads_buffer.shp", "500 Meters")

ArcPy 是 ArcGIS 的 Python API,功能全但商业授权。

七、桌面 GIS 二开场景

  • 自动化流程:批处理脚本,重复任务自动化
  • 自定义工具:业务专用工具
  • 界面扩展:加菜单/按钮/对话框
  • 数据生产:矢量化辅助、质检工具
  • 专题应用:国土、规划、水利等行业应用

八、部署分发

  • QGIS 插件:打包 zip,通过插件管理器安装
  • 独立应用:PyQGIS + PyInstaller 打包 exe
  • ArcGIS:ArcPy 脚本工具箱、Add-in

⚠️ 常见坑:QGIS 插件不处理版本兼容——QGIS 升级 API 变,插件失效。注明兼容版本,跟进 API 变化。

💡 关键直觉:桌面 GIS 是数据处理重器。开源用 QGIS(PyQGIS 插件),商业用 ArcGIS Pro(ArcPy)。核心是处理框架,可调算法也可自定义。二开做自动化、自定义工具、界面扩展。

九、QGIS 插件项目的完整结构

一个最小插件至少有四个文件,理解它们才能写出可维护的插件:

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。

十、常用 PyQGIS 数据处理脚本

不开发完整插件,用 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}

十二、常见故障与排查

  • 插件按钮灰掉:通常是插件加载失败,查看 QGIS 消息日志(插件选项卡)里的 Python 报错。
  • API 版本不兼容:QGIS 3.x 内 API 也有小变化,报错信息会指出是哪个函数。用官方迁移指南对照修改。
  • 中文字体乱码:处理框架输出图层要指定编码,输出编码设为 UTF-8。
  • 性能慢:逐要素循环改用 QgsFeatureRequest 批量迭代,避免每次 getFeature 都重新查询。

本章回顾

  • 桌面角色:批量处理、复杂分析、专业制图、数据生产。
  • 主流平台:QGIS(开源/PyQGIS)、ArcGIS Pro(商业/ArcPy)、GRASS/SAGA。
  • QGIS 插件:Python + PyQGIS API,调处理框架。
  • PyQGIS:QgsProject/QgsVectorLayer/QgsMapCanvas/processing。
  • 处理框架:几百算法,可调可自定义。
  • 二开场景:自动化、自定义工具、界面扩展、数据生产、行业应用。
  • 部署:QGIS 插件 zip、独立应用 PyInstaller、ArcGIS Add-in。

第 6 章结束。下一章讲 GIS 高级主题。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U