Skip to content

41_使用UBER MOVEMENT进行旅行时间分析 (QGIS3)

原文链接: https://www.qgistutorials.com/en/docs/3/travel_time_analysis.html

使用 Uber Movement 进行旅行时间分析 (QGIS3)

警告

Uber Movement 数据已停止服务 [查看公告]。您仍然可以使用本教程提供的存档数据并学习在 QGIS 中进行旅行时间分析的技术。

Uber Movement 分享了全球许多城市的匿名汇总旅行时间数据。Uber Movement 的 旅行时间 产品是一个衡量城市内区域间旅行的公开数据集。这些时间基于实际的 Uber 行程,是城市拥堵和交通模式的准确反映。这是一个从数百万次实际出租车行程中汇总而来的大型公开数据集。本教程展示了在 QGIS 中使用此类汇总交通数据集进行旅行时间分析的技术。

任务概述

我们将使用印度班加罗尔市的汇总交通数据集,来查找从城市内任意地点到某个选定位置的旅行时间。我们还将为 30 分钟旅行时间阈值创建一张 等时线图

您将学到的其他技能

  • 在 QGIS 中加载 GeoJSON 文件

获取数据

我们将下载印度班加罗尔市的旅行时间数据集。

  1. 访问 Uber Movement 网站,点击 城市(Cities)

../../_images/data013.png

  1. 搜索 Banglore

../../_images/data023.png

  1. 点击 下载数据(Download data)

../../_images/data032.png

  1. 下载数据(Download data) 弹窗中,切换到 地理边界(GEO BOUNDARIES)。它将包含班加罗尔区的 GeoJSON 文件。接受许可信息,然后点击 BANGLORE_WARDS.JSON 进行下载。

../../_images/data042.png

  1. 然后切换到 全部数据(ALL DATA)。此数据从 2016 年到 2020 年可用,每年分为 4 个季度。我们将下载 2019 年第 3 季度 的数据。选中它并点击 每日各小时旅行时间(仅限工作日)(Travel Times by Hour of Day (Weekdays Only))。该文件将包含 2019 年 7 月至 9 月班加罗尔工作日 Uber 出行的所有匿名信息。

../../_images/data051.png

为方便起见,您可以从以下链接下载数据。

bangalore_wards.json

bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate.csv

数据来源: [UBER]

操作步骤

  1. 浏览器(Browser) 面板中找到 bangalore_wards.json 文件并将其拖到画布上。接下来,我们将从 OpenStreetMap 加载一个底图图层。我们将使用 QuickMapServices 插件访问底图。安装后,转到 Web(网络) ‣ QuickMapServices ‣ OSM ‣ OSM 标准(OSM Standard)。一个来自 OpenStreetMap 的底图切片图层将被添加到项目中。接下来,点击 打开数据源管理器(Open Data Source Manager) 按钮。

../../_images/019.png

  1. 切换到 分隔文本(Delimited Text) 选项卡。浏览到 bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate.csv 文件并选中它。由于此 CSV 文件仅为表格数据,请选择 无几何图形(仅属性表)(No geometry (attribute only table)) 选项,然后点击 添加(Add)

../../_images/029.png

  1. bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate 图层将被添加到 图层(Layers) 面板中。此图层包含城市不同区域之间匿名和汇总的行程位置数据。表中的每一行都包含以下列:源区域(sourceid)、目标区域(dstid)、一天中的小时(hod)以及在该小时从这些区域之间的所有行程汇总的平均旅行时间(mean_travel_time)。您可以在 Movement:旅行时间计算方法论(PDF) 中了解更多关于此数据集的信息。在继续之前,让我们检查一下该图层中有多少条数据记录。右键单击 bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate 图层并选择 显示要素计数(Show Feature Count)。表格的总行数将显示在其旁边。这是一个相当大的表,但我们的分析不需要所有数据行。现在我们将确定我们的目标位置,并过滤此表中与该位置相关的数据记录。

../../_images/039.png

  1. 我们想计算从特定位置出发,在 30 分钟内可到达的所有区域。使用 OSM 标准底图,您可以找到感兴趣的位置。然后选中 bangalore_wards 图层,使用 识别(Identify) 工具并点击该位置。结果将显示包含该位置的区域的属性。出于本教程的目的,我们假设我们的目标位置位于 JP Nagar 区内,其 MOVEMENT_ID193

../../_images/049.png

  1. 我们可以过滤旅行时间记录,只保留那些将此区作为目的地的记录。我们还可以将分析限制在早上 9 点到 10 点的通勤高峰时段。右键单击 bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate 图层并选择 过滤(Filter)

../../_images/059.png

  1. 输入以下过滤表达式并点击 确定(OK)

bash "dstid" = 193 AND "hod" = 9

../../_images/069.png

  1. 回到 QGIS 主窗口,您会看到过滤后的表中的记录数现在仅为 197 条。由于城市总共有 198 个区,我们拥有 1 个目的地区和 197 个源区之间的旅行时间记录。使用 属性(Attributes) 工具栏中的 打开属性表(Open Attribute Table) 按钮,打开两个图层的属性表。

../../_images/079.png

  1. 现在我们在 bangalore_wards 图层中拥有了各区的几何形状,在 bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate 图层中拥有了表格信息。我们可以使用一个共同的属性将属性信息连接到几何形状。这里的 bangalore_wards 图层中的 MOVEMENT_ID 列和 bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate 中的 sourceid 列是唯一的区标识符,可以进行连接。此操作称为 表连接(Table Join)

../../_images/088.png

  1. 在连接这两个图层之前,我们必须确保两列中的值完全匹配。虽然它们看起来相同,但它们的类型不同。由于 GeoJSON 格式无法指定属性类型,所有值都被假定为 字符串(String) 类型 - 即文本。但是当我们导入 CSV 到 QGIS 时,默认情况下,QGIS 会根据值尝试确定列的类型并分配适当的字段类型。对于 CSV 文件,列 sourceid 的数据类型被分配为 整数(Integer)。因此,我们还需要将 GeoJSON 中的列转换为 整数(Integer) 类型。转到 处理(Processing) ‣ 工具箱(Toolbox) ‣ 矢量表(Vector Table) ‣ 字段计算器(Field Calculator) 算法。双击启动它。

../../_images/098.png

  1. 选择 bangalore_wards 作为 输入图层(Input Layer)。将 字段名称(Field Name) 命名为 joinfield,并将 结果字段类型(Result field type) 选择为 Integer。输入 MOVEMENT_ID 作为 表达式(Expression)。点击 计算后(Calculated) 旁边的 … 按钮,然后选择 保存到文件…(Save to File…),接着将输出文件名输入为 bangalore_wards_fixed.gpkg。点击 运行(Run)。关闭字段计算器。

../../_images/1042.png

  1. 一个新图层 bangalore_wards_fixed 将被添加到 图层(Layers) 面板。现在我们准备好执行连接了。转到 处理(Processing) ‣ 工具箱(Toolbox) ‣ 矢量通用(Vector General) ‣ 按字段值连接属性(Join attributes by field value)。双击启动它。

../../_images/1160.png

  1. 选择 bangalore_wards_fixed 作为 输入图层(Input layer),选择 joinfield 作为 表字段(Table field)。选择 bangalore-wards-2019-3-OnlyWeekdays-HourlyAggregate 作为 输入图层 2(Input layer 2),选择 sourceid 作为 表字段 2(Table field 2)。将 已连接图层(Joined layer) 命名为 uber_travel_times.gpkg 并点击 运行(Run)

../../_images/1245.png

  1. 一个新图层 uber_travel_times 将被添加到 图层(Layers) 面板。让我们为其设置样式以可视化连接结果。点击 打开图层样式面板(Open the Layer Styling Panel)。选择 分级(Graduated) 渲染器,并将 mean_travel_time 作为 值(Value)。选择一个色带并点击 分类(Classify)。您将看到地图显示离目的地越远,旅行时间越长。

../../_images/1343.png

  1. 但我们的目标是分析和提取旅行时间在 30 分钟内的区域,因此我们需要进行更多处理。将样式切换回 单一符号(Single symbol) 渲染器。右键单击 uber_travel_times 图层并选择 过滤(Filter)

../../_images/1439.png

  1. 输入以下表达式,以选择所有平均旅行时间在 1800 秒(30 分钟)内的区域。我们还需要包含我们的目的地区域,其旅行时间为 0。

bash "mean_travel_time" <= 1800 OR "MOVEMENT_ID" = 193

../../_images/1534.png

  1. 该图层现在将显示构成感兴趣区域的多边形群。我们现在将它们全部合并为一个单一的多边形。转到 处理(Processing) ‣ 工具箱(Toolbox) ‣ 矢量几何(Vector Geometry) ‣ 融合(Dissolve)。双击启动它。

../../_images/1631.png

  1. 选择 uber_travel_times 作为 输入图层(Input layer)。将 融合后的图层(Dissolved layer) 命名为 30min_isochrone.gpkg。点击 运行(Run)

../../_images/1733.png

  1. 一个新图层 30min_isochrone 将被添加到 图层(Layers) 面板,显示我们的分析结果。

../../_images/1828.png


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