使用QGIS求和相邻多边形的值?


11

我希望您能解决以下问题:我有一个向量(多边形)层。我想为该图层添加一个属性-对于每个多边形-将其所有相邻多边形的特定字段的值相加。

举一个更具体的例子:我有一个包含人口信息的地区的多边形层。现在,对于每个地区,我想知道在其所有邻近地区中有多少人居住。

因为我有300多个区,所以无法为每个区手动执行此操作。

有什么方法可以在QGIS中更有效地做到这一点?

Answers:


8

最好用Spatialite和SQL完成这种事情。

首先,您需要将数据加载到Spatialite数据库中,这可以使用QGIS附带的DBManager插件来完成。点击导入Layer/File button

将数据存储到数据库中后,您可以使用SQL按钮运行以下查询。您只需要更改列和表的名称以适合您的数据即可。

SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours, 
        a1.pop, 
        a1.name, 
        a1.id, 
        a1.geomm FROM areas a1
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id 
                            AND intersects(a2.geomm, a1.geomm)
GROUP BY a1.id

告诉查询工具您唯一的ID列(id)和几何列(geomm),然后单击“加载”。

一旦标记了标签,就应该有这样的东西

在此处输入图片说明

查询明细

我们使用以下方法将图层连接到自身上:

LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id 
                            AND intersects(a2.geomm, a1.geomm)

但仅在几何相交且id不相同的地方,否则对于每个多边形,我们最终得到相同的记录两次。我们还使用了a,LEFT OUTER JOIN以便我们包含不加入的记录,即没有邻居。

在选择部分中:

SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours, 
            a1.pop, 
            a1.name, 
            a1.id, 
            a1.geomm

我们正在使用COALESCE以将NULLS(无邻居)转换为,0否则它们将停留NULL

然后我们只是GROUP BY a1.id为每个多边形得到一条记录。


内森,非常感谢您的回答和有用的解释。它甚至对于总的spacespaceite和sql初学者都有效!
亚历克斯

+1“查询细分”部分做得很好,非常有帮助。
whuber

@Alex好东西。不要忘记勾选接受按钮。
内森W

2

另一种方法是在GRASS中(使用GRASS工具箱或直接在GRASS中)。在下面的示例中,层EA是带有国家/地区的矢量层,在属性表中是具有每个国家/地区的人口的列。请参阅此帖子以获取更详细的说明。

步骤1)使用链接到边界的属性表创建新层,两列的多边形ID分别与左右边界线接壤

v.category EA out=EAc layer=2 type=boundary option=add
v.db.addtable EAc layer=2 col="left integer,right integer"
v.to.db EAc option=sides col=left,right layer=2 type=boundary

步骤2)运行SQL创建一个表,该表将国家ID与所有邻近国家的人口总数相链接:

db.execute sql="CREATE TABLE tmp AS
SELECT ID, sum(pop) as population FROM (
SELECT DISTINCT EAc_2.left as ID, EAc.pop as pop
FROM EAc_2
LEFT JOIN EAc ON EAc_2.right = EAc.cat
WHERE EAc_2.left > -1 AND EAc_2.right > -1
UNION
SELECT DISTINCT EAc_2.right as ID, EAc.pop as pop
FROM EAc_2
LEFT JOIN EAc ON EAc_2.left = EAc.cat
WHERE EAc_2.left > -1 AND EAc_2.right > -1
) GROUP BY ID"

步骤3)将新表tmp与原始属性表连接起来。

v.db.join map=EA@ConsStat layer=1 column=cat otable=tmp ocolumn=ID

现在,矢量层的属性表应具有一个额外的列,其中包含所有邻近国家的总人口。


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.