我试图创建一个插件,以消除同一层的多边形之间的重叠区域,我想通过从多边形(边界细分后)删除完全包含在其他多边形中的多边形来做到这一点。为了做到这一点,我使用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)
发布于 2022-10-18 14:24:45
试着做这样的事情:
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()
这将只删除完全包含在另一个功能中的功能。
https://stackoverflow.com/questions/74012920
复制相似问题