首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QGIS:使用Python删除同一层多边形之间的重叠区域

QGIS:使用Python删除同一层多边形之间的重叠区域
EN

Stack Overflow用户
提问于 2022-10-10 09:42:07
回答 1查看 110关注 0票数 0

我试图创建一个插件,以消除同一层的多边形之间的重叠区域,我想通过从多边形(边界细分后)删除完全包含在其他多边形中的多边形来做到这一点。为了做到这一点,我使用QgsGeometryEngine.contains,但出于某些原因,它似乎从来没有一个积极的反应:结果总是一个新的层,正确分割的多元,但也重叠的。

代码语言:javascript
运行
复制
    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)

EN

回答 1

Stack Overflow用户

发布于 2022-10-18 14:24:45

试着做这样的事情:

代码语言:javascript
运行
复制
layer = iface.activeLayer()
polygons = [feature for feature in layer.getFeatures()]
layer.startEditing()
for poly in polygons:
    poly_geo = poly.geometry()
    for poly2 in polygons:
        if poly2 != poly:
            poly2_geo = poly2.geometry()
            if poly2_geo.contains(poly_geo):
                layer.deleteFeature(poly.id())
layer.commitChanges()

这将只删除完全包含在另一个功能中的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74012920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档