版權聲明:本文爲博主原創文章,轉載請註明原文出處!
作者:阿振
寫作時間:2020-06-13
開篇
在上篇的《Shapfile屬性操作之增》和《Shapefile屬性操作之刪》中我們分別介紹了對於空間矢量數據屬性的增加(CREATE)和刪除(DELETE)操作,這篇我們聊聊數據的更新操作(UPDATE)。
案例介紹
這裏我們要處理的數據是中國地圖分省的矢量Shapefile,是一個面狀數據。該數據有一個NAME
字段,給出了每個省的名稱。這裏我們要更新NAME
字段,給直轄市名稱後面添加“市”字,給自治區後面添加“自治區”字樣,給特別行政區後面添加“特別行政區”字樣,剩下的省名稱後面添加“省”字。
思路是我們遍歷圖層中的每一個Feature要素,然後通過ogr.Feature
的SetField()
方法更新屬性值。
代碼展示
Talk is cheap. Show me the code.
from osgeo import ogr
ogr.UseExceptions()
# 打開一個Shapefile
ds: ogr.DataSource = ogr.Open('../data/省級行政區.shp', update=True)
layer: ogr.Layer = ds.GetLayer()
# 填充屬性值
for feature in layer:
name: str = feature.GetField('NAME')
if name in ('北京', '天津', '重慶', '上海'):
name += '市'
elif name in ('內蒙古', '廣西', '寧夏', '新疆', '西藏'):
name += '自治區'
elif name in ('香港', '澳門'):
name += '特別行政區'
else:
name += '省'
feature.SetField('NAME', name)
# 修改完了記得Set一下
layer.SetFeature(feature)
# 關閉數據集
ds = None
方法總結
- 首先,我們使用
ogr.Open()
函數打開Shapefile數據,注意我們要設置update
參數爲True
,即允許GDAL更新我們的原始數據。 - 使用
GetLayer()
方法獲取圖層,然後使用for循環遍歷圖層中的要素。通過GetField()
方法獲取需要修改的字段,然後通過SetField()
方法修改字段。 - 記得添加完屬性值以後,需要使用
SetFeature()
方法將當前feature
更新到塗層layer
中去。