使用QGIS以编程方式查找与另一个矢量多边形图层重叠> 90%的多边形?


9

示例层

我试图弄清楚如何使用python提取一个向量中与另一个向量重叠> 90%的多边形。然后,我想要一个仅显示这些多边形的矢量/地图。示例图片显示了我的图层。我希望所有> 90%红色的灰色多边形。

我需要通过python(或类似的自动化方法)来完成所有操作。我有约1000张地图以相同的方式处理。


您想要做一个叠加的“联合”(有关某些基础知识,请参见infogeoblog.wordpress.com/2013/01/08/geo-processing-in-qgis),然后为每个原始多边形计算“入”统计和“出”统计gis.stackexchange.com/questions/43037/...确定覆盖百分比...提示:你需要有一个面积测量gis.stackexchange.com/questions/23355/...
迈克尔·史汀生

感谢您的提示。这就是我刚刚尝试的相同方法。我可以很容易地通过python控制台进行联合。已经添加在区域属性值中。这是我不确定的下一步。如何使用python计算“入”和“出”统计信息,以便可以识别/选择/剪切等大于90%的多边形?
2013年

我认为没有python就有可能。您是否需要绝对的python或具有虚拟层的解决方案对您有好处?
皮尔马'16

“入”区域将具有两个面的属性,“出”区域将仅具有一组面的属性。获取两组面积统计信息,并返回到原始多边形,添加一个字段“ in”,“ out”和coverage,从面积之和计算“ in”和“ out”的值,然后将“ in”除以原始面积(或“进” +“出”)以计算百分比。
Michael Stimson

1
Pierma-我只需要一种自动方法即可找到多边形。
2013年

Answers:


3

下一个代码可在我的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

在下一张图像上可以观察到创建的存储层(绿色特征)。符合预期。

在此处输入图片说明


6

这里不需要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个其他小多边形)。这使查询的执行速度非常慢(交集函数)为两层中的每个要素生成一个要素)。


通过“创建虚拟层”按钮运行查询时出现错误。“在CREATE TEMP VIEW _tview AS上使用r AS进行查询执行错误(“ ....此处的其余代码...,后跟:” 1-在“ WITH”附近:语法错误“我对QGIS还是很陌生。以编程方式创建此虚拟层吗?感谢您的帮助!
2013年

以下是下载shapefile的链接
2013年

对不起,灰色和灰色之间的副本不好(对不起我的英语)。我编辑了查询。现在应该可以使用了。为什么要以编程方式创建图层?虚拟层的优点是它是非破坏性的,并且如果您编辑数据(灰色或红色多边形),则虚拟层将自动更新。
皮尔马'16

这只是该过程的一小部分。我有约1000张地图要做,因此自动化过程将非常有帮助。
dnormous

我仍然遇到相同的错误->“ 1-” WITH“附近:语法错误”。我为grayLayer和redLayer插入了每个图层的本地名称。我应该使用本地名称吗?即:灰色层被标记为“ Basins_800”,所以我有类似“ Basins_800.geometry”的代码
2016年

2

看到后链接严重性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的交互。但是,该代码看起来很有希望。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.