29_Multi Criteria Overlay Analysis QGIS3
原文链接: https://www.qgistutorials.com/en/docs/3/multi_criteria_overlay.html
多准则叠加分析 (QGIS3)¶
多准则加权叠加分析是根据所选区域应具备的各种属性来分配区域的过程。尽管这是 GIS 的常见操作,但最好使用基于网格的方法在栅格空间中进行。
注意
矢量叠加与栅格叠加
你可以使用缓冲区、融合、差异和相交等地理处理工具对矢量图层进行叠加分析。如果你想得到一个二元的 适合/不适合 答案,并且处理的图层数量不多,这种方法非常理想。你可以观看我们的视频教程 使用多准则叠加分析定位新的自行车停放站,了解这种方法的逐步指导。
在栅格空间中进行分析可以提供适合性的 排名——而不仅仅是最适合的地点。它还允许你轻松组合任意数量的输入图层,并为每个准则分配不同的权重。通常,这是进行选址分析的首选方法。
本教程将介绍执行选址分析(site-suitability analysis)的典型工作流程——将源矢量数据转换为适当的栅格、重新分类并执行数学运算。
任务概述¶
在本教程中,我们将识别适合开发的区域,这些区域应满足:
- 靠近道路,
- 远离水体,并且
- 不在受保护区域内。

获取数据¶
我们将使用来自 OpenStreetMap (OSM) 的矢量数据图层。OSM 是一个提供免费基础地图数据的全球数据库。Geofabrik 提供每日更新的 OpenStreetMap 数据集 shapefile。
我们将使用印度阿萨姆邦的 OSM 数据图层。Geofabrik 的 印度 shapefile 被下载后,重新投影到 UTM 投影,按州边界裁剪,并打包到一个单独的 GeoPackage 文件中。你可以从下面的链接下载该 geopackage 的副本:
数据来源:[GEOFABRIK]
操作步骤¶
- 在 QGIS 浏览器中浏览下载的
assam.gpkg文件。展开它,并将其中 5 个单独的数据图层拖放到地图画布上。你将在图层面板中看到加载的boundary、roads、protected_regions、water_polygons和water_polylines图层。
- 叠加分析的第一步是将每个数据图层转换为栅格。一个重要考虑是所有栅格必须具有相同的范围。我们将使用
boundary图层作为所有栅格的范围。转到 处理 ‣ 工具箱。搜索并找到 GDAL ‣ 矢量转换 ‣ 栅格化(矢量到栅格)算法。双击启动它。
- 在 矢量转换 - 栅格化(矢量到栅格) 对话框中,选择
roads作为 输入图层。我们希望创建一个输出栅格,其中有道路的像素值为 1,没有道路的像素值为 0。输入1作为 要写入的固定值。输入图层使用的投影坐标参考系(CRS)以米为单位。选择地理参考单位作为 输出栅格尺寸单位。我们将输出栅格的分辨率设置为 15 米。选择15作为 宽度/水平分辨率 和 高度/垂直分辨率。接下来,点击 输出范围 旁边的箭头,选择 从图层计算 ‣ boundary。
- 向下滚动找到 高级参数,选择
高压缩配置文件以应用压缩。这将在运行工具后生成文件大小较小的压缩栅格文件。在处理栅格数据时,强烈建议应用无损压缩。
- 设置 已栅格化 输出栅格 为
raster_roads.tif并点击 运行。
- 处理完成后,你将在图层面板中看到一个新的 raster_roads 图层已加载。该栅格的像素值中,与道路相交的像素值为 1。所有其他像素都被设置为 NoData 值。这些无数据值会带来问题,因为当栅格计算器(我们稍后会用到)在任何图层中遇到无数据值的像素时,它也会将该像素的输出值设置为无数据,从而导致意外的输出。我们将用值 0 填充这些无数据值。搜索并找到 栅格工具 ‣ 填充无数据单元格 算法。双击启动它。
- 选择
raster_roads作为 栅格输入,并选择0作为 填充值。向下滚动找到 高级参数,选择高压缩配置文件以应用压缩。设置 输出栅格 为raster_roads_filled.tif并点击 运行。
- 处理完成后,你将看到新图层
raster_roads_filled加载到图层面板中。此栅格中,道路的值为 1,非道路的值为 0。如果图层显示不正确,可以点击 打开图层样式面板 并设置 最小值 为0,最大值 为1。
- 对其他 3 个矢量图层
protected_regions、water_polylines和water_polygons重复步骤 3-8。你需要对这些图层进行栅格化和无数据单元格填充。如果你想手动运行这些步骤,可以配置处理算法对话框,运行算法,算法完成后,切换到 参数 选项卡,仅更改输入和输出图层名称。你也可以使用批处理(Batch Processing)在一个步骤中对所有 4 个图层运行每个算法。请参阅 使用处理框架进行批处理 (QGIS3) 教程以了解更多信息。完成后,你应该有 4 个栅格图层,并生成相应的栅格图层raster_roads_filled、raster_protected_regions_filled、raster_water_polylines_filled和raster_water_polygons_filled。你会注意到我们有两个与水相关的图层——都代表水域。我们可以合并它们,得到一个代表该区域水域的单一图层。在 处理工具箱 中搜索并找到 栅格分析 ‣ 栅格计算器 算法。双击启动它。
- 使用 … 按钮将
raster_water_polygons和raster_water_polylines图层选择为 输入图层。使用 ε 按钮输入以下表达式。保持所有其他选项为默认值,将输出图层保存为raster_water_merged.tif,然后点击 运行。
bash "raster_water_polygons_filled@1" + "raster_water_polylines_filled@1"
- 生成的合并栅格中,所有水域的像素值都为 1。但你会注意到,有些区域同时存在水域多边形和水域折线。这些区域的像素值将为 2——这是不正确的。我们可以用一个简单的表达式来修复它。再次打开 栅格分析 ‣ 栅格计算器 算法。
- 使用 … 按钮选择
raster_water_merged图层作为 输入图层。使用 ε 按钮输入以下表达式。保持所有其他选项为默认值,将输出图层保存为raster_water_filled.tif,然后点击 运行。
bash "raster_water_merged@1" > 0
- 生成的图层
raster_water_filled现在只包含 0 和 1 值的像素。
- 现在我们有了代表道路和水域像素的图层,我们可以生成邻近度栅格。这些也称为欧几里得距离——输出栅格中的每个像素代表到输入栅格中最近像素的距离。然后可以使用生成的栅格来确定与输入距离在一定范围内的合适区域。搜索并找到 GDAL ‣ 栅格分析 ‣ 邻近度(栅格距离) 算法。双击启动它。
- 在 栅格分析 - 邻近度(栅格距离) 对话框中,选择
raster_roads_filled作为 输入图层。选择地理参考坐标作为 距离单位。由于输入图层使用的投影坐标参考系以米为单位,输入5000(5公里)作为 要生成的最大距离。对于所有距离大于最大距离的像素——我们也将它们的值设为 5000。因此,设置 用于目标邻近度栅格值的无数据值 为5000。
- 你可以展开 高级参数,选择
高压缩配置文件以应用压缩。将输出文件命名为roads_proximity.tif并点击 运行。
注意
此过程可能需要长达 15 分钟才能完成。这是一个计算密集型的算法,需要计算输入栅格每个像素的距离。
- 处理完成后,新图层
roads_proximity将被添加到图层面板。为了更好地可视化,让我们更改默认样式。点击图层面板中的 打开图层样式面板 按钮。在 颜色渐变 下将 最大值 改为5000。
- 对
raster_water_filled图层使用相同参数重复 邻近度(栅格距离) 算法,并将输出命名为water_proximity.tif。如果你点击生成的栅格周围,会发现它是从 0 到 5000 的连续值。为了在叠加分析中使用此栅格,我们必须首先对其进行重分类以创建离散值。再次打开 栅格分析 ‣ 栅格计算器 算法。
-
我们希望给靠近道路的像素更高的分数。因此,让我们使用以下方案。
-
0-1000 米 –> 100
- 1000-2000 米 –> 50
-
2000 米 –> 10
使用 … 按钮选择
roads_proximity图层作为 输入图层。输入以下表达式,将上述条件应用于输入。保持所有其他选项为默认值,将输出图层保存为roads_reclass.tif,然后点击 运行。bash 100*("roads_proximity@1"<=1000) + 50*("roads_proximity@1">1000)*("roads_proximity@1"<=2000) + 10*("roads_proximity@1">2000)
-
重分类过程完成后,新图层
roads_reclass将被添加到图层面板。此图层只有 3 个不同的值:10、50 和 100,表示像素相对于道路距离的适宜性。再次打开 栅格分析 ‣ 栅格计算器 算法。
-
对
water_proximity图层重复重分类过程。这里的方案将是相反的,即远离水域的像素应获得更高的分数。 -
0-1000 米 –> 10
- 1000-2000 米 –> 50
-
2000 米 –> 100
使用 … 按钮选择
water_proximity图层作为 输入图层。输入以下将上述条件应用于输入的表达式。保持所有其他选项为默认值,将输出图层保存为water_reclass.tif,然后点击 运行。bash 100*("water_proximity@1">2000) + 50*("water_proximity@1">1000)*("water_proximity@1"<=2000) + 10*("water_proximity@1"<1000)
-
现在我们已经准备好进行最终的叠加分析。回想一下,我们确定适宜性的标准如下:靠近道路、远离水域且不在受保护区域内。打开 栅格分析 ‣ 栅格计算器。使用 … 按钮将
roads_reclass、water_reclass、raster_protected_regions_filled图层选择为 输入图层。使用 ε 按钮输入以下应用这些标准的表达式。保持其他参数为默认值。将输出命名为overlay.tif并点击 运行。
bash (("roads_reclass@1" + "water_reclass@1")/2) *("raster_protected_regions_filled@1" != 1 )
注意
在此示例中,我们为道路和水域邻近度赋予相等的 权重。在现实场景中,你可能会有多个具有不同重要性的准则。你可以通过在上述表达式中将栅格乘以适当的 权重 来模拟这一点。例如,如果靠近道路的重要性是远离水域的两倍,那么你可以使用表达式 ((2*"roads_reclass@1" + "water_reclass@1")/3),而不是 (("roads_reclass@1" + "water_reclass@1")/2)。
- 处理完成后,生成的栅格
overlay将被添加到图层面板中。此栅格中的像素值范围从 0 到 100,其中 0 是最不适合开发的区域,100 是最适合开发的区域。让我们将结果裁剪到 boundary 图层。打开 栅格提取 ‣ 按掩膜图层裁剪栅格 算法。
- 在 栅格提取 - 按掩膜图层裁剪栅格 对话框中,选择
overlay作为 输入图层,boundary作为 掩膜图层。
- 向下滚动找到 高级参数,选择
高压缩配置文件以应用压缩。将 已裁剪(掩膜)图层 保存为overlay_clipped.tif并点击 运行。
- 处理完成后,最终输出图层
overlay_clipped将被添加到图层面板中。点击图层面板中的 打开图层样式面板 按钮,选择单波段伪彩色渲染器。
- 将 插值 设置为
离散,并选择Spectral色带。
- 点击每种颜色旁边的默认标签值,输入适当的标签。
- 标签也将作为图例显示在
overlay_clipped图层下方。这是我们的最终地图,根据所选标准显示了选址适宜性。
如果你想提供反馈或分享学习本教程的经验,请在下方留言。(需要 GitHub 账户)

























