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,可以让电脑完成更多的事情,需要记者自行去挖掘。

  • 相关阅读:
    协议分析 - DHCP协议解码详解
    在SqlServer2000的视图中小心使用*符号
    sql 将 varchar 值转换为数据类型为 int 的列时发生语法错误 的解决办法
    LECCO SQL Expert工具之优化sql语句
    css+js简单应用
    对任何一天是星期几算法的实现
    asp.net ajax 1.0 出现"sys"未定义解决方法
    js日历脚本
    在ASP.NET中重写URL
    在ASP.NET中重写URL (续篇)
  • 原文地址:https://www.cnblogs.com/icoolno1/p/7240472.html
Copyright © 2011-2022 走看看