跳转至

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 文件。

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

Roadway_Block-shp.zip

Address_Points.zip

Community Based Service Provider.zip

数据来源:[DCOPENDATA]

设置

访问 插件 ‣ 管理和安装插件。选择 :guilabel:全部 搜索 QNEAT3 插件并安装它。点击关闭。

../../_images/setup11.png

操作步骤

  1. 找到 Community_Based_Service_Providers.zip 文件,解压并将 Community_Based_Service_Providers.shp 添加到画布中。我们将只选择那些为成人提供服务的中心。右键单击 Community_Based_Service_Providers.shp 图层并选择 过滤。

../../_images/1133.png

  1. 这将打开查询构建器对话框。在 :guilabel:过滤器表达式 中输入以下查询。点击 运行。

bash "PROVIDER_T" IN ('Adult','Adult & Child')

../../_images/2106.png

  1. 接下来,找到 Roadway_Block.zip 文件,解压并添加 Roadway_Block.shp。同样,找到 Address_Points.zip 文件,解压并添加 Address_Points.shp。您会看到城市周围有很多点。每个点代表一个有效地址。我们将随机选择 1000 个点。这种技术称为随机抽样。转到 处理 ‣ 工具箱。

../../_images/349.png

  1. 搜索并找到 矢量选择 ‣ 随机抽取 算法。

../../_images/349.png

  1. 选择 Address_Points 作为 输入图层,要素数量 作为 方法,并在 要素数量/百分比 中输入 1000。在 抽取的(随机) 处选择 ... 并点击 保存到文件。现在选择目录,输入名称 address_point_subset.shp 并点击 运行。

../../_images/524.png

注意

由于该算法会从给定数据集中抽取 1000 个随机点,为了复现本练习中使用的确切点,您可以下载我们在算法执行期间获得的子集文件 address_point_subset.zip。下载后,将 address_point_subset.shp 图层加载到 QGIS 中。

  1. 一个新的 address_point_subset 图层将被添加到 图层 面板,您可以关闭 Address_Points 地址点图层的可见性。让我们将此图层重命名为 origin_points。右键单击 address_point_subset 图层并选择 重命名图层。

../../_images/624.png

  1. 类似地,将代表医疗设施的 Community_Based_Service_Provider 图层重命名为 destination_points。这样命名图层便于在后续处理中识别它们。接下来,我们将打开处理工具箱,使用起点和终点图层创建距离矩阵。

../../_images/723.png

  1. 找到 QNEAT3 ‣ 距离矩阵 ‣ OD 矩阵(从图层到线) (m:n) 算法。如果在工具箱中看不到此算法,请确保已安装 QNEAT3 插件。

../../_images/823.png

  1. 该算法有助于查找所选起点和终点图层之间沿网络的距离。选择 Roadway_Block 作为 网络图层。选择 origin_points 作为 起点图层,OBJECTID 作为 唯一点 ID 字段。类似地,将 destination_points 设置为 终点图层,OBJECTID 设置为 唯一点 ID 字段。将 优化标准 设置为 最短路径(距离优化)

../../_images/923.png

  1. 由于网络中的许多街道是单行道,我们需要设置 高级参数 来指定方向。有关这些属性如何构建的更多详细信息,请参阅 基础网络可视化与路径分析 (QGIS3)。我们还可以选择生成矩阵的几何类型。我们拥有带方向信息的道路网络,因此可以沿着路线生成矩阵。选择 矩阵几何沿路线。选择 SUMMARYDIR 作为 方向字段。输入 OB 作为 正向值,IB 作为 反向值,BD 作为 双向值。将 拓扑容差 设置为 0.000150。保持其他选项为默认值并点击 运行。

../../_images/1030.png

  1. 一个新的名为 Output OD Matrix 的表格图层将被添加到 图层 面板中。右键单击并选择 打开属性表。您将看到该表包含 67000 行。我们有 67 个起点和 1000 个终点——因此输出包含 67x1000 = 67000 个起点-终点对。total_cost 列包含每个起点到每个终点的距离(以米为单位)。

../../_images/1134.png

  1. 对于本教程,我们只关心距离最短的终点。我们可以创建一个 SQL 查询来从所有终点中选取 total_cost 最小的终点。转到 处理 ‣ 工具箱。搜索并找到 矢量通用 ‣ 执行 SQL。

../../_images/1231.png

  1. 在 其他输入数据源 中选择 ...,勾选 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

../../_images/1329.png

  1. 一个新的虚拟图层 SQL Output 将被添加到 图层 面板。此图层包含了我们的分析结果。对于每个 1000 个起点点,都找到了最近的服务提供商。

../../_images/1427.png


如果您想提供反馈或分享您对本教程的体验,请在下方留言。(需要 GitHub 账户)