【发布时间】: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 中吗?它
-
也不完全清楚所需的输出是什么。您是否尝试仅删除完全包含的那些多边形?如果多边形的一部分包含在另一个多边形中,您是否要删除它?或者只是剪辑包含的部分?