天天看點

Shapefile屬性操作之增

文章目錄

  • ​​開篇​​
  • ​​案例介紹​​
  • ​​代碼展示​​
  • ​​方法總結​​

作者:阿振

開篇

《​​Python空間資料處理實戰​​》系列的博文好久都沒有更新了,今天乘周末有點時間,補了個覺,然後寫幾篇博文。

關于Python空間資料處理,如果大家有什麼想看到的内容,歡迎評論區留言,我會增加一些大家需要的内容!

今天我打算用四篇部落格簡要介紹一下如何對空間矢量資料的屬性資料進行操作。對于屬性資料,我們可以簡單将其看作一個二維表格,學過資料庫的朋友,可能會想到關系資料庫的概念。是的,我們現在的空間矢量資料的屬性資料大部分就是以關系表的形式進行存儲的。而對于關系資料庫的操作,常用的就是增删改查(CRUD,即Create,Retrieve,Update,Delete)操作。

這篇博文單講Create增加操作,使用的工具還是我們的GDAL庫。

案例介紹

我還是喜歡用案例的方式進行知識的講解。這裡我們要處理的資料是中國地圖分省的矢量Shapefile,是一個面狀資料。該資料有一個​

​NAME​

​​字段,給出了每個省的名稱。然後我們需要給給資料增加一個屬性字段​

​Abbr​

​,用以表示每個省的簡稱。

要完成這項工作,我們首先需要建立一個省份名稱到簡稱的字典,友善程式查詢。然後讀取原始資料,建立一個屬性字段​

​Abbr​

​​,然後周遊資料中的每個Feature要素,取出​

​NAME​

​​,再根據字典查詢到目前​

​NAME​

​​對應的​

​Abbr​

​填充進對應的字段即可。

代碼展示

from osgeo import ogr
ogr.UseExceptions()


# 首先定義每個省全稱到簡稱的映射字典
names = {
    '北京': '京',
    '天津': '津',
    '重慶': '渝',
    '上海': '滬',
    '河北': '冀',
    '山西': '晉',
    '遼甯': '遼',
    '吉林': '吉',
    '黑龍江': '黑',
    '江蘇': '蘇',
    '浙江': '浙',
    '安徽': '皖',
    '福建': '閩',
    '江西': '贛',
    '山東': '魯',
    '河南': '豫',
    '湖北': '鄂',
    '湖南': '湘',
    '廣東': '粵',
    '海南': '瓊',
    '四川': '川/蜀',
    '貴州': '黔/貴',
    '雲南': '雲/滇',
    '陝西': '陝/秦',
    '甘肅': '甘/隴',
    '青海': '青',
    '台灣': '台',
    '内蒙古': '蒙',
    '廣西': '桂',
    '甯夏': '甯',
    '新疆': '新',
    '西藏': '藏',
    '香港': '港',
    '澳門': '澳'
}

# 打開一個Shapefile檔案擷取屬性定義
ds: ogr.DataSource = ogr.Open('../data/省級行政區.shp', update=True)
layer: ogr.Layer = ds.GetLayer()
defs: ogr.FeatureDefn = layer.GetLayerDefn()
for i in range(defs.GetFieldCount()):
    defn: ogr.FieldDefn = defs.GetFieldDefn(i)
    print(f'{defn.GetName()} ->  {defn.GetType()} -> {defn.GetWidth()}')

# 添加一個省簡稱的字段
field: ogr.FieldDefn = ogr.FieldDefn('Abbr', ogr.OFTString)
field.SetWidth(5)
layer.CreateField(field)

# 填充屬性值
for feature in layer:
    name: str = feature.GetField('NAME')
    feature.SetField('Abbr', names.get(name, ''))
    # 修改完了記得Set一下
    layer.SetFeature(feature)

# 關閉資料集
ds = None      

方法總結

  1. 首先,我們使用​

    ​ogr.Open()​

    ​​函數打開Shapefile資料,注意我們要設定​

    ​update​

    ​​參數為​

    ​True​

    ​,即允許GDAL更新我們的原始資料。
  2. 使用​

    ​ogr.FieldDefn()​

    ​​函數建立一個字段,然後添加到​

    ​layer​

    ​​圖層中。注意我們這裡建立的字段的類型是字元串類型​

    ​ogr.OFTString​

    ​​,當然我們還可以建立其他類型的字段,例如整形​

    ​ogr.OFTInteger​

    ​​,實數形​

    ​ogr.OFTReal​

    ​​,日期型​

    ​ogr.OFTDate​

    ​等。一般對于字元串類型,我們還需要設定字元串的寬度。
  3. 接下來我們周遊​

    ​layer​

    ​​中的​

    ​feature​

    ​​,使用​

    ​SetField()​

    ​​方法設定屬性值。記得添加完屬性值以後,需要使用​

    ​SetFeature()​

    ​​方法将目前​

    ​feature​

    ​​更新到塗層​

    ​layer​

    ​中去。