案例背景
项目名称:基于QGIS的自动化数据质量检查工具
行业背景:GIS数据处理中常因坐标系错误、几何无效或属性缺失导致分析失败。传统人工检查耗时且易遗漏,需开发自动化工具实现批量检查。
开发设计
目标功能
- 检查矢量数据的几何有效性(如自相交、悬挂点)
- 验证属性字段完整性(非空值、唯一性)
- 检查坐标系一致性
- 生成HTML格式检查报告
技术选型
- Python 3.9 + PyQt5(界面开发)
- QGIS 3.28 API(地理处理)
- HTML/CSS(报告模板)
系统架构
├── CoreChecker.py # 核心检查逻辑
├── ReportGenerator.py # 报告生成模块
├── ui_dialog.py # PyQt界面文件(由Qt Designer生成)
└── metadata.txt # 插件元数据
详细实现流程
步骤1:环境配置
- 安装QGIS Desktop 3.28
- 安装插件开发工具链:
pip install pyqt5 qgis-plugin-builder3
- 配置PyCharm:添加QGIS Python库路径(通常位于
C:\Program Files\QGIS 3.28\apps\Python39
)
步骤2:创建插件框架
- 使用Plugin Builder 3生成基础代码:
pb_tool create # 输入插件名称:DataQualityChecker # 选择模板:Dialog with Tools
- 修改
metadata.txt
:[general] name=Data Quality Checker qgisMinimumVersion=3.16 description=Automated GIS data validation toolkit
步骤3:设计用户界面(使用Qt Designer)
- 创建
check_dialog.ui
文件,包含:- 图层选择下拉框(QComboBox)
- 检查项多选框(QCheckBox:"几何检查","属性检查","坐标系检查")
- 结果显示文本框(QTextEdit)
- 运行按钮(QPushButton)
- 编译UI文件为Python代码:
pyuic5 -o ui_dialog.py check_dialog.ui
步骤4:核心功能开发
几何检查模块(CoreChecker.py)
from qgis.core import QgsVectorLayer, QgsGeometry
def check_geometry(layer):
errors = []
for feature in layer.getFeatures():
geom = feature.geometry()
if not geom.isGeosValid():
error_msg = f"要素ID {feature.id()} 无效几何: {geom.lastError()}"
errors.append(error_msg)
return errors
属性检查模块
def check_attributes(layer, field_name):
unique_values = set()
errors = []
for feature in layer.getFeatures():
value = feature[field_name]
if not value:
errors.append(f"要素ID {feature.id()} 字段 {field_name} 为空")
if value in unique_values:
errors.append(f"值 {value} 重复")
unique_values.add(value)
return errors
步骤5:报告生成(ReportGenerator.py)
def generate_html_report(errors, output_path):
html = """
<html><head><style>
.error { color: red; margin: 5px; }
</style></head><body>
<h1>数据质量检查报告</h1>
"""
for error in errors:
html += f'<div class="error">⚠️ {error}</div>'
html += "</body></html>"
with open(output_path, 'w') as f:
f.write(html)
import webbrowser
webbrowser.open(output_path)
步骤6:界面逻辑绑定
# 在主对话框类中添加
def run_checks(self):
layer = self.combo_layer.currentLayer()
errors = []
if self.check_geometry.isChecked():
errors += CoreChecker.check_geometry(layer)
if self.check_attributes.isChecked():
errors += CoreChecker.check_attributes(layer, "required_field")
report_path = "/temp/report.html"
ReportGenerator.generate_html_report(errors, report_path)
self.text_result.setText("\n".join(errors))
步骤7:调试与测试
- 在QGIS Python控制台运行:
from DataQualityChecker import DataQualityCheckerPlugin plugin = DataQualityCheckerPlugin(iface) plugin.initGui()
- 测试数据准备:故意创建包含以下问题的测试图层:
- 包含自相交的多边形
- 有空值的必填字段
- 混合坐标系的数据
步骤8:打包发布
- 生成ZIP包:
pb_tool zip
- 通过QGIS插件管理器安装本地ZIP包
关键代码解释
-
图层选择实现:
self.combo_layer.setFilters(QgsMapLayerProxyModel.VectorLayer)
自动过滤显示矢量图层
-
异步处理优化:
from qgis.PyQt.QtCore import QThread class CheckThread(QThread): finished = pyqtSignal(list) def run(self): # 执行耗时检查操作 self.finished.emit(errors)
注意事项
- 版本兼容性:确保QGIS API调用与目标版本匹配
- 异常处理:添加try-except块处理空图层/字段不存在等情况
- 性能优化:对大型数据集使用分批处理(每1000要素提交一次进度)
通过以上步骤,学习者可以完整实现一个企业级数据检查工具。实际开发中可根据需求扩展以下功能:
- 添加空间拓扑关系检查(如面层不能重叠)
- 集成数据库连接支持PostGIS检查
- 增加自定义检查规则配置文件(JSON/YAML)