我试图弄清楚如何使用python提取一个向量中与另一个向量重叠> 90%的多边形。然后,我想要一个仅显示这些多边形的矢量/地图。示例图片显示了我的图层。我希望所有> 90%红色的灰色多边形。
我需要通过python(或类似的自动化方法)来完成所有操作。我有约1000张地图以相同的方式处理。
我试图弄清楚如何使用python提取一个向量中与另一个向量重叠> 90%的多边形。然后,我想要一个仅显示这些多边形的矢量/地图。示例图片显示了我的图层。我希望所有> 90%红色的灰色多边形。
我需要通过python(或类似的自动化方法)来完成所有操作。我有约1000张地图以相同的方式处理。
Answers:
下一个代码可在我的QGIS Python控制台中使用。它会产生一个存储层,该存储层的多边形> 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)
我尝试了以下两个向量层的代码:
在QGIS的Python控制台上运行代码后,为了证实结果,在polygons_intersects(红色区域为1,灰色区域为2)和重叠准则中打印了涉及的特征,相交区域,字段属性的索引i,j 。
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
在下一张图像上可以观察到创建的存储层(绿色特征)。符合预期。
这里不需要python的解决方案。
使用查询添加新的虚拟层:
WITH r AS (
SELECT
Basins800.rowid AS idGray,
area(Basins800.geometry) AS areaGray,
area(Intersection(Basins800.geometry, Severity.geometry)) AS aeraInter,
Basins800.geometry AS geomGray
FROM Basins800, Severity
)
SELECT *, areaInterSum/areaGray AS overlap , geomGray
FROM (
SELECT
idGray,
areaGray,
sum(areaInter) AS areaInterSum,
geomGray
FROM r
GROUP BY idGray)
WHERE areaInterSum/areaGray > 0.9
与:
Basins800作为您要使用灰色多边形过滤的图层
严重程度:红色层重叠。
结果将是一个新图层,其中所有> 90%的灰色多边形都被红色多边形重叠,新字段包含重叠百分比。
希望这行得通。如果需要,我可以在查询中添加更多详细信息。
注意:您的数据包含非常小的多边形(来自栅格处理,并且与一个栅格像素相对应(在图片上,我们可以看到4个多边形,但还有25个其他小多边形)。这使查询的执行速度非常慢(交集函数)为两层中的每个要素生成一个要素)。
看到后链接到严重性和Basins800 shape文件,我可以理解必要的geoprocess。我修改了以下代码:
使用QGIS以编程方式查找与另一个矢量多边形图层重叠> 90%的多边形?
为了得到这个:
mapcanvas = iface.mapCanvas()
layers = mapcanvas.layers()
#for Severity
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]
#for Basins800
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]
selected_feats = []
print "processing..."
for i, feat1 in enumerate(feats_lyr1):
for j, feat2 in enumerate(feats_lyr2):
if feat1.geometry().intersects(feat2.geometry()):
area1 = feat1.geometry().intersection(feat2.geometry()).area()
area2 = feat1.geometry().area()
print i, j, area1, area2
crit = 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)
在QGIS的Python控制台上使用这些shapefile运行代码后,几分钟后,我得到了与Pierma类似的结果;内存层有31个要素(他得到了29个多边形)。
我不会调试结果,因为要素之间存在1901 * 3528 = 6706728的交互。但是,该代码看起来很有希望。