跟着案例学QGIS二次开发:基于QGIS的自动化数据质量检查工具

案例背景

项目名称:基于QGIS的自动化数据质量检查工具
行业背景:GIS数据处理中常因坐标系错误、几何无效或属性缺失导致分析失败。传统人工检查耗时且易遗漏,需开发自动化工具实现批量检查。


开发设计

目标功能
  1. 检查矢量数据的几何有效性(如自相交、悬挂点)
  2. 验证属性字段完整性(非空值、唯一性)
  3. 检查坐标系一致性
  4. 生成HTML格式检查报告
技术选型
  • Python 3.9 + PyQt5(界面开发)
  • QGIS 3.28 API(地理处理)
  • HTML/CSS(报告模板)
系统架构
├── CoreChecker.py       # 核心检查逻辑
├── ReportGenerator.py   # 报告生成模块
├── ui_dialog.py         # PyQt界面文件(由Qt Designer生成)
└── metadata.txt         # 插件元数据

详细实现流程

步骤1:环境配置
  1. 安装QGIS Desktop 3.28
  2. 安装插件开发工具链:
    pip install pyqt5 qgis-plugin-builder3
    
  3. 配置PyCharm:添加QGIS Python库路径(通常位于C:\Program Files\QGIS 3.28\apps\Python39
步骤2:创建插件框架
  1. 使用Plugin Builder 3生成基础代码:
    pb_tool create
    # 输入插件名称:DataQualityChecker
    # 选择模板:Dialog with Tools
    
  2. 修改metadata.txt
    [general]
    name=Data Quality Checker
    qgisMinimumVersion=3.16
    description=Automated GIS data validation toolkit
    
步骤3:设计用户界面(使用Qt Designer)
  1. 创建check_dialog.ui文件,包含:
    • 图层选择下拉框(QComboBox)
    • 检查项多选框(QCheckBox:"几何检查","属性检查","坐标系检查")
    • 结果显示文本框(QTextEdit)
    • 运行按钮(QPushButton)
  2. 编译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:调试与测试
  1. 在QGIS Python控制台运行:
    from DataQualityChecker import DataQualityCheckerPlugin
    plugin = DataQualityCheckerPlugin(iface)
    plugin.initGui()
    
  2. 测试数据准备:故意创建包含以下问题的测试图层:
    • 包含自相交的多边形
    • 有空值的必填字段
    • 混合坐标系的数据
步骤8:打包发布
  1. 生成ZIP包:
    pb_tool zip
    
  2. 通过QGIS插件管理器安装本地ZIP包

关键代码解释

  1. 图层选择实现

    self.combo_layer.setFilters(QgsMapLayerProxyModel.VectorLayer)
    

    自动过滤显示矢量图层

  2. 异步处理优化

    from qgis.PyQt.QtCore import QThread
    class CheckThread(QThread):
        finished = pyqtSignal(list)
        def run(self):
            # 执行耗时检查操作
            self.finished.emit(errors)
    

注意事项

  1. 版本兼容性:确保QGIS API调用与目标版本匹配
  2. 异常处理:添加try-except块处理空图层/字段不存在等情况
  3. 性能优化:对大型数据集使用分批处理(每1000要素提交一次进度)

通过以上步骤,学习者可以完整实现一个企业级数据检查工具。实际开发中可根据需求扩展以下功能:

  • 添加空间拓扑关系检查(如面层不能重叠)
  • 集成数据库连接支持PostGIS检查
  • 增加自定义检查规则配置文件(JSON/YAML)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值