Python+OGR庫學習(二):讀取點向量檔案,複製特定屬性值點並另存為shp檔案
阿新 • • 發佈:2019-01-01
程式碼思路:
1、匯入相關庫包,切換到當前資料夾
2、註冊驅動,開啟點向量檔案,獲取圖層
3、建立輸出檔案,並獲取圖層(沒有屬性定義)
4、定義輸出圖層欄位屬性:假設已知檔案所有屬性欄位定義(即ID和cover)
(1)讀取輸入檔案中某一要素
(2)獲取ID、cover欄位定義
(3)新增定義到輸出圖層
(如果不知道屬性表具體欄位,可以參考前一篇文章獲取:https://blog.csdn.net/weixin_42924891/article/details/85269395)
PS:單純定義欄位屬性可以不明確欄位名稱,讀取欄位個數,以索引方式定義
5、讀取剛剛定義的圖層屬性表資訊
6、遍歷所有要素:
(1)獲取當前要素cover值
(2)如果滿足cover=‘trees’:
建立新要素,複製點到要素,寫入點的2個欄位值,要素新增到圖層,最後清除輸出要素
(3)清除臨時要素變數,並讀取下一要素
7、清除DataSource快取
關鍵點:主要操作物件為feature,前面把輸入檔案layer和輸出檔案layer相關定義好,再遍歷要素,對符合條件的要素進行復制,
程式碼:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- #匯入相關庫包 import ogr,os #切換到目標路徑 os.chdir(r'F:\Python+gdal\7weeks資料\7weeks資料\ospy_data1\ospy_data1') #讀取向量檔案 driver = ogr.GetDriverByName('ESRI Shapefile') inds = ogr.Open('sites.shp',0) inlayer = inds.GetLayer() #獲取檔案空間參考 spatial = inlayer.GetSpatialRef() #print(spatial) #建立輸出檔案 outfile = 'outsites.shp' outds = driver.CreateDataSource(outfile) outlayer = outds.CreateLayer('outsites',spatial,geom_type = ogr.wkbPoint) #獲取檔案欄位屬性 infeature = inlayer.GetNextFeature() idfielddefn = infeature.GetFieldDefnRef('id')##也可以從inlayer獲取欄位數,迴圈讀取兩個欄位屬性? coverfielddefn = infeature.GetFieldDefnRef('cover') #print(id) #輸出layer建立欄位 outlayer.CreateField(idfielddefn) outlayer.CreateField(coverfielddefn) #獲取輸出圖層屬性表資訊 outfeaturedefn = outlayer.GetLayerDefn() #遍歷要素 feature = inlayer.GetNextFeature() while feature: cover = feature.GetField('cover') if cover == 'trees': #如果符合條件,對應建立新的要素 newfeature = ogr.Feature(outfeaturedefn) geom = feature.GetGeometryRef() newfeature.SetGeometry(geom)#新增點 #新增點的欄位值 newfeature.SetField('cover',cover) newfeature.SetField('id',feature.GetField('id')) #新增要素到圖層 outlayer.CreateFeature(newfeature) newfeature.Destroy() feature.Destroy() feature = inlayer.GetNextFeature() inds.Destroy() outds.Destroy()
結果
1、輸入檔案屬性表
2、輸出檔案屬性表
*也可以用ExecuteSQL語句直接篩選出features返回layer,然後將layer中所有要素新增到新的shp,學習使用,如有意見,感謝指正