39_使用OD矩阵定位最近设施 QGIS3
原文链接: https://www.qgistutorials.com/en/docs/3/origin_destination_matrix.html
使用OD矩阵定位最近设施 (QGIS3)¶
在之前的教程 基础网络可视化与路径分析 (QGIS3) 中,我们学习了如何构建网络并计算两点之间的最短路径。我们可以将这项技术应用于许多不同类型的基于网络的分析。其中一个应用就是计算起点-终点矩阵或OD矩阵。给定一组起点和另一组终点,我们可以计算每个起点-终点对之间的最短路径,并找出它们之间的出行距离/时间。这种分析对于定位距离任意给定点最近的设施非常有用。例如,物流公司可以利用此分析找到距离其客户最近的仓库,以优化配送路线。这里我们使用 QGIS 网络分析工具箱 (QNEAT3) 插件中的距离矩阵算法来查找城市中每个地址最近的医疗设施。
注意
本教程展示如何使用您自己的网络数据来计算起点-终点矩阵。如果您没有自己的网络数据,可以使用 ORS Tools 插件和“ORS Tools ‣ Matrix ‣ Matrix from Layers”算法,利用 OpenStreetMap 数据完成类似的分析。请参见 使用 Openrouteservice 进行服务区分析 (QGIS3) 来学习如何使用 ORS Tools 插件。
任务概述¶
我们将使用华盛顿特区的两个图层 —— 一个包含代表地址的点,另一个包含代表心理健康设施的点 —— 并找出距离每个地址出行距离最短的设施。
您将学到的其他技能¶
- 从点图层中抽取随机样本。
- 使用虚拟图层对 QGIS 图层运行 SQL 查询。
获取数据¶
哥伦比亚特区政府在 开放数据目录 上免费共享数百个数据集。
下载以下图层作为 shapefile 文件。
为方便起见,您也可以直接通过以下链接下载数据集的副本:
Community Based Service Provider.zip
数据来源:[DCOPENDATA]
设置¶
访问 插件 ‣ 管理和安装插件。选择 :guilabel:全部 搜索 QNEAT3 插件并安装它。点击关闭。

操作步骤¶
- 找到
Community_Based_Service_Providers.zip文件,解压并将Community_Based_Service_Providers.shp添加到画布中。我们将只选择那些为成人提供服务的中心。右键单击Community_Based_Service_Providers.shp图层并选择 过滤。
- 这将打开查询构建器对话框。在 :guilabel:
过滤器表达式中输入以下查询。点击 运行。
bash "PROVIDER_T" IN ('Adult','Adult & Child')
- 接下来,找到
Roadway_Block.zip文件,解压并添加Roadway_Block.shp。同样,找到Address_Points.zip文件,解压并添加Address_Points.shp。您会看到城市周围有很多点。每个点代表一个有效地址。我们将随机选择 1000 个点。这种技术称为随机抽样。转到 处理 ‣ 工具箱。
- 搜索并找到 矢量选择 ‣ 随机抽取 算法。
- 选择
Address_Points作为 输入图层,要素数量作为 方法,并在 要素数量/百分比 中输入1000。在 抽取的(随机) 处选择...并点击 保存到文件。现在选择目录,输入名称address_point_subset.shp并点击 运行。
注意
由于该算法会从给定数据集中抽取 1000 个随机点,为了复现本练习中使用的确切点,您可以下载我们在算法执行期间获得的子集文件 address_point_subset.zip。下载后,将 address_point_subset.shp 图层加载到 QGIS 中。
- 一个新的
address_point_subset图层将被添加到 图层 面板,您可以关闭Address_Points地址点图层的可见性。让我们将此图层重命名为origin_points。右键单击address_point_subset图层并选择 重命名图层。
- 类似地,将代表医疗设施的
Community_Based_Service_Provider图层重命名为destination_points。这样命名图层便于在后续处理中识别它们。接下来,我们将打开处理工具箱,使用起点和终点图层创建距离矩阵。
- 找到 QNEAT3 ‣ 距离矩阵 ‣ OD 矩阵(从图层到线) (m:n) 算法。如果在工具箱中看不到此算法,请确保已安装 QNEAT3 插件。
- 该算法有助于查找所选起点和终点图层之间沿网络的距离。选择
Roadway_Block作为 网络图层。选择origin_points作为 起点图层,OBJECTID作为 唯一点 ID 字段。类似地,将destination_points设置为 终点图层,OBJECTID设置为 唯一点 ID 字段。将 优化标准 设置为最短路径(距离优化)。
- 由于网络中的许多街道是单行道,我们需要设置 高级参数 来指定方向。有关这些属性如何构建的更多详细信息,请参阅 基础网络可视化与路径分析 (QGIS3)。我们还可以选择生成矩阵的几何类型。我们拥有带方向信息的道路网络,因此可以沿着路线生成矩阵。选择
矩阵几何沿路线。选择SUMMARYDIR作为 方向字段。输入OB作为 正向值,IB作为 反向值,BD作为 双向值。将 拓扑容差 设置为0.000150。保持其他选项为默认值并点击 运行。
- 一个新的名为
Output OD Matrix的表格图层将被添加到 图层 面板中。右键单击并选择 打开属性表。您将看到该表包含 67000 行。我们有 67 个起点和 1000 个终点——因此输出包含 67x1000 = 67000 个起点-终点对。total_cost列包含每个起点到每个终点的距离(以米为单位)。
- 对于本教程,我们只关心距离最短的终点。我们可以创建一个 SQL 查询来从所有终点中选取
total_cost最小的终点。转到 处理 ‣ 工具箱。搜索并找到 矢量通用 ‣ 执行 SQL。
- 在 其他输入数据源 中选择
...,勾选 Output OD Matrix,然后点击 确定。现在点击 SQL 查询 下的 求和。在 SQL 查询对话框中输入以下查询。输入geometry作为 几何字段,并选择LineString作为 几何类型。点击 运行。
bash select origin_id, destination_id, min(total_cost) as shortest_distance, geometry from input1 group by origin_id
- 一个新的虚拟图层
SQL Output将被添加到 图层 面板。此图层包含了我们的分析结果。对于每个 1000 个起点点,都找到了最近的服务提供商。
如果您想提供反馈或分享您对本教程的体验,请在下方留言。(需要 GitHub 账户)












