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,可以讓電腦完成更多的事情,需要記者自行去挖掘。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM