6.2. 课: 矢量分析

矢量数据也可以分析,以揭示不同要素在空间中是如何相互作用的。有许多不同的与分析相关的函数,因此不会一一介绍。相反,我们将提出问题,并尝试使用QGIS提供的工具来解决。

本课目标: 提出问题并使用分析工具进行解决。

6.2.1. basic GIS流程

在开始之前,简要叙述一下可用于解决问题的流程是很有用的。相关过程为:

  1. 陈述问题

  2. 获取数据

  3. 分析问题

  4. 结果展示

6.2.2. basic 问题

让我们从决定要解决的问题开始这个过程。例如,您是一名房地产经纪人,并且正在为符合以下条件的客户在 Swellendam 寻找一处住宅物业:

  1. 必须位于 Swellendam

  2. 必须在学校的合理驾驶距离内 (比如1千米)

  3. 它的面积必须超过 100m 的平方

  4. 距离主干道50米以内

  5. 距离餐厅500米以内

6.2.3. basic 数据

为了回答这些问题,我们需要以下数据:

  1. 该地区的住宅物业 (建筑物)

  2. 中心区内外的道路

  3. 学校和餐馆的位置

  4. 建筑物的面积

这些数据可以通过OSM获得,您应该会发现,本手册使用的数据集也可以用于本课程。

如果您想从另一位置下载数据,请转到 简介章节 阅读如何下载。

备注

虽然OSM下载具有一致的数据字段,但覆盖范围和详细信息确实有所不同。例如,如果您发现所选地区不包含餐厅信息,则可能需要选择其他地区。

6.2.4. basic 跟我做: 启动工程并获取数据

我们首先需要加载要使用的数据。

  1. 新建QGIS工程

  2. 如果需要,可以添加背景地图。打开 浏览器 并从 XYZ瓦片 菜单加载 OSM 背景地图。

    ../../../_images/osm_swellendam.png
  3. training_data.gpkg Geopackage数据库,您将找到我们在本章中使用的大多数数据集:

    1. buildings

    2. roads

    3. restaurants

    4. schools

    请加载上述数据,以及 landuse.sqlite

  4. 缩放到图层范围以查看南非的 Swellendam

    在继续之前,我们将过滤 roads 图层,以便只处理某些指定的道路类型。

    OSM数据集中的一些道路被分为 unclassified, tracks, pathfootway 。我们希望从数据集中排除这些道路,并将重点放在更适合本练习的其他道路类型。

    此外,OSM数据可能不会在所有地方更新,我们还将排除 NULL 值。

  5. 右键单击 roads 图层并选择 过滤...

  6. 在弹出的对话框中,我们使用以下表达式过滤这些要素:

    "highway" NOT IN ('footway', 'path', 'unclassified', 'track') AND "highway" IS NOT NULL
    

    两个运算符 NOTIN 的连接将排除 highway 字段中具有这些属性值的所有要素。

    IS NOT NULLAND 运算符结合使用时,排除在 highway 字段中空值的道路。

    请注意 roads 图层旁边的 indicatorFilter 图标。这有助于您记住,该图层有已激活的过滤器,因此某些要素可能在工程中不可用。

包含所有数据的地图应如下所示:

../../../_images/osm_swellendam_2.png

6.2.5. basic 试一试 转换图层的CRS

因为我们要测量图层内的距离,所以需要更改图层的CRS。为此,依次选择每个图层,使用新投影将图层保存到新图层,然后将新图层导入地图。

您有许多不同的选项,例如,可以将每个图层导出为 ESRI Shapefile 格式的数据集,也可以将图层附加到现有的GeoPackage文件,或是创建另外的GeoPackage文件并用新的重投影图层填充。我们将选择最后的选项,这样 training_data.gpkg 将保持原样。请随意为自己选择最佳的工作流程。

备注

在此示例,我们使用的是 WGS 84 / UTM zone 34S CRS,但您应该使用更符合您所在地区的 UTM CRS。

  1. 右键单击 图层 面板中的 roads 图层

  2. 单击 导出 --> 要素另存为...

  3. 矢量图层另存为 对话框中,选择 格式GeoPackage

  4. 单击 文件名 后面的 ... ,选择保存位置并将新的GeoPackage命名为 vector_analysis

  5. 图层名 更改为 roads_34S

  6. CRS 更改为 WGS 84 / UTM zone 34S

  7. 单击 确定:

    ../../../_images/save_roads_34S.png

    这将创建新的GeoPackage数据库并添加 roads_34S 图层。

  8. 对每个图层重复此过程,在 vector_analysis.gpkg GeoPackage 文件中创建新图层,原始名称后附加 _34S ,并从工程中移除每个原图层。

    备注

    选择将图层保存到现有GeoPackage时,QGIS会将该图层 追加 到GeoPackage。

  9. 完成所有图层的处理后,右键单击任意图层,然后单击 缩放到图层范围 ,将地图聚焦到关注区。

现在,我们已经将OSM数据转换为UTM投影,可以开始计算了。

6.2.6. basic 跟我做: 分析问题 - 学校和道路的距离

QGIS允许您计算任何矢量对象之间的距离。

  1. 确保只有 roads_34Sbuildings_34S 图层可见 (以便在使用时简化地图)

  2. 单击 数据处理 ► 工具箱 打开QGIS分析 核心 工具箱。基本上, 所有 算法 (用于矢量 栅格分析) 都可以在此工具箱中获取。

  3. 我们首先使用 缓冲区 算法计算 roads_34S 周围的面积。您可以在 矢量几何图形 组中找到。

    ../../../_images/processing_buffer_1.png

    也可以在工具箱上部的搜索栏中键入 buffer缓冲区

    ../../../_images/processing_buffer_2.png
  4. 双击它以打开算法对话框

  5. 输入图层 中选择 roads_34S ,将 距离 设置为50,其余参数使用默认值。

    ../../../_images/vector_buffer_setup.png
  6. 默认 default 距离 以米为单位,因为我们的输入数据集位于投影坐标系中,该坐标系使用米作为基本测量单位。您可以使用组合框选择其他投影单位,如千米、码等。

    备注

    如果尝试在具有地理坐标系的图层上创建缓冲区,数据处理将警告您,并建议将图层重投影到度量坐标系。

  7. 默认情况下, 数据处理 会创建临时图层并将其添加到 图层 面板。还可以通过以下方式将结果追加到GeoPackage数据库:

    1. 单击 ... 按钮并选择 保存到GeoPackage...

    2. 将新图层命名为 roads_buffer_50m

    3. 将其保存在 vector_analysis.gpkg 文件

    ../../../_images/buffer_saving.png
  8. 单击 运行 ,然后关闭 缓冲区 对话框

    现在,您的地图应该如下所示:

    ../../../_images/roads_buffer_result.png

如果您的新图层位于 图层 列表顶部,它可能会遮挡大部分地图,但这将为您提供所在地区距离道路50米范围以内的所有区域。

请注意,缓冲区内有不同的区域,对应于每条单独的道路。要解决此问题,请执行以下操作:

  1. 取消勾选 roads_buffer_50m 图层,并在启用 融合结果 的情况下重新创建缓冲区。

    ../../../_images/dissolve_buffer_setup.png
  2. 将输出保存为 roads_buffer_50m_dissolved

  3. 单击 运行 并关闭 缓冲区 对话框

将图层添加到 图层 面板后,它将如下所示:

../../../_images/dissolve_buffer_results.png

现在没有多余的细分。

备注

对话框右侧的 简短帮助 解释了算法的工作原理。如果需要更多信息,只需单击底部的 帮助 按钮,即可打开更详细的算法指南。

6.2.7. basic 试一试 学校的距离

使用与上面相同的方法,为您的学校创建缓冲区。

其半径应为 1 km ,在 vector_analysis.gpkg 文件保存新图层为 schools_buffer_1km_dissolved

6.2.8. basic 跟我做: 重叠区域

现在,我们已经确定了道路距离不到50米的区域,以及1千米以内有学校的区域 (直线,而不是公路)。但很明显,我们只想要同时满足这两个条件的区域。为此,需要使用 相交 工具,您可以在 处理工具箱 中的 矢量叠加 组中找到。

  1. 使用这两个缓冲区图层作为 输入图层叠加图层 ,在 相交 中选择 vector_analysis.gpkg 的GeoPackage,并将 图层名 命名为 road_school_buffers_intersect 。其它参数按建议 (默认) 处理。

    ../../../_images/school_roads_intersect.png
  2. 单击 运行

    下图中,蓝色区域是同时满足两个距离条件的区域。

    ../../../_images/intersect_result.png
  3. 您可以移除两个缓冲区图层,只保留显示它们重叠位置的缓冲区图层,因为这是我们一开始真正想知道的:

    ../../../_images/final_intersect_result.png

6.2.9. basic 跟我做: 提取建筑物

现在,您已获得了建筑必须重叠的区域。接下来,是要提取该地区的建筑物。

  1. 处理工具箱 查找菜单项 矢量选择 ► 按位置提取

  2. 提取要素于 中选择 buildings_34S ;在 要素位置 (几何图形空间关系) 中勾选 相交 ;在 与以下要素进行比较 中选择缓冲区相交图层。保存到 vector_analysis.gpkg ,并将该图层命名为 well_located_houses

    ../../../_images/location_select_dialog.png
  3. 单击 运行 并关闭对话框

  4. 您可能会发现似乎没有太大变化。如果是这样,请将 well_located_houses 图层移到图层列表的顶部,然后放大。

    ../../../_images/select_zoom_result.png

    红色的建筑符合我们的条件,而绿色的建筑则不符合我们的要求。

  5. 现在您有了两个独立的图层,可以从图层列表中移除 buildings_34S

6.2.10. moderate 试一试 进一步过滤建筑物

我们现在有一个图层,显示了学校1千米和道路50米范围以内的所有建筑。现在需要减少选择,只显示距离餐厅500米以内的建筑。

使用上述流程,创建一个名为 houses_restaurants_500m 的新图层,该图层可进一步过滤 well_located_houses 图层,仅显示餐厅500m范围内的房屋。

6.2.11. basic 跟我做: 选择面积合适的建筑

要查看哪些建筑的面积符合要求 (超过100平方米),我们需要计算它们的面积。

  1. 选择 houses_restaurants_500m 图层,通过单击主工具栏或属性表窗口中的 calculateField 打开字段计算器 按钮打开 字段计算器

  2. 选择 新建字段 ,将 输出字段名称 设置为 AREA ,选择 输出字段类型小数 (实型) ,然后从 几何图形 组中选择 $area

    ../../../_images/buildings_area_calculator.png

    新字段 AREA 将包含每栋建筑的面积,单位是平方米。

  3. 单击 确定AREA 字段已添加到属性表的末尾。

  4. 单击 toggleEditing 切换编辑模式 按钮完成编辑,并在出现提示时保存编辑。

  5. 在图层属性的 选项卡中,将 提供程序的要素过滤 设置为 "AREA >= 100

    ../../../_images/buildings_area_query.png
  6. 单击 确定

您的地图现在应该只显示那些符合我们开始的条件,并且面积超过100平方米的建筑。

6.2.12. basic 试一试

使用上述学到的方法,将解决方案另存为一个新图层。该文件应保存在同一GeoPackage数据库中,名称是 solution

6.2.13. 综上所述

将GIS问题解决方法和QGIS矢量分析工具结合使用,您能够快速轻松地解决含有多个条件的问题。

6.2.14. 下节引言

在下一课,我们将学习如何计算沿道路从一个点到另一个点的最短距离。