QGIS计算共享边长

问题:给定一个Polygon文件,共享边长是多少

在这里插入图片描述
解答:
首先我们要知道每一个多边形都有哪些共享的边界线。由于我们的数据是基于WGS84(3587)坐标的数据,为了量算距离,需要先进行投影处理,这里选择webmercator(3857)投影。打开qgis,在里面找到reprojection工具,选择3857坐标系。
对投影完的数据使用字段计算器工具进行处理。现在,我们将添加一个名为’neighbors’的新字符串字段,结果将包含所有相邻区县的逗号分隔列表。区县名称包含在NAME列中。因此,我们可以使用聚合函数array_agg表达式查找所有相交的特征并提取区县名称。由于几何体与其自身相交,因此结果列表具有区县本身。我们使用该array_remove_all函数从结果中删除错误的区县。

在这里插入图片描述

array_to_string(array_remove_all(aggregate(
layer:= 'Reprojected',
aggregate:='array_agg',
expression:=NAME,
filter:=intersects($geometry, geometry(@parent))
), "NAME"))

在这里插入图片描述

处理完成后,将加载一个新的“计算”层。现在,该层有一个“neighbors”列,其中包含每个要素的所有相邻区县的列表。
现在我们准备计算边界长度。想法是使每个要素与所有相邻要素相交并计算相交的长度。但是要素是多边形,由于它们彼此接触,所以它们的交集将为空。因此,诀窍是首先将面要素转换为折线。2条相邻折线要素的交点将是代表边界的折线。您可能会想使用“多边形到直线”算法,但是此算法将多边形之间的共享边界仅分配给其中一个要素。正确的算法是“边界”,它会创建多边形的拓扑边界。
在这里插入图片描述
我们将添加一个新的字符串字段“ lengths”,每个相区县长度为单位。这里的关键功能是array_foreach。该函数获取一个列表,并将表达式应用于每个元素,然后返回包含计算值的列表。可以使用访问每个列表成员@element。该表达式可以分解为以下逻辑部分
步骤1:将以逗号分隔的邻居列表转换为列表(函数string_to_array)
步骤2:对于每个相邻的区县值,找到相应的要素几何(function get_feature和geometry)
第3步:找到要素与邻居(函数intersection)之间的相交几何
步骤4:计算相交几何的长度。(功能length)
第5步:长度以图层CRS单位(米)计算,并将其四舍五入为最接近的整数(函数floor)
步骤6:将结果列表转换为逗号分隔的字符串,以保存到字段中。(功能array_to_string)

array_to_string(array_foreach(string_to_array( "neighbors" ),
floor(length(intersection(geometry(get_feature('Boundary', 'NAME', trim(@element))), $geometry)))))

在这里插入图片描述

发布了6 篇原创文章 · 获赞 0 · 访问量 227

猜你喜欢

转载自blog.csdn.net/nike123456789/article/details/105491948