6.2. Lesson: 向量分析
还可以分析矢量数据,以揭示不同的要素如何在空间中相互作用。有许多不同的与分析相关的函数,所以我们不会一一介绍。相反,我们将提出一个问题,并尝试使用QGIS提供的工具来解决它。
The goal for this lesson: 提出问题并使用分析工具解决问题。
6.2.1.
地理信息系统流程
在我们开始之前,给出一个可用于解决问题的过程的简要概述将是有用的。解决这一问题的方法是:
陈述问题
获取数据
分析问题
展示结果
6.2.2.
问题所在
让我们从决定一个要解决的问题开始这个过程。例如,你是一名房地产经纪人,正在寻找一处位于 Swellendam 对于符合以下条件的客户:
它需要放在 Swellendam
它必须在学校的合理驾驶距离内(比如1公里)
它的大小必须超过100米平方
距离一条主干道不到50米
离餐厅不到500米
6.2.3.
数据
要回答这些问题,我们需要以下数据:
该地区的住宅物业(建筑物)
镇上和周围的道路
学校和餐馆的位置
建筑物的大小
这些数据可以通过OSM获得,您应该会发现本手册中使用的数据集也可以用于本课。
如果您想从其他区域下载数据,请跳转到 Introduction Chapter 阅读如何做到这一点。
备注
尽管OSM下载具有一致的数据字段,但覆盖范围和详细信息确实有所不同。例如,如果您发现所选区域不包含有关餐馆的信息,则可能需要选择其他区域。
6.2.4.
Follow Along: Start a Project and get the Data
我们首先需要加载要使用的数据。
启动新的QGIS项目
如果您愿意,您可以添加背景地图。打开 Browser 并加载 OSM 背景地图来自 XYZ Tiles 菜单。
在
training_data.gpkg
Geopackage数据库,您将找到本章中将使用的大多数数据集:buildings
roads
restaurants
schools
加载它们,并且还
landuse.sqlite
。缩放至层范围以查看 Swellendam ,南非
在继续之前,我们将筛选 roads 层,以便只有一些特定的道路类型可用。
OSM数据集中的一些道路列出如下
unclassified
,tracks
,path
和footway
。我们希望从我们的数据集中排除这些类型,并将重点放在更适合本练习的其他道路类型上。此外,OSM数据可能不会在所有地方更新,我们也将排除
NULL
价值观。右键单击
roads
分层并选择 Filter... 。在弹出的对话框中,我们使用以下表达式过滤这些功能:
"highway" NOT IN ('footway', 'path', 'unclassified', 'track') AND "highway" IS NOT NULL
两个运算符的连接
NOT
和IN
中包含这些属性值的所有要素highway
菲尔德。IS NOT NULL
结合了AND
运算符不包括在highway
菲尔德。
包含所有数据的地图应如下所示:

6.2.5.
Try Yourself Convert Layers' CRS
因为我们要测量层内的距离,所以需要更改层的CRS。要做到这一点,我们需要依次选择每个层,用我们的新投影将该层保存到一个新的层,然后将该新层导入我们的地图。
您有许多不同的选项,例如,可以将每个图层导出为ESRI Shapefile格式的数据集,可以将图层附加到现有的GeoPackage文件,或者可以创建另一个GeoPackage文件并使用新的重新投影的图层填充该文件。我们将显示最后一个选项,因此 training_data.gpkg
都会保持清白。您可以自由选择最适合自己的工作流程。
备注
在本例中,我们使用 WGS 84 / UTM zone 34S CRS,但您应该使用更适合您所在地区的UTM CRS。
右键单击 roads 中的层 Layers 嵌板
单击 Export --> Save Features As...
在 Save Vector Layer As 对话框选择 GeoPackage AS Format
点击 ... 对于 File name ,并将新的地理包命名为
vector_analysis
更改 Layer name 至
roads_34S
更改 CRS 至 WGS 84 / UTM zone 34S
点击 OK :
这将创建新的GeoPackage数据库并添加
roads_34S
一层。对每个层重复此过程,在中创建新层
vector_analysis.gpkg
包含的GeoPackage文件_34S
附加在原始名称之后。在MacOS上,按下 Replace 弹出对话框中的按钮,允许QGIS覆盖现有的GeoPackage。
备注
选择将图层保存到现有GeoPackage时,QGIS将 add GeoPackage中现有层旁边的该层(如果尚不存在同名的层)。
从项目中移除每个旧的图层
完成所有层的过程后,右键单击任意层,然后单击 Zoom to layer extent 将地图聚焦到感兴趣的区域。
现在我们已经将OSM数据转换为UTM投影,我们可以开始计算了。
6.2.6.
Follow Along: Analyzing the Problem: Distances From Schools and Roads
QGIS允许您计算任何矢量对象之间的距离。
确保只有
roads_34S
和buildings_34S
层是可见的(以便在您工作时简化地图)按下
打开分析的步骤 core Q地理信息系统。基本上, all 算法(用于向量 and 栅格分析)在此工具箱中可用。我们首先计算周围的面积
roads_34S
通过使用 Buffer 算法。您可以在 一群人。或者你也可以输入
buffer
在工具箱上部的搜索菜单中:双击它以打开算法对话框
选择
roads_34S
AS Input layer ,设置 Distance 设置为50,并使用其余参数的默认值。默认设置 Distance 是以米为单位的,因为我们的输入数据集位于使用米作为其基本测量单位的投影坐标系中。您可以使用组合框选择其他投影单位,如公里、码等。
备注
如果您尝试在具有地理坐标系的图层上创建缓冲区,处理过程将向您发出警告并建议您将该图层重新投影到公制坐标系。
默认情况下, Processing 创建临时层并将其添加到 Layers 面板。您还可以通过以下方式将结果追加到GeoPackage数据库:
点击 ... 按钮,然后选择 Save to GeoPackage...
命名新层
roads_buffer_50m
将其保存在
vector_analysis.gpkg
文件
点击 Run ,然后关闭 Buffer 对话框
现在,您的地图将如下所示:
如果您的新层位于 Layers 列表,它可能会模糊你的地图的大部分,但这给你的地区的所有地区,在一条道路的50米以内。
请注意,缓冲区中有不同的区域,与每条单独的道路相对应。要摆脱这个问题,请执行以下操作:
取消选中 roads_buffer_50m 层,并使用重新创建缓冲区 Dissolve results 已启用。
将输出另存为 roads_buffer_50m_dissolved
单击 Run 并关闭 Buffer 对话框
将该层添加到 Layers 面板中,它将如下所示:

现在没有不必要的细分。
备注
这个 Short Help 对话框右侧说明了该算法的工作原理。如果您需要更多信息,只需点击 Help 按钮在底部打开更详细的算法指南。
6.2.7.
Try Yourself Distance from schools
使用与上述相同的方法,为您的学校创建一个缓冲区。
它应该是 1 km
半径。将新层保存在 vector_analysis.gpkg
文件为 schools_buffer_1km_dissolved
。
回答
缓冲区对话框应如下所示:
这个 Buffer distance 是 1 一公里。
这个 Segments to approximate 值设置为 20 。这是可选的,但建议这样做,因为它使输出缓冲区看起来更平滑。请比较以下内容:
对此:
第一张图片显示了带有 Segments to approximate 值设置为 5 而第二个则显示设置为 20 。在我们的示例中,差异很细微,但您可以看到,值越大,缓冲区的边缘就越平滑。
6.2.8.
Follow Along: Overlapping Areas
现在我们已经确定了距离公路不到50米的地区,以及1公里内有学校的地区(直达,而不是公路)。但显然,我们只想要这两个标准都满足的领域。要做到这一点,我们需要使用 Intersect 工具。您可以在以下位置找到 组中的 Processing Toolbox 。
将这两个缓冲层用作 Input layer 和 Overlay layer ,选择
vector_analysis.gpkg
GeoPackage in Intersection 使用 Layer nameroad_school_buffers_intersect
。将其余部分保留为建议(默认)。单击 Run 。
在下图中,蓝色区域是满足两个距离标准的区域。
您可以删除两个缓冲层,只保留显示它们重叠的那个层,因为这才是我们首先真正想知道的:
6.2.9.
Follow Along: Extract the Buildings
现在,您已经获得了建筑物必须重叠的区域。接下来,您要提取该区域中的建筑。
查找菜单项
在 Processing Toolbox选择
buildings_34S
在……里面 Extract features from 。检查 intersect 在……里面 Where the features (geometric predicate) ,在中选择缓冲区交叉点图层 By comparing to the features from 。保存到vector_analysis.gpkg
,并将层命名为well_located_houses
。单击 Run 并关闭该对话框
你可能会发现,似乎没有太多变化。如果是,则将 well_located_houses 层到层列表的顶部,然后放大。
红色的建筑符合我们的标准,绿色的建筑不符合我们的标准。
现在您有两个分离的层,可以删除
buildings_34S
从层列表中。
6.2.10.
Try Yourself Further Filter our Buildings
我们现在有一个层,它显示了一所学校1公里内和一条道路50米内的所有建筑。我们现在需要减少选择,只显示距离餐厅500米以内的建筑。
使用上述过程创建一个名为的新图层 houses_restaurants_500m 它会进一步过滤您的 well_located_houses 层,仅显示餐厅周围500米范围内的区域。
回答
要创建新的 houses_restaurants_500m 层,我们将经历一个两步过程:
首先,在餐厅周围创建一个500米的缓冲区,并将该层添加到地图中:
接下来,提取该缓冲区内的建筑物:
您的地图现在应该只显示那些距离道路50米以内、距离学校1公里、距离餐厅500米的建筑:

6.2.11.
Follow Along: Select Buildings of the Right Size
要查看哪些建筑的大小正确(超过100平方米),我们需要计算它们的大小。
选择 houses_restaurants_500m 层,然后打开 Field Calculator 通过单击
Open Field Calculator 主工具栏或属性表窗口中的按钮
选择 Create a new field ,设置 Output field name 至
AREA
,选择 Decimal number (real) AS Output field type ,然后选择$area
从 一群人。新领域
AREA
每栋建筑的面积将以平方米为单位。单击 OK 。这个
AREA
已在属性表的末尾添加了字段。在 Provider Feature Filter 至
选项卡中,设置"AREA >= 100
。单击 OK 。
您的地图现在应该只向您显示那些符合我们的起始标准且大小超过100平方米的建筑。
6.2.12.
Try Yourself
使用您在上面学到的方法将您的解决方案保存为新的层。该文件应保存在相同的GeoPackage数据库中,名称为 solution
。
6.2.13. In Conclusion
结合使用GIS问题求解方法和QGIS矢量分析工具,您能够快速、轻松地解决具有多个标准的问题。
6.2.14. What's Next?
在下一课中,我们将学习如何计算从一点到另一点的道路上的最短距离。