Answers:
最好用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
为每个多边形得到一条记录。
另一种方法是在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
现在,矢量层的属性表应具有一个额外的列,其中包含所有邻近国家的总人口。
@Nathan很好的回答。我尝试使用pyqgis和shapely进行此操作。查看这篇文章以下载脚本并在QGIS中运行它。此方法的优点是您可以将结果作为属性表的一部分来获取。