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
图层。对每个图层重复此过程,在
vector_analysis.gpkg
GeoPackage 文件中创建新图层,原始名称后附加_34S
,并从工程中移除每个原图层。备注
选择将图层保存到现有GeoPackage时,QGIS会将该图层 追加 到GeoPackage。
完成所有图层的处理后,右键单击任意图层,然后单击 缩放到图层范围 ,将地图聚焦到关注区。
现在,我们已经将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. 试一试
使用上述学到的方法,将解决方案另存为一个新图层。该文件应保存在同一GeoPackage数据库中,名称是 solution
。
6.2.13. 综上所述
将GIS问题解决方法和QGIS矢量分析工具结合使用,您能够快速轻松地解决含有多个条件的问题。
6.2.14. 下节引言
在下一课,我们将学习如何计算沿道路从一个点到另一个点的最短距离。