前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shapefile属性操作之删

Shapefile属性操作之删

作者头像
卡尔曼和玻尔兹曼谁曼
发布2020-06-15 10:39:14
7380
发布2020-06-15 10:39:14
举报
文章被收录于专栏:给永远比拿愉快

文章目录

  • 开篇
  • 案例介绍
  • 代码展示
  • 方法总结

版权声明:本文为博主原创文章,转载请注明原文出处!

作者:阿振

写作时间:2020-06-13 又是一个周末


开篇

延续上篇的《Shapfile属性操作之增》,这篇我们来聊聊如何进行属性删除。使用的工具依旧是我们的GDAL库。

案例介绍

这里我们要处理的数据是中国地图分省的矢量Shapefile,是一个面状数据。在上篇中我们给该数据添加了一个属性字段Abbr用以表示省的简称。这篇我们再把该字段给删除掉。

删除的方法包括两部:首先,从属性表中找到该字段,然后删除该字段。

代码展示

Talk is cheap. Show me the code.

代码语言:javascript
复制
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()方法进行删除了。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 开篇
  • 案例介绍
  • 代码展示
  • 方法总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档