前言
這篇文章里,我們要完成一些數據的合並,計算等操作。
准備工作
首先要了解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,可以讓電腦完成更多的事情,需要記者自行去挖掘。