zoukankan      html  css  js  c++  java
  • QGis 利用Python Console编写脚本进行批量处理

    前言

    这篇文章里,我们要完成一些数据的合并,计算等操作。

    准备工作

    首先要了解Qgis的编程模型,具体参考文章QGIS里的编程模型及《Qgis里的查询过滤》。了解了Qgis的原型结构与编程方法,我们就可以动手操作了。

    任务目标

    1、将分散的Gps点合并到空间数据库

    2、将新增的点位与其所在的线路关联,以方便应用中的检索

    任务分析

    数据库中存在两个表格,一个是点位的数据,另一个是道路的数据。其数据结构分别如下:

    点位字段结构

    道路字段结构

    点位通过一个字段LDBH与道路进行关联。

    采集过来的点位数据为原始的GPS数据,且字段格式与数据库中点位并不一致,且采集过的数据可能与数据库的存在重复。

    基本思路

    由于数据结构不一样,只能通过新增的方式将采集的数据合并到数据库中,并比较点位的位置,如果过于接近(10m)以内,则认为是同一个点。根据Qgis的编程模型,查询点位可以用QgsVectorLayer.getFeatures()方法去检索对比,增加要素使用QgsVectorLayer.addFeature()。用这两方法基本上就可以完成上述的任务。

    编程步骤

    1、定位图层

    采集的数据转换为csv文件,添加到Qgis项目中,可以通过UI添加,也可以使用脚本加载。

    这里通过图层名称进行定义(前提不要有同名的图层):

    for node in nodes:

    if node.layer().name()==ln:

    csvlayer=node.layer()
    
        #...
        if node.layer().name()==unicode('本地站点','utf-8'):
            lstoplayer=node.layer()
        #....

    这里迭代所有的图层,找到符合条件的图层,以便后续操作。

    2、坐标转换

    由于数据库中存放的城建坐标,而采集的数据是GPS坐标,因为需要对采集的数据进行坐标转换:

    crsSrc = QgsCoordinateReferenceSystem(4326)
    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj4("+proj=tmerc +lat_0=31.23 +lon_0=121.46 +k=1 +x_0=-680 +y_0=-610 +ellps=krass +units=m +no_defs")
    xform = QgsCoordinateTransform(crsSrc, crs)

    创建一个WGS的坐标系引用表示,再合建一个城建坐标系引用,再创建一个坐标转换对象进行点位转换:

    for nstop in csvlayer.getFeatures():
        gps= nstop.geometry().asPoint()
        stoppoint =xform.transform(gps)
    stoppoint 为GPS点位对应的城建坐标点。

    3、关联道路

    dis1=20
            rect=QgsRectangle(stoppoint.x()-dis1,stoppoint.y()-dis1,stoppoint.x()+dis1,stoppoint.y()+dis1)
            lines= linelayer.getFeatures(QgsFeatureRequest(rect))
            ldbh=''
            for line in lines:
                ldbh=line['LDBH']

    查找20米范围里的道路,如果找到读取其编号。

    4、创建要素

     if caps & QgsVectorDataProvider.AddFeatures:
                feat = QgsFeature(lstoplayer.pendingFields())
                feat.setAttribute('GLH', glh)
                feat.setAttribute('SZDLBH', ldbh)
                feat.setAttribute('ZDLB', 0)
                feat.setAttribute('SFYDZZP',0)
                feat.setAttribute('SFGWS', 0)
                feat.setAttribute('SFYHCT',0)
                feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(stoppoint.x(), stoppoint.y())))
                (res, outFeats) = lstoplayer.dataProvider().addFeatures([feat])

    创建要素,并增加到图层中。

    结束语

    至此,一个简单的批量数据处理的过程就算完成了。利用Qgis的脚本功能,可以省去大量的体力劳动。借助Python,可以让电脑完成更多的事情,需要记者自行去挖掘。

  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/icoolno1/p/7240472.html
Copyright © 2011-2022 走看看