6.2. 课: 矢量分析
矢量数据也可以分析,以揭示不同要素在空间中是如何相互作用的。有许多不同的与分析相关的函数,因此不会一一介绍。相反,我们将提出问题,并尝试使用QGIS提供的工具来解决。
本课目标: 提出问题并使用分析工具进行解决。
6.2.1. GIS流程
在开始之前,简要叙述一下可用于解决问题的流程是很有用的。相关过程为:
陈述问题
获取数据
分析问题
结果展示
6.2.2. 问题
让我们从决定要解决的问题开始这个过程。例如,您是一名房地产经纪人,并且正在为符合以下条件的客户在 Swellendam 寻找一处住宅物业:
必须位于 Swellendam
必须在学校的合理驾驶距离内 (比如1千米)
它的面积必须超过 100m 的平方
距离主干道50米以内
距离餐厅500米以内
6.2.3. 数据
为了回答这些问题,我们需要以下数据:
该地区的住宅物业 (建筑物)
中心区内外的道路
学校和餐馆的位置
建筑物的面积
这些数据可以通过OSM获得,您应该会发现,本手册使用的数据集也可以用于本课程。
如果您想从另一位置下载数据,请转到 简介章节 阅读如何下载。
备注
虽然OSM下载具有一致的数据字段,但覆盖范围和详细信息确实有所不同。例如,如果您发现所选地区不包含餐厅信息,则可能需要选择其他地区。
6.2.4. 跟我做: 启动工程并获取数据
我们首先需要加载要使用的数据。
新建QGIS工程
如果需要,可以添加背景地图。打开 浏览器 并从 XYZ瓦片 菜单加载 OSM 背景地图。
在
training_data.gpkg
Geopackage数据库,您将找到我们在本章中使用的大多数数据集:buildings
roads
restaurants
schools
请加载上述数据,以及
landuse.sqlite
。缩放到图层范围以查看南非的 Swellendam
在继续之前,我们将过滤 roads 图层,以便只处理某些指定的道路类型。
OSM数据集中的一些道路被分为
unclassified
,tracks
,path
和footway
。我们希望从数据集中排除这些道路,并将重点放在更适合本练习的其他道路类型。此外,OSM数据可能不会在所有地方更新,我们还将排除
NULL
值。右键单击
roads
图层并选择 过滤... 。在弹出的对话框中,我们使用以下表达式过滤这些要素:
"highway" NOT IN ('footway', 'path', 'unclassified', 'track') AND "highway" IS NOT NULL
两个运算符
NOT
和IN
的连接将排除highway
字段中具有这些属性值的所有要素。IS NOT NULL
与AND
运算符结合使用时,排除在highway
字段中空值的道路。
包含所有数据的地图应如下所示:
6.2.5. 试一试 转换图层的CRS
因为我们要测量图层内的距离,所以需要更改图层的CRS。为此,依次选择每个图层,使用新投影将图层保存到新图层,然后将新图层导入地图。
您有许多不同的选项,例如,可以将每个图层导出为 ESRI Shapefile 格式的数据集,也可以将图层附加到现有的GeoPackage文件,或是创建另外的GeoPackage文件并用新的重投影图层填充。我们将选择最后的选项,这样 training_data.gpkg
将保持原样。请随意为自己选择最佳的工作流程。
备注
在此示例,我们使用的是 WGS 84 / UTM zone 34S CRS,但您应该使用更符合您所在地区的 UTM CRS。
右键单击 图层 面板中的 roads 图层
单击 导出 --> 要素另存为...
在 矢量图层另存为 对话框中,选择 格式 为 GeoPackage
单击 文件名 后面的 ... ,选择保存位置并将新的GeoPackage命名为
vector_analysis
将 图层名 更改为
roads_34S
将 CRS 更改为 WGS 84 / UTM zone 34S
单击 确定:
这将创建新的GeoPackage数据库并添加
roads_34S
图层。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.
Remove each of the old layers from the project
完成所有图层的处理后,右键单击任意图层,然后单击 缩放到图层范围 ,将地图聚焦到关注区。
现在,我们已经将OSM数据转换为UTM投影,可以开始计算了。
6.2.6. 跟我做: 分析问题 - 学校和道路的距离
QGIS允许您计算任何矢量对象之间的距离。
确保只有
roads_34S
和buildings_34S
图层可见 (以便在使用时简化地图)单击
打开QGIS分析 核心 工具箱。基本上, 所有 算法 (用于矢量 和 栅格分析) 都可以在此工具箱中获取。我们首先使用 缓冲区 算法计算
roads_34S
周围的面积。您可以在 组中找到。也可以在工具箱上部的搜索栏中键入
buffer
或缓冲区
:双击它以打开算法对话框
在 输入图层 中选择
roads_34S
,将 距离 设置为50,其余参数使用默认值。默认 default 距离 以米为单位,因为我们的输入数据集位于投影坐标系中,该坐标系使用米作为基本测量单位。您可以使用组合框选择其他投影单位,如千米、码等。
备注
如果尝试在具有地理坐标系的图层上创建缓冲区,数据处理将警告您,并建议将图层重投影到度量坐标系。
默认情况下, 数据处理 会创建临时图层并将其添加到 图层 面板。还可以通过以下方式将结果追加到GeoPackage数据库:
单击 ... 按钮并选择 保存到GeoPackage...
将新图层命名为
roads_buffer_50m
将其保存在
vector_analysis.gpkg
文件
单击 运行 ,然后关闭 缓冲区 对话框
现在,您的地图应该如下所示:
如果您的新图层位于 图层 列表顶部,它可能会遮挡大部分地图,但这将为您提供所在地区距离道路50米范围以内的所有区域。
请注意,缓冲区内有不同的区域,对应于每条单独的道路。要解决此问题,请执行以下操作:
取消勾选 roads_buffer_50m 图层,并在启用 融合结果 的情况下重新创建缓冲区。
将输出保存为 roads_buffer_50m_dissolved
单击 运行 并关闭 缓冲区 对话框
将图层添加到 图层 面板后,它将如下所示:
现在没有多余的细分。
备注
对话框右侧的 简短帮助 解释了算法的工作原理。如果需要更多信息,只需单击底部的 帮助 按钮,即可打开更详细的算法指南。
6.2.7. 试一试 学校的距离
使用与上面相同的方法,为您的学校创建缓冲区。
其半径应为 1 km
,在 vector_analysis.gpkg
文件保存新图层为 schools_buffer_1km_dissolved
。
回答
您的缓冲区对话框应如下所示:
缓冲距离 为 1 千米。
近似线段数 值设置为 20 。这是可选的,但建议这样做,因为这会使输出缓冲区看起来更平滑。比较一下:
对此:
第一幅图显示的缓冲区是将 近似线段数 值设置为 5 ,第二幅图显示的是设置为 20 的值。在我们的示例中,差异很小,但您可以看到,缓冲区的边随着值的增加而变得更平滑。
6.2.8. 跟我做: 重叠区域
现在,我们已经确定了道路距离不到50米的区域,以及1千米以内有学校的区域 (直线,而不是公路)。但很明显,我们只想要同时满足这两个条件的区域。为此,需要使用 相交 工具,您可以在 处理工具箱 中的 组中找到。
使用这两个缓冲区图层作为 输入图层 和 叠加图层 ,在 相交 中选择
vector_analysis.gpkg
的GeoPackage,并将 图层名 命名为road_school_buffers_intersect
。其它参数按建议 (默认) 处理。单击 运行 。
下图中,蓝色区域是同时满足两个距离条件的区域。
您可以移除两个缓冲区图层,只保留显示它们重叠位置的缓冲区图层,因为这是我们一开始真正想知道的:
6.2.9. 跟我做: 提取建筑物
现在,您已获得了建筑必须重叠的区域。接下来,是要提取该地区的建筑物。
在 处理工具箱 查找菜单项
在 提取要素于 中选择
buildings_34S
;在 要素位置 (几何图形空间关系) 中勾选 相交 ;在 与以下要素进行比较 中选择缓冲区相交图层。保存到vector_analysis.gpkg
,并将该图层命名为well_located_houses
。单击 运行 并关闭对话框
您可能会发现似乎没有太大变化。如果是这样,请将 well_located_houses 图层移到图层列表的顶部,然后放大。
红色的建筑符合我们的条件,而绿色的建筑则不符合我们的要求。
现在您有了两个独立的图层,可以从图层列表中移除
buildings_34S
。
6.2.10. 试一试 进一步过滤建筑物
我们现在有一个图层,显示了学校1千米和道路50米范围以内的所有建筑。现在需要减少选择,只显示距离餐厅500米以内的建筑。
使用上述流程,创建一个名为 houses_restaurants_500m 的新图层,该图层可进一步过滤 well_located_houses 图层,仅显示餐厅500m范围内的房屋。
回答
要创建 houses_restaurants_500m 新图层,需要经过两个步骤:
首先,在餐厅周围创建500米的缓冲区,并将图层添加到地图:
接下来,提取该缓冲区内的建筑物:
您的地图现在应该只显示距离道路50米、学校1千米和餐厅500米范围以内的建筑:
6.2.11. 跟我做: 选择面积合适的建筑
要查看哪些建筑的面积符合要求 (超过100平方米),我们需要计算它们的面积。
选择 houses_restaurants_500m 图层,通过单击主工具栏或属性表窗口中的 打开字段计算器 按钮打开 字段计算器
选择 新建字段 ,将 输出字段名称 设置为
AREA
,选择 输出字段类型 为 小数 (实型) ,然后从 组中选择$area
。新字段
AREA
将包含每栋建筑的面积,单位是平方米。单击 确定 。
AREA
字段已添加到属性表的末尾。在图层属性的 提供程序的要素过滤 设置为
选项卡中,将"AREA >= 100
。单击 确定 。
您的地图现在应该只显示那些符合我们开始的条件,并且面积超过100平方米的建筑。
6.2.12. Try Yourself
使用上述学到的方法,将解决方案另存为一个新图层。该文件应保存在同一GeoPackage数据库中,名称是 solution
。
6.2.13. In Conclusion
将GIS问题解决方法和QGIS矢量分析工具结合使用,您能够快速轻松地解决含有多个条件的问题。
6.2.14. What's Next?
在下一课,我们将学习如何计算沿道路从一个点到另一个点的最短距离。