基于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