You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QGIS Python插件开发:移除同图层多边形重叠区域遇问题

QGIS插件开发问题:移除多边形重叠区域失败

我正在开发一款QGIS插件,目标是移除同一图层内多边形之间的重叠区域。实现思路是先对多边形边界进行细分,再删除完全被其他多边形包含的多边形。但使用QgsGeometryEngine.contains()方法时,始终得不到预期的正向匹配结果,最终生成的新图层虽然完成了多边形分割,但重叠区域仍然存在。

代码实现

layer = self.iface.activeLayer()

polygons = [ feat.geometry().asWkt() for feat in layer.getFeatures() ]

shapely_polygons = [ loads(pol) for pol in polygons ]

rings = [ LineString(pol.exterior.coords) for pol in shapely_polygons ]

union = unary_union(rings)

new_intersections = [ geom.wkt for geom in polygonize(union) ]

epsg = layer.crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,'new_polygons','memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_intersections)) ]
feats_2 = []
noAdd = []

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromWkt(new_intersections[i]))

for i, feat in enumerate(feats):
  polygon_geometry_engine = QgsGeometry.createGeometryEngine(feat.geometry().constGet())
  for ii, feat_2 in enumerate(feats):
   if i != ii and polygon_geometry_engine.contains(feat_2.geometry().constGet()):
    noAdd.append(ii)

for i, feat in enumerate(feats):
 if i not in noAdd:
  feats_2.append(feat)

prov.addFeatures(feats_2)

QgsProject.instance().addMapLayer(mem_layer)

示例图说明:分割后的多边形图层中,仍可见未被移除的重叠区域

内容的提问来源于stack exchange,提问作者Giovanni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:15:39