版權聲明:本文爲博主原創文章,轉載請註明原文出處!
作者:阿振
寫作時間: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
方法總結
- GDAL的圖層
ogr.Layer
類提供了DeleteField()
方法用於刪除字段,但是該方法傳入的參數必須是要刪除字段的索引編號。 - 我們一般的業務需求是根據字段名稱去進行刪除操作,所以我自定義了一個
get_field_index_by_name()
函數用於從給定圖層中查找給定字段名稱對應的索引編號。該函數接受兩個參數,第一個是圖層變量,第二個是字段名稱。該函數實現的邏輯是遍歷傳入的圖層中的字段的定義,找到和給定名稱相同的字段並返回其索引。有一種特殊情況是傳入的字段名稱在當前圖層中並不存在,對於這種情況,我們直接拋出一個ValueError
錯誤。 - 這樣我們就可以採用
layer
的DeleteField()
方法進行刪除了。