【问题标题】:QGIS: use Python to remove overlap area between polygons of the same layerQGIS:使用Python去除同一层多边形之间的重叠区域
【发布时间】:2022-10-18 22:24:45
【问题描述】:

我正在尝试创建一个插件来删除同一层的多边形之间的重叠区域,我想通过从多边形中删除(在边界细分之后)完全包含在其他多边形中的多边形来做到这一点。为此,我使用 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)

【问题讨论】:

  • 我简化了这个问题,因为我真的需要帮助。代码很好地划分了重叠的多边形,但似乎“polygon_geometry_engine.contains”不起作用:我得到的结果总是所有的多边形
  • 所有多边形都在同一个 shapefile 中吗?它
  • 也不完全清楚所需的输出是什么。您是否尝试仅删除完全包含的那些多边形?如果多边形的一部分包含在另一个多边形中,您是否要删除它?或者只是剪辑包含的部分?

标签: python qgis


【解决方案1】:

尝试这样的事情:

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()

This will only delete features that are fully contained within another feature.

[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/XfXmM.png

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2021-09-30
    • 1970-01-01
    • 2017-04-19
    • 2021-06-26
    • 2011-05-12
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多