1. 程式人生 > >Python+OGR庫學習(二):讀取點向量檔案,複製特定屬性值點並另存為shp檔案

Python+OGR庫學習(二):讀取點向量檔案,複製特定屬性值點並另存為shp檔案

程式碼思路:

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,學習使用,如有意見,感謝指正