前言
最近使用GDAL對shape文件進行查詢,走了很多彎路,查看網上的代碼,發現很多代碼都是錯誤的,或者不詳細,浪費了很多時間。這裏簡單記錄一下使用GDAL查詢和讀取要素的代碼。
- python版本3.5
- GDAL版本2.1.0
代碼實現
讀取shape代碼
from osgeo import ogr
# 註冊所有的驅動
ogr.RegisterAll()
ds = ogr.Open(path, 0)
if ds is None: # 打開失敗
print "打開失敗"
return
# 獲取該數據源中的圖層個數,一般shp數據圖層只有一個,如果是mdb、dxf等圖層就會有多個
ilayercount = ds.GetLayerCount()
if ilayercount != 1:
print("圖層數量異常")
注意,網上有人寫的爲了支持中文路徑,代碼裏要加下面的代碼,我測試中文路徑是不需要添加下面的代碼的
# # 爲了支持中文路徑,請添加下面這句代碼
# gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
# # 爲了使屬性表字段支持中文,請添加下面這句
# gdal.SetConfigOption("SHAPE_ENCODING", "")
對shape做查詢代碼
下面以對shape中zwdm字段等於“07”的記錄做篩選你
# 獲取第一個圖層,一般shape只有一層
olayer = ds.GetLayerByIndex(0)
# 對圖層進行初始化,如果對圖層進行了過濾操作,執行這句後,之前的過濾全部清空
olayer.ResetReading()
# 進行查詢,如果status=0,則說明查詢生效,
status = olayer.SetAttributeFilter("zwdm= '07'")
注意,即使改shape有500條記錄,只要篩選成功,就默認shape中只有符合條件的記錄,逐個讀取這個shape也無法讀取到其他的記錄。
獲取要素數量
olayer.GetFeatureCount()
網上有人寫後面括號裏要輸入0,親測輸入0時,獲取的數量永遠是-1。
對圖層進行查詢後,此處獲取的是查詢後的數量
逐個讀取要素
ofeature = olayer.GetNextFeature() # 讀取第一個要素
# 下面開始遍歷圖層中的要素
while ofeature is not None:
# 獲取要素中的屬性表內容
zwdm = ofeature.GetFieldAsString("zwdm")
# ----各類操作
# 讀取下一個要素
ofeature = olayer.GetNextFeature()
這個讀取的代碼是比較坑的,之前看網上的代碼,while裏沒有寫讀取下一個要素的操作,我還以爲是自動會讀取下一個要素,結果寫出來的代碼無限循環了。
結束
最後希望大家少採坑吧