执行空间联接 (QGIS3)

空间连接是一个经典的 GIS 问题 - 根据属性的空间关系将属性从一个图层转移到另一个图层。在 QGIS 中,此功能可通过处理算法获得。Join attributes by location

任务概述

我们将使用 2 个图层 - 纽约市自治市边界的形状文件和纽约市所有街道街道路面评级的另一个形状文件。第一个任务是使用具有汇总算法的空间连接来查找每个行政区街道的平均评级。第二个任务是通过一对多空间连接将自治市镇的名称添加到街道要素中。

您将学习的其他技能

  • 创建过滤器以暂时从计算中排除某些特征。

获取数据

纽约市开放数据门户是纽约市免费数据的绝佳来源。

使用门户上的导出选项下载自治市镇边界 zip 文件。

../../_images/data19.png

使用门户上的导出选项下载街道路面评级 zip 文件。

../../_images/data22.png

为方便起见,您可以从以下链接直接下载数据集的副本:

nybb_19a.zip

V_SSS_SEGMENTRATING_1.zip

数据来源 [纽约市]

程序

  1. 在QGIS浏览器中找到该文件并将其展开。选择图层并将其拖动到画布上。这是一个面图层,表示纽约市的自治市镇边界。nybb_19a.zipnybb_19a/nybb.shp

../../_images/1102.png

  1. 接下来,找到该文件并将其展开。选择图层并将其添加到画布中。这是城市中所有街道的线图层。V_SSS_SEGMENTRATING_1.zipdot_V_SSS_SEGMENTRATING_1_20190129.shp

../../_images/269.png

  1. 让我们检查图层的每个要素可用的属性。右键单击并选择打开属性表。dot_V_SSS_SEGMENTRATING_1_20190129

../../_images/336.png

  1. 您会注意到名为该属性的属性,该属性的值在 0-10 范围内,表示街段的评级。该属性具有描述性评级。我们可以使用该字段来计算平均评分。Rating_BRatingWordRating_B

../../_images/416.png

  1. 您可能已经注意到某些功能的评级为 .这些是未评级的细分市场。将它们包含在我们的分析中是不正确的。在执行空间联接之前,让我们设置一个筛选器来排除这些记录。右键单击图层,然后选择过滤器。NRdot_V_SSS_SEGMENTRATING_1_20190129

../../_images/516.png

  1. 在查询生成器中,键入以下表达式以选择所有未评级的记录。您还可以通过单击字段、运算符并选择适当的值来交互构建表达式。单击“确定”。NR

"RatingWord" != 'NR'

../../_images/616.png

  1. 您会注意到图层现在有一个过滤器图标,指示已将活动过滤器应用于此图层。现在我们可以使用此图层进行空间连接。转到处理 ‣ 工具箱。dot_V_SSS_SEGMENTRATING_1_20190129

../../_images/715.png

  1. 搜索并定位矢量常规 ‣ 按位置连接属性(摘要)算法。双击以启动它。

../../_images/815.png

  1. 在按位置连接属性(摘要)对话框中,选择作为输入图层。街道图层将是连接图层。您可以将几何谓词保留为默认值 。单击要求和的字段旁边的 ... 按钮。nybbdot_V_SSS_SEGMENTRATING_1_20190129Intersects

../../_images/915.png

注意

帮助您选择正确的输入和连接图层的提示:输入图层是将在空间连接中修改新属性的输入图层。由于我们希望将平均评级字段添加到自治市镇图层,因此它将是输入图层。

  1. 选择并单击确定。Rating_B

../../_images/1022.png

  1. 同样,单击“摘要”旁边的“...”按钮进行计算。

../../_images/1125.png

  1. 选择作为摘要运算符,然后单击确定。现在我们准备开始处理了。单击运行。mean

../../_images/1223.png

  1. 处理算法将遍历要素并应用空间连接。验证处理作业是否成功,然后单击关闭。

../../_images/1321.png

  1. 回到QGIS主窗口,您将看到一个新图层添加到画布中。打开此图层的属性表。您将看到一个新列已添加到输入自治市镇图层,其中包含与该要素相交的所有街道的平均评级。Joined layerRating_B_mean

../../_images/1419.png

  1. 现在我们可以执行反向操作。有时,您的分析需要根据空间关系从另一个图层获取属性,但不计算任何汇总。我们可以使用该算法进行此类分析。任务是根据与街道图层相交的行政区面,将自治市镇的名称添加到街道图层中的每个要素。在运行此算法之前,让我们从图层中删除过滤器。单击过滤器图标,然后在查询构建器中按清除。单击“确定”。Join attribute by locationdot_V_SSS_SEGMENTRATING_1_20190129

../../_images/1517.png

  1. 在“图层”面板中转动。在处理工具箱中找到矢量常规 ‣ 按位置连接属性算法,然后双击它以启动。Joined layer

../../_images/1615.png

  1. 选择作为输入图层和连接图层。您可以将几何谓词保留为默认值 。单击“要添加的字段”旁边的“...”按钮,然后选择 。单击“确定”。dot_V_SSS_SEGMENTRATING_1_20190129nybbIntersectsBoroName

../../_images/1716.png

  1. 线段可能跨越自治市镇边界,因此我们选择 连接 类型为 。单击运行。Crate separate feature for each located feature (one-to-many)

../../_images/1814.png

  1. 处理完成后,打开新添加的属性表。您将看到每个街道要素都添加了一个新属性。Joined layerBoroName

../../_images/1912.png

### 使用GIS软件创建生活服务设施数量平均值的统计图表 #### ArcGIS中的操作流程 在ArcGIS中,可以通过使用空间连接和汇总功能来计算并展示生活服务设施的数量平均值。由于ArcGIS提供了直观的操作界面以及详细的帮助文档[^1],使得这一过程相对简单。 首先加载含有生活服务设施位置信息的数据层到地图视图中。接着利用“按位置联合属性”工具将这些地点与行政区划边界相结合,从而为每一个行政区域赋予内部所含有的全部设施记录。之后通过字段计算器或者Python脚本方式求取各区域内设施数目均值: ```python import arcpy from statistics import mean # 设置工作环境参数 arcpy.env.workspace = "C:/data" input_features = "service_facilities.shp" join_features = "districts.shp" # 执行空间联接 output_join_feature = "joined_service_districts.shp" arcpy.SpatialJoin_analysis(target_features=join_features, join_features=input_features, out_feature_class=output_join_feature) # 计算每个区内的设施数量平均值 with arcpy.da.SearchCursor(output_join_feature, ["JOIN_COUNT"]) as cursor: counts = [row[0] for row in cursor] average_count_per_district = round(mean(counts), 2) print(f"The average number of service facilities per district is {average_count_per_district}.") ``` 最后一步就是基于上述得到的结果绘制柱状图或者其他形式的地图符号表达出来。ArcGIS内置有强大的制图能力支持多种样式定制选项,包括但不限于色彩渐变填充、比例尺大小调整等[^2]。 #### QGIS中的解决方案 对于QGIS而言,则更多依赖于用户自身的探索精神去发现适合自己的方法。这里介绍一种较为简便的方法——借助MMQGIS插件完成相同任务。安装好该扩展后,在菜单栏选择`MMQGIS -> Combine -> Attributes Join by Location...`命令打开对话框设置源图层和服务设施点位之间的关联条件;完成后同样可以获得带有计数值的新矢量文件。为了进一步获取平均值得指标,可采用DB Manager SQL查询语句或是Field Calculator表达式来进行后续运算处理。 ```sql SELECT d.name AS DistrictName, AVG(s.count) OVER (PARTITION BY d.id) AS AvgFacilityCount FROM districts d LEFT JOIN joined_service s ON st_contains(d.geometry, s.geometry); ``` 以上SQL片段假设存在名为`districts`的面要素表存储着各个辖区范围及其唯一ID编号,并且已经完成了与服务站点的空间叠加分析形成新的关系型表格结构。最终结果可以直接导出至CSV文件再导入Excel或其他第三方绘图库生成所需的图形报表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值