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. Repeat this process for each layer, creating a new layer in the vector_analysis.gpkg GeoPackage file with _34S appended to the original name.

    On macOS, press the Replace button in the dialog that pops up to allow QGIS to overwrite the existing GeoPackage.

    备注

    When you choose to save a layer to an existing GeoPackage, QGIS will add that layer next to the existing layers in the GeoPackage, if no layer of the same name already exists.

  9. Remove each of the old layers from the project

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

现在,我们已经将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 Try Yourself

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

6.2.13. In Conclusion

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

6.2.14. What's Next?

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