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

posted @ 2017-07-26 16:38  八爻老骥  阅读(5197)  评论(0编辑  收藏  举报