基於python和GDAL實現對shape文件要素進行查詢

前言

最近使用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裏沒有寫讀取下一個要素的操作,我還以爲是自動會讀取下一個要素,結果寫出來的代碼無限循環了。

結束

最後希望大家少採坑吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章