Skip to content

45_计算街道交叉口密度 QGIS3

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

计算街道交叉口密度 (QGIS3)

街道交叉口密度是衡量路网连通性的一个有用指标。我们可以提取街道交叉口并在规则网格上进行聚合以计算密度。这种分析通常用于交通设计以及城市规划,以确定社区的可步行性。借助来自 OpenStreetMap 和 QGIS 的全球街道网络数据集,我们可以轻松计算和可视化世界任何区域的交叉口密度。

任务概述

在本教程中,我们将使用 OpenStreetMap 道路网络数据,计算印度金奈市的街道交叉口密度。

您将学到的其他技能

  • 如何将 OpenStreetMap 数据下载为 shapefile 并裁剪至您感兴趣的区域。
  • 如何在 QGIS 中创建网格。

获取数据

我们将使用 opencities 的数据获取金奈市的边界,然后从 OpenStreetMap Data Extracts 获取印度的道路网络数据。

下载城市边界

  1. 访问 opencities 网站,然后搜索“Chennai wards map”。

../../_images/data14.png

  1. 点击第一个链接并以 KML 格式下载数据。将下载一个名为 Chennai-wards-2011.kml 的图层。

../../_images/data22.png

下载道路网络

  1. 访问 GEOFABRIK 的 OpenStreetMap Data Extracts 下载服务器。在本教程中,我们需要印度金奈市的数据。点击 Asia(亚洲)。

../../_images/data32.png

  1. 现在在子区域中选择 India(印度)。

../../_images/data42.png

  1. 南方区(Southern Zone)的 .shp.zip 文件正是我们需要的文件。点击链接进行下载。

../../_images/data52.png

  1. 这是一个包含整个国家数据提取物的大型下载。解压 southern-zone-latest-free.shp.zip。您将得到许多 shapefile 图层。

../../_images/data62.png

将道路网络裁剪至城市边界

  1. 现在,我们将国家级的道路图层裁剪到我们感兴趣的区域。打开 QGIS,将 Chennai-wards-2011.kml 拖放到其中。

../../_images/data72.png

  1. 与其在 QGIS 中打开一个大型图层,我们可以直接从磁盘读取并裁剪它。打开处理工具箱,找到 Vector overlay(矢量叠加)‣ Clip(裁剪)算法。双击打开它。

../../_images/data81.png

  1. 在 Input layer(输入图层)中选择 并点击 Browse for Layer…(浏览图层…)。

../../_images/data91.png

  1. 导航到您下载 OpenStreetMap 数据的目录,选择 gis_osm_roads_free_1.shp。在 Overlay layer(叠加图层)中选择 New Wards from Oct 2011。然后在 Clipped(裁剪后)中点击 并选择 Save to File…(保存到文件…),浏览到您想要保存结果的文件夹,输入文件名 chennai_roads.gpkg,然后点击 Run(运行)。

../../_images/data101.png

  1. 处理完成后,一个新图层 chennai_roads 将被加载到画布中。

../../_images/data112.png

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

数据来源:[OPENCITIES] [GEOFABRIK]

步骤

  1. 现在计算所需用的两个图层都已就绪。如果您已下载数据,请在浏览器中找到 Chennai-Wards-2011.kmlchennai_roads.gpkg,然后将它们拖放到画布上。

../../_images/image1.png

  1. 第一个任务是提取道路交叉口。这可以使用内置的线相交(Line intersections)工具来完成。让我们先在一个小的子集上测试一下,看看结果是否满意。选择道路图层,然后使用 Select features by Area(按区域选择要素)工具绘制一个矩形并选择几条道路。

../../_images/image2.png

  1. 打开处理工具箱,找到 Vector overlay(矢量叠加)‣ Line intersections(线相交)算法。双击打开它。

../../_images/image3.png

  1. 选择 chennai_roads 作为 Input layer(输入图层)和 Intersect layer(相交图层)。确保勾选 Selected features only(仅所选要素)。点击 Run(运行)。

../../_images/image4.png

  1. 一个新图层 Intersections 将被添加。您会注意到,虽然大多数交叉点都是正确的,但也有一些误报。这是因为该算法将每个线段的交点都视为有效交叉点。但对于我们的分析,我们只需要提取当两条或更多条街道相交时的交叉点。

../../_images/image5.png

  1. 移除 Intersections 图层,并点击 Deselect features from all layers(取消选择所有图层中的要素)按钮以移除选择。我们现在将合并所有相邻的道路段,这样交叉点之间的路段将被合并为一个要素。打开处理工具箱,找到 Vector geometry(矢量几何)‣ Dissolve(融合)算法。双击打开它。

../../_images/image6.png

  1. 选择 chennai_roads 作为 Input layer(输入图层)。输入 Dissolved output layer(融合输出图层)名称为 roads_dissolved.gpkg。点击 Run(运行)。

../../_images/image7.png

  1. 结果图层 roads_dissolved 将所有道路段合并成了一个要素。

../../_images/image8.png

  1. 接下来,打开处理工具箱,找到 Vector geometry(矢量几何)‣ Multipart to single parts(多部分转单部分)算法。双击打开它。选择 roads_dissolved 图层作为 Input layer(输入图层)。输入 roads_singleparts.gpkg 作为 Single parts output(单部分输出)。点击 Run(运行)。

../../_images/image9.png

  1. 结果图层 roads_singleparts 将包含所有相邻路段合并后的结果。移除 roads_dissolvedchennai_roads 图层。现在,打开处理工具箱,找到 Vector overlay(矢量叠加)‣ Line intersections(线相交)算法。双击启动它。

../../_images/image10.png

  1. 选择 roads_singleparts 作为 Input layer(输入图层)和 Intersect layer(相交图层)。命名 Intersections output layer(相交输出图层)为 roads_line_intersections.gpkg。点击 Run(运行)。

../../_images/image11.png

注意

这是一个计算密集型操作,根据您的计算机处理能力,可能需要很长时间。

  1. 结果图层 roads_line_intersections 现在正确地识别了所有交叉点。但它仍然不完美。使用 Select features by Area(按区域选择要素)工具选择任意一个交叉点。您会看到,在每个交叉点处,相邻线段都有几个重复的点。如果我们使用此图层进行进一步分析,将导致交叉点数量膨胀。让我们移除重复项,打开处理工具箱,找到 Vector general(矢量常规)‣ Delete duplicate geometries(删除重复几何图形)算法。选择 roads_line_intersections 作为 Input layer(输入图层),并输入 road_intersections.gpkg 作为 Cleaned output layer(清理后的输出图层)。点击 Run(运行)。

../../_images/image12.png

  1. 新的 road_intersections 图层包含从源图层提取的正确数量的道路交叉口。右键单击旧的 road_line_intersections 图层并选择 Remove layer(移除图层)将其移除。

../../_images/image13.png

  1. 我们现在将通过叠加一个规则网格并计算每个网格多边形中的点数来计算点的密度。我们必须将数据重新投影到一个投影坐标系(CRS),以便我们可以使用线性测量单位。我们可以根据城市所在的 UTM 区使用合适的 CRS。您可以查看 UTM Grid Zones of the World 地图来查找您城市的 UTM 区。金奈位于 UTM 44N 区。打开处理工具箱,找到 Vector general(矢量常规)‣ Reproject(重新投影)算法。双击打开它。

../../_images/image14.png

  1. 选择 road_intersections 作为 Input layer(输入图层)。点击 Target CRS(目标 CRS)旁边的地球图标进行搜索,选择 EPSG:32644 - WGS 84 / UTM zone 44N。这是一个基于 WGS84 基准面的 UTM 44N区 CRS。输入 Reprojected output layer(重新投影输出图层)为 road_intersections_reprojected.gpkg。点击 Run(运行)。

../../_images/image15.png

  1. 处理完成后,road_intersections_reprojected 图层被添加。右键单击它并选择 Layer CRS(图层 CRS)‣ Set Project CRS from Layer(从图层设置项目 CRS)。然后移除 road_intersections 图层。

../../_images/image16.png

  1. 项目 CRS 将在窗口右下角更新。此步骤的目的是确保所有图层都在新图层的 CRS 中显示。我们现在已准备好以 road_intersections_reprojected 为参考创建网格。打开处理工具箱,找到 Vector creation(矢量创建)‣ Create grid(创建网格)算法。双击打开。

../../_images/image17.png

  1. 选择 Grid type(网格类型)为 Rectangle(Polygon)(矩形(多边形))。点击 Grid extent(网格范围)中的 ... 按钮,选择 Calculate from Layer(从图层计算)‣ road_intersections_reprojected。

../../_images/image18.png

  1. 选择 Project CRS(项目 CRS)作为 Grid CRS(网格 CRS)。我们想创建一个 1km x 1km 的网格,因此将 Horizontal spacing(水平间距)和 Vertical spacing(垂直间距)都设置为 1000 米。将 Grid output layer(网格输出图层)保存为 grid.gpkg。点击 Run(运行)。

../../_images/image19.png

  1. 包含矩形网格多边形的 grid 图层将被创建。我们现在可以计算每个多边形中的点数,但由于我们的图层很大,此过程可能需要很长时间。加速空间操作的一种方法是使用 空间索引(Spatial Index)。打开处理工具箱,找到 Vector general(矢量常规)‣ Create spatial index(创建空间索引)算法。双击打开它。

../../_images/image20.png

  1. 选择 grid 图层并点击 Run(运行),现在该图层将具有空间索引,可以提高使用此图层进行计算时的性能。

../../_images/image21.png

  1. 打开处理工具箱,找到 Vector analysis(矢量分析)‣ Count points in polygon(计算多边形中的点数)算法。

../../_images/image22.png

  1. 选择 grid 作为 Polygon layer(多边形图层),road_intersections_reprojected 作为 Points layer(点图层)。将 Count output layer(计数输出图层)保存为 grid_count.gpkg。点击 Run(运行)。

../../_images/image23.png

  1. 结果图层 grid_count 将包含一个名为 NUMPOINTS 的属性,该属性记录了每个网格内的交叉口数量。有很多网格的值为 0。移除不包含任何交叉口的网格多边形将有助于我们的分析和可视化。打开处理工具箱,找到 Vector selection(矢量选择)‣ Extract by attribute(按属性提取)算法。

../../_images/image24.png

  1. 选择 grid_count 作为 Input layer(输入图层),然后在 Selection attribute(选择属性)中选择 NUMPOINTS,在 Operator(运算符)中选择 >,并输入 0 作为 Value(值)。将 Extracted (attribute) output layer(提取(属性)输出图层)保存为 grid_counts_chennai.gpkg。点击 Run(运行)。

../../_images/image25.png

  1. 结果图层 grid_counts_chennai 将包含覆盖金奈市的网格多边形,并且每个多边形的属性中记录了道路交叉口的数量。移除除 grid_counts_chennai 以外的所有图层。

../../_images/image26.png

  1. 让我们清理数据图层的属性表。修改属性表的首选方法是使用名为 Refactor Fields(重构字段)的处理算法。打开处理工具箱,找到 Vector table(矢量表)‣ Refactor Fields(重构字段)算法。双击打开它。点击 Field Mapping(字段映射)部分的任意一行进行选择。您可以按住 Shift 键选择多行,选择除 fid 和 NUMPOINTS 之外的所有字段。点击 Delete selected fields(删除所选字段)按钮。

../../_images/image27.png

  1. 将 NUMPOINTS 字段重命名为 intersection_density,并将图层保存为 road_intersection_density.gpkg,点击 Run(运行)。

../../_images/image28.png

  1. 让我们对这个图层进行样式化,以查看每个网格的密度。选择 road_intersection_density 图层,然后点击 Open the Layer Styling Panel(打开图层样式面板)。选择 Graduated renderer(分级渲染器),在 Values(值)中选择 Intersection Density(交叉口密度),选择您喜欢的 Color ramp(色带),将 classes(类别)设置为 7 并点击 Classify(分类)。

../../_images/image29.png

  1. 在值中输入 0-50, 50-100, 100-150 等,直到 300 - 350。您现在已创建了一张显示整个城市交叉口密度的地图。

../../_images/image30.png


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