矢量数据几何图形孔洞的消除

基于osgeo的ogr模块,具体代码如下:

"""
Created on Tue Apr  4 17:49:33 2023
@author: John_Huang
"""
import os
from osgeo import ogr


def pf_DeleteAllHoleInPolygon3(inputSHP, flag, outputSHP=None):
    """
    删除所有feature的孔洞.

    params: inputSHP输入的矢量数据路径
            flag
                flage=1表示删除inputSHP的孔洞,并将删除孔洞后的数据保存为新的矢量文件outputSHP
                flage=0表示删除inputSHP的孔洞,并将删除孔洞后的数据覆盖掉inputSHP
                outputSHP删除孔洞后的新矢量数据保存路径
    """
    # 打开输入文件
    input_ds = ogr.Open(inputSHP, update=(flag == 0))
    input_lyr = input_ds.GetLayer()

    # 如果flag为1,则创建输出文件,否则覆盖原始数据
    if flag == 1:
        output_ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource(outputSHP)
        output_lyr = output_ds.CreateLayer(os.path.splitext(os.path.basename(outputSHP))[0],
                                           input_lyr.GetSpatialRef(),
                                           geom_type=ogr.wkbPolygon)
    else:
        output_ds = None
        output_lyr = input_lyr

    # 遍历输入图层中的每一个要素
    for input_feat in input_lyr:
        polygon = ogr.Geometry(ogr.wkbPolygon)
        for i, geom in enumerate(input_feat.GetGeometryRef()):
            if i == 0:
                # i=0表示边框几何图形,肯定要保留下来,里面的孔洞数据都不要
                polygon.AddGeometry(geom)
        if flag == 1:
            feature_defn = output_lyr.GetLayerDefn()
            feature = ogr.Feature(feature_defn)
            feature.SetGeometry(polygon)
            output_lyr.CreateFeature(feature)
            feature = None
            polygon = None
        else:
            input_feat.SetGeometry(polygon)
            input_lyr.SetFeature(input_feat)

    if flag == 0:
        input_ds.SyncToDisk()

    if output_ds is not None:
        output_ds = None

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

John H.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值