Shapefile屬性操作之刪


版權聲明:本文爲博主原創文章,轉載請註明原文出處!

作者:阿振

寫作時間:2020-06-13 又是一個週末


開篇

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

案例介紹

這裏我們要處理的數據是中國地圖分省的矢量Shapefile,是一個面狀數據。在上篇中我們給該數據添加了一個屬性字段Abbr用以表示省的簡稱。這篇我們再把該字段給刪除掉。

刪除的方法包括兩部:首先,從屬性表中找到該字段,然後刪除該字段。

代碼展示

Talk is cheap. Show me the code.

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. 這樣我們就可以採用layerDeleteField()方法進行刪除了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章