รหัสต่อไปทำงานได้ใน Python Console ของ 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 Console ของ 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
เลเยอร์หน่วยความจำที่สร้างขึ้น (คุณสมบัติสีเขียว) สามารถดูได้ในภาพถัดไป มันเป็นไปตามที่คาดไว้