天天看點

Shapefile屬性操作之删

文章目錄

  • ​​開篇​​
  • ​​案例介紹​​
  • ​​代碼展示​​
  • ​​方法總結​​
  • 作者:阿振

開篇

延續上篇的《​​Shapfile屬性操作之增​​》,這篇我們來聊聊如何進行屬性删除。使用的工具依舊是我們的GDAL庫。

案例介紹

這裡我們要處理的資料是中國地圖分省的矢量Shapefile,是一個面狀資料。在上篇中我們給該資料添加了一個屬性字段​

​Abbr​

​用以表示省的簡稱。這篇我們再把該字段給删除掉。

代碼展示

from osgeo import ogr
ogr.UseExceptions()


# 從給定圖層中讀取字段的定義,根據給定字段名稱找到該字段的索引編号
def get_field_index_by_name(layer: ogr.Layer, name: str):
    defs: ogr.FeatureDefn = layer.GetLayerDefn()
    for i in range(defs.GetFieldCount()):
        if name == defs.GetFieldDefn(i).GetName():
            return i
    raise ValueError(f'{name} not found')


# 打開一個Shapefile檔案
ds: ogr.DataSource = ogr.Open('../data/省級行政區.shp', update=True)
layer: ogr.Layer = ds.GetLayer()
# 删除Abbr字段
index = get_field_index_by_name(layer, 'Abbr_1')
layer.DeleteField(index)
ds = None      

方法總結

  1. GDAL的圖層​

    ​ogr.Layer​

    ​​類提供了​

    ​DeleteField()​

    ​方法用于删除字段,但是該方法傳入的參數必須是要删除字段的索引編号。
  2. 我們一般的業務需求是根據字段名稱去進行删除操作,是以我自定義了一個​

    ​get_field_index_by_name()​

    ​​函數用于從給定圖層中查找給定字段名稱對應的索引編号。該函數接受兩個參數,第一個是圖層變量,第二個是字段名稱。該函數實作的邏輯是周遊傳入的圖層中的字段的定義,找到和給定名稱相同的字段并傳回其索引。有一種特殊情況是傳入的字段名稱在目前圖層中并不存在,對于這種情況,我們直接抛出一個​

    ​ValueError​

    ​錯誤。
  3. 這樣我們就可以采用​

    ​layer​

    ​​的​

    ​DeleteField()​

    ​方法進行删除了。