文章目錄
- 開篇
- 案例介紹
- 代碼展示
- 方法總結
- 作者:阿振
開篇
延續上篇的《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
方法總結
- GDAL的圖層
類提供了ogr.Layer
方法用于删除字段,但是該方法傳入的參數必須是要删除字段的索引編号。DeleteField()
- 我們一般的業務需求是根據字段名稱去進行删除操作,是以我自定義了一個
函數用于從給定圖層中查找給定字段名稱對應的索引編号。該函數接受兩個參數,第一個是圖層變量,第二個是字段名稱。該函數實作的邏輯是周遊傳入的圖層中的字段的定義,找到和給定名稱相同的字段并傳回其索引。有一種特殊情況是傳入的字段名稱在目前圖層中并不存在,對于這種情況,我們直接抛出一個get_field_index_by_name()
錯誤。ValueError
- 這樣我們就可以采用
的layer
方法進行删除了。DeleteField()