Следующий код работает в моей консоли Python QGIS. Он создает слой памяти с полигонами, которые> 90% перекрываются красными областями.
mapcanvas = iface.mapCanvas()
layers = mapcanvas.layers()
#for polygon_intersects
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]
#for xwRcl
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]
selected_feats = []
for i, feat1 in enumerate(feats_lyr1):
area1 = 0
area2 = 0
for j, feat2 in enumerate(feats_lyr2):
if feat1.geometry().intersects(feat2.geometry()):
area = feat1.geometry().intersection(feat2.geometry()).area()
print i, j, area, feat2.attribute('class')
if feat2.attribute('class') == 1:
area1 += area
else:
area2 += area
crit = area1/(area1 + area2)
print crit
if crit > 0.9:
selected_feats.append(feat1)
epsg = layers[0].crs().postgisSrid()
uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
"mem_layer",
"memory")
prov = mem_layer.dataProvider()
for i, feat in enumerate(selected_feats):
feat.setAttributes([i])
prov.addFeatures(selected_feats)
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
Я опробовал код с этими двумя векторными слоями:
После запуска кода на консоли Python QGIS для подтверждения результатов были напечатаны индексы i, j задействованных объектов, областей пересечения, атрибута поля в polygons_intersects (1 для красных областей и 2 для серых областей) и критерий перекрытия ,
0 0 9454207.56892 1
0 1 17429206.7906 2
0 2 10326705.2376 2
0 4 40775341.6814 1
0 5 26342803.0964 2
0 7 11875753.3216 2
0.432253120382
1 6 1198411.02558 2
1 7 1545489.96614 2
1 10 27511427.9909 1
0.90930850584
2 7 750262.940888 2
2 8 12012343.5859 1
0.941213972294
3 6 23321277.5158 2
0.0
Созданный слой памяти (зеленые объекты) можно наблюдать на следующем изображении. Это было, как и ожидалось.