多标准重叠分析(QGIS3)¶
多准则加权叠加分析是根据所选区域应具有的各种属性分配区域的过程。尽管这是常见的GIS操作,但最好使用基于网格的方法在栅格空间中执行。
注解
矢量与栅格叠加
您可以使用地理处理工具(例如缓冲,溶解,差异和相交)在矢量图层上进行叠加分析。如果您想找到一个二进制 适合/不适合 的答案,并且要处理少量的图层,则此方法非常理想。
在栅格空间中工作可为您提供适合性的 排名 不仅仅是最适合的站点。它还允许您轻松组合任意数量的输入图层,并为每个条件分配不同的权重。通常,这是站点适合性的首选方法。
本教程介绍了执行站点适合性分析的典型工作流程-将源矢量数据转换为适当的栅格,对其进行重新分类并执行数学运算。
获取数据¶
我们将使用来自 OpenStreetMap (OSM) 的矢量数据层。OSM 是免费提供的基本地图数据的全球数据库。 Geofabrik <http://download.geofabrik.de/>_ 提供 OpenStreetMap 数据集的每日更新 shapefile 。
我们将在印度阿萨姆邦使用OSM数据层。下载了 Geofabrik India shapefiles 将其剪切到状态边界并打包在一个 GeoPackage 文件中。您可以从以下链接下载地理软件包的副本:
资料来源 [GEOFABRIK]
程序¶
在QGIS浏览器中浏览到下载的
assam.gpkg
文件。展开它,并将5个单独的数据层中的每一个拖到地图画布上。您会在 Layers 面板中看到boundary
,roads
,protected_regions
,water_polygons
和water_polylines
图层。
叠加分析的第一步是将每个数据层转换为栅格。一个重要的考虑因素是所有栅格的范围必须相同。我们将使用
boundary
层作为所有栅格的范围。进入 。搜索并找到 算法。双击以启动它。
在 Rasterize (vector to raster) 对话框中,选择
roads
作为 Input layer 。我们要创建一个输出栅格,其中像素值在有道路的情况下为 1 ,在没有道路的情况下为 0 。输入1
作为要刻录的固定值。输入层位于以米为单位的投影CRS中。选择Geoferenced units
作为 Output raster size units 。我们将输出栅格的分辨率设置为 15 米。将 Width/Horizontal resolution 和 Height/Vertical resolution 都选择为15
。接下来,单击 Output extent 范围旁边的 … 按钮,然后为 Use extent for 用于选择boundary
。
进一步向下滚动并单击 Assign a specific nodata value to output bands 箭头按钮。该字段现在应设置为
Not set
。这很重要,因为当光栅计算器(稍后将使用)在任何层中遇到一个无数据值的像素时,它也会将输出也设置为无数据,从而导致输出错误。将 Rasterized 输出栅格设置为raster_roads.tif
,然后单击 Run 。
处理完成后,您会在 Layers 面板中看到一个新的图层 raster_roads 。默认样式将显示道路为白色而其他道路为黑色的像素。我们也希望将其他 4 个矢量层也转换为栅格。与其一一运行光栅化算法,不如使用内置的批处理功能一次将它们全部转换。请参阅 使用处理框架进行批次处理 (QGIS3) 教程,以了解有关批处理的更多信息。右键单击
Rasterize (vector to raster)
算法,然后选择 Execute as Batch Process 。
在 Batch Processing 对话框中,单击 Input layer 列的第一行中的 … 按钮。选择
boundary
,protected_regions
,water_polygons
和water_polylines
图层,然后单击 OK 。
用与我们在道路图层中使用的相同的值填充参数。填充参数的第一行后,使用
按钮为所有图层添加相同的值。
在最后一列 Rasterized 中,点击第一行中的 … 按钮。选择
Fill with parameter values
作为 Autofill mode ,并选择Input layer
作为 Parameter to use 。点击 OK 。
浏览到计算机上的目录,并将图层命名为
raster_
。批处理界面将使用图层名称自动完成名称并填写所有行。确保选中 Load layers on completion 框,然后单击 OK 。
处理完成后,您将在 Layers 面板中加载4个新的栅格图层。您会注意到,我们有2个与水相关的图层-都代表水。我们可以将它们合并为一个单独的图层,代表该地区的水域。在处理工具箱中搜索并找到 算法。双击以启动它。
在 Expression 框中输入以下表达式。您可以在 Layers 框中单击适当的图层,以自动插入图层名称。此表达式意味着我们要对两个水栅格的第一个波段中的像素值求和。单击 Reference layer(s) 旁边的 … 按钮。选择
raster_water_polygons
作为参考层。将输出命名为raster_water_merged.tif
,然后单击 Run 。
"raster_water_polygons@1" + "raster_water_polylines@1"
对于所有用水区域,合并后的栅格将具有值为1的像素。但是您会注意到,在某些区域中同时存在水多边形和水折线。这些区域将具有值为2的像素-这是不正确的。我们可以用一个简单的表达式解决它。再次打开
算法。
输入以下表达式,该表达式将分配与表达式匹配的值1,而在不匹配的情况下分配 0 。点击参考层旁边的 … 按钮,然后选择 Reference layer(s) 和
raster_water_merged
层。将输出命名为raster_water.tif
,然后单击 Run 。
"raster_water_merged@1" > 0
生成的图层
raster_water
现在具有仅包含0和1值的像素。
现在我们有了代表道路和水像素的图层,我们可以生成邻近栅格。这些也称为欧几里得距离-输出栅格中的每个像素代表到输入栅格中最近的像素的距离。然后,可以将所得的栅格用于确定距输入一定距离内的合适区域。搜索并找到
算法。双击以启动它。
在 Proximity (Raster Distance) 对话框中,选择
raster_roads
作为 Input layer 。选择Georeferenced coordinates
作为 Distance units 。由于输入层位于以米为单位的投影 CRS 中,请输入5000
(5公里)作为 Maximum distance to be generated 。确保 Nodata value to use for the destination proximity raster 是未设置
。将输出文件命名为roads_proximity.tif
,然后单击 Run 。
注解
此过程最多需要 15 分钟才能运行。这是一种计算密集型算法,需要计算输入栅格中每个像素的距离,而我们的输入包含超过 10 亿个像素。
处理结束后,新图层
roads_proximity
将添加到 Layers 面板中。为了更好地显示它,让我们更改默认样式。单击 Layers 面板中的 Open the Layer Styling panel 按钮。将 Color gradient 下的 Max 更改为5000
。
对
raster_water
图层重复使用具有相同参数的 Proximity (Raster Distance) 算法,并将输出命名为water_proximity.tif
。
处理完成后,您可以应用与以前相似的样式以更好地可视化结果。如果单击生成的栅格,您将看到它是从0到5000的连续值。要在叠加分析中使用此栅格,我们必须首先对其进行重新分类以创建离散值。再次打开
算法。
我们想给靠近道路的像素更高的分数。因此,让我们使用以下方案。
0-1000m –> 100
1000-5000m –> 50
>5000m –> 10
输入以下表达式,将上述条件应用于输入。 单击 Reference layer(s) 旁边的 :guilabel:…` 按钮。选择
roads_proximity
层。将输出命名为roads_reclass.tif
,然后单击 Run 。100*("roads_proximity@1"<=1000) + 50*("roads_proximity@1">1000)*("roads_proximity@1"<=5000) + 10*("roads_proximity@1">5000)
重新分类过程完成后,新图层
roads_proximity
将被添加到 Layers 面板中。该层仅具有 3 个不同的值 10、50 和 100 ,这些值指示像素在距道路的距离方面的相对适用性。 再次打开 算法。
对
water_proximity
层重复重新分类过程。在这里,该方案将是相反的,其中距离水更远的像素应具有更高的分数。
0-1000m –> 10
1000 -5000m —> 50
>5000m –> 100
输入以下表达式,将上述条件应用于输入。单击 Reference layer(s) 旁边的 … 按钮,然后选择
water_proximity
层。将输出命名为water_reclass.tif
,然后单击 Run 。100*("water_proximity@1">5000) + 50*("water_proximity@1">1000)*("water_proximity@1"<=5000) + 10*("water_proximity@1"<1000)
现在,我们准备进行最终的叠加分析。回想一下,我们确定适用性的标准如下-靠近道路,远离水源且不在受保护区域中。打开
。输入适用于这些条件的以下表达式。请注意,我们将结果最后与raster_boundary@1
相乘以丢弃状态边界之外的像素值。点击 Reference layer(s) 旁边的 … 按钮,然后选择raster_boundary
层。将输出命名为overlay.tif
,然后单击 Run 。
("roads_reclass@1" + "water_reclass@1")*("raster_protected_regions@1" != 1 )*"raster_boundary@1"
注解
在此示例中,我们对道路和水域的接近度赋予相等的 权重 。在现实生活中,您可能有多个具有不同重要性的条件。您可以通过在上面的表达式中将栅格乘以适当的 权重 来模拟它。 例如,如果靠近道路的重要性是离水的距离的两倍,则可以在上面的表达式中将 roads_reclass
栅格乘以 2
。
处理完成后,生成的栅格
overlay
将被添加到 Layers 面板中。此栅格中的像素值范围是0到200-其中0是最不适合显影的区域,而200是最适合显影的区域。单击 Layers 面板中的 Open the Layer Styling panel 按钮。
选择
singleband_pseudocolor
渲染器和Spectral
色带。单击 Classify 以将色带应用于栅格。
单击每种颜色旁边的默认标签值,然后输入适当的标签。标签还将在
overlay
层下显示为图例。
栅格图层是矩形网格。我们想隐藏状态边界之外的像素。实现此目的的一种简单方法是将
Inverted Polygons
应用到矢量边界层。在 Layers 面板中向下滚动并找到boundary
层。选择Inverted Polygons
作为渲染器,并将其他选项保留为默认值。
为了显示渲染器的效果,它必须位于目录的顶部。右键单击
boundary
层,然后选择 Move to Top 。
检查图层,地图画布将更新以显示裁剪到
boundary
图层的overlay
栅格。这是最终输出,显示该州内适合开发的区域。