☰
栅格数据空间叠置分析全流程:从预处理到栅格计算器加权叠加
2026/10/4 1:20:28 网站建设 项目流程

今天想聊一个GIS课程和作业里出现频率特别高的问题:栅格数据空间叠置分析。网上经常能看到“我国地下水位栅格数据”“全国城市形态栅格数据集”这类分享帖子,很多人下载下来后不知道能拿来做什么,其实它们最常见的用途之一,就是拿来和其他数据做空间叠置分析。我教过这门课,也带过实际项目,见过太多同学拿到题目后,不管三七二十一,先双击打开ArcGIS再拖图层,结果叠加出来的结果跟实际情况对不上,或者跑完了自己都不知道结果对不对。这篇内容就把这类题目的完整解题流程拆开讲,从方案设计、数据预处理、重分类到栅格计算器加权叠加,一步不落,能直接照着自己的数据做。

1. 拿到题目先别急着拖数据:整体思路与方案设计

1.1 空间叠置分析的本质是什么

空间叠置分析听起来像是很高深的遥感或GIS算法,其实底层逻辑非常简单:把它想象成Excel里多列数据的逐行计算。每个栅格像元好比Excel中的一行,每个参与分析的栅格图层好比一列,叠置分析就是针对同一位置的像元,用特定的数学规则算出新值,从而生成一个新的结果栅格。用公式表达就是:

R_out = f(R1, R2, ..., Rn)

这里R1到Rn是参与叠加的各栅格图层,f可以是加减乘除,也可以是逻辑判断、条件分支,甚至是带权重的综合评价。比如判断“哪些地方地下水位浅且不透水面率高”,本质上就是把两个二值化栅格做一次乘法:

result = (地下水位浅) * (不透水面率高)

只有两个条件都为1的像元,结果才等于1。这样的操作在栅格计算器里几秒钟就能完成,但所有步骤的成立,必须依赖一个关键前提:所有参与运算的栅格,必须在坐标系、范围、分辨率上对齐。如果不齐,就好比两张同样大小的表格,一张按身份证号排序,一张按姓名排序,强行按行相加出来的结果没有任何意义。所以做空间叠置分析的第一课,不是学会点按钮,而是养成“先看数据底细”的习惯。

1.2 题目拆解:明确目标、因子和叠置逻辑

拿到一道叠置分析题目,不要急着动手。我习惯先花五到十分钟把题目拆成一张表:分析目标是什么;参与叠加的栅格有哪些;每个栅格在结果里起正向作用还是负向作用;最后该用交集、并集还是加权求和。

以“内涝高风险区识别”为例,拆解出来大概是这样的:

项目内容
分析目标识别内涝高风险区域
因子1地下水位栅格(埋深越小,风险越高)
因子2城市形态栅格(不透水面率越高,风险越高)
因子3地面坡度栅格(坡度越小越易积水)
叠加逻辑因子之间取交集,或加权综合评分

很多同学把“叠加”简单理解成“把图层都放在一个视图里看看”,这是不对的。叠置分析的“叠”,是逐像元做数学运算,而不是视觉上叠加。所以拆题的时候,更重要的是想清楚每个因子应该怎么化成可计算的数。比如地下水位是一个连续埋深值,不同埋深对危险的贡献不一样,那就需要先做重分类,把连续值变成等级值或二值逻辑值。城市形态栅格如果是不透水面率,同样需要先判断阈值。这步拆清楚了,后面所有操作都在为这个逻辑服务。

还有一点容易被忽视:题目里给的栅格数据范围往往比研究区大,比如全国家的城市形态栅格数据,而你只需要某个市的范围,那就必须先做“栅格数据裁剪掉面数据”。这一步不是可选项,不裁剪的话,后续计算量变大还在其次,更重要的是范围不一致会导致叠加结果出现大面积的无效像元。我见过太多次结果图边缘全是空白,根因就是这一步没做对。

1.3 工具选型:ArcGIS/QGIS/Python,思路一致

关于用什么软件做栅格叠置,每次上课都有同学问。我的回答一贯是:工具不重要,思路最重要。ArcGIS有现成的Spatial Analyst工具,QGIS有免费的处理工具集,Python有rasterio、geopandas这些开源库,甚至用R的raster/terra也能做。

工具适合场景优点缺点
ArcGIS课程作业、传统项目工具齐全,对话框操作直观;Spatial Analyst中Extract by Mask、Reclassify、Raster Calculator都有现成按钮授权成本高,界面稍重
QGIS学习、轻量项目免费开源;Raster菜单下有Clip Raster by Mask Layer、栅格计算器等部分工具隐藏略深,需要自己找插件
Python(rasterio/geopandas)批量处理、生产流程可重复性好,适合大批量数据需要写一定量的代码

不过不管用哪个工具,完整流程都是三段式:预处理让数据对齐;重分类让数据有意义;栅格运算得到最终结果。下面我就以这三段为主线,把每一步需要注意的细节讲透。

2. 预处理阶段的核心细节:坐标系、分辨率、裁剪与重采样

2.1 先查三件事:坐标系、范围、分辨率和NoData

数据预处理是栅格叠置分析里最枯燥,但也是拉开差距的部分。先说坐标系。许多公开栅格数据集默认是WGS84地理坐标系,也就是经纬度坐标,单位是度;而研究区边界shp可能是CGCS2000投影坐标系,单位是米。这两种坐标系下的栅格直接叠加,轻则位置偏移,重则整个结果图变形错位。把两个图层放到一个视图里看叠置关系,只能做初步判断,正确做法是在叠加前把所有数据统一到同一套坐标系下。通常用研究区所在的高斯-克吕格投影或UTM投影,因为面积和距离的量算更接近真实。

再查范围。两个栅格范围不一致时,即使坐标系相同,参与运算的有效范围也不同。比如一个栅格覆盖全省,另一个只覆盖市中心区,叠加结果的有效区域实际上会被限制在两者相交的部分。用边界shp做裁剪,正是为了把范围统一。第三个要查的是分辨率。常见国产栅格数据集有30米、90米、250米、1000米等不同尺度,如果直接参与运算,软件通常不会报错,但结果会按照某个默认规则重采样,而你未必知道发生了什么。

最后一个容易忽略的是NoData。NoData是栅格里的“无数据”标记,不是0。0是有数值0,NoData表示这个地方没有有效观测值。如果两个栅格中同一个位置一个有效一个NoData,做加法和乘法时,结果像元极可能也变成NoData。这一点如果在预处理阶段没有处理,最终结果会出现大量不规则的空白区域,看起来很像“分析失败”,其实只是NoData在作怪。

2.2 栅格数据裁剪掉面数据(shp)到底该用哪个工具

预处理里最高频的一步,就是用研究区边界shp把大范围栅格裁成小范围栅格。这步操作很简单,但工具选择有讲究。很多人习惯用ArcGIS Data Management工具箱里的Clip工具,它其实做的是外接矩形裁剪,如果shp是圆形的、多边形的、边界凹凸不平的,Clip出来的栅格会带有大量外围无效数据。正确做法是用Spatial Analyst工具箱里的Extract by Mask(按掩膜提取),它会严格按照面shp的形状裁剪,面外的像元设为NoData。

用QGIS的话,对应工具是“栅格提取→按掩膜图层裁剪栅格”,界面里可以选择是否将掩膜外的数据设为NoData。Python里则由rasterio包的mask函数完成类似操作,crop参数设为True即可。举个例子:

import rasterio from rasterio.mask import mask with rasterio.open("urban_form.tif") as src: out_image, out_transform = mask(src, shapes, crop=True)

需要注意的是,在勾选“将掩膜外像元设为NoData”时,裁剪结果的范围虽然是研究区形状,但边缘会出现一圈NoData。这是正常的,后面重分类时要注意把NoData保持在NoData,不能随意设成0。如果题目明确要求输出范围与shp完全一致,还要在环境设置中把栅格分析的范围指定为“与面数据的交集”。

2.3 分辨率不匹配怎么统一

分辨率不统一,是所有栅格叠置分析都会遇到的问题。最稳妥的办法,是先把所有栅格重采样到同一个像元大小。重采样工具各家都有,ArcGIS里是Resample,QGIS里是“栅格→投影→重采样”,Python用rasterio的reproject或rasterio.warp.reproject也能做。

重采样方法的选择比很多人想的重要。最邻近法(Nearest Neighbor)速度快,但会让连续数值出现锯齿状阶梯,适合土地利用分类等离散数据;双线性插值和三次卷积插值会平滑数值,适合气温、水位、坡度这类连续变量。比如地下水位从90米分辨率升到30米,用双线性插值更合理;而土地利用数据无论怎么升尺度,都应该用最邻近法,否则会出现不存在的类别像元。

统一到哪个分辨率也有讲究。如果题目没给明确要求,一般选所有数据中空间分辨率最高的那个,这样能保留更多细节;但如果做区域尺度分析,计算量是很大障碍,可以把所有数据统一到30米或100米这类常见尺度。遇到高分辨率栅格(如10米)和低分辨率栅格(如250米)叠加,想要保留高分辨率细节,又要消除低分辨率栅格的“锯齿”,可以先对低分辨率数据做双线性重采样,再用最邻近法把高分辨率数据统一到目标分辨率。这里有一个从“精度优先”角度出发的常用做法:先重采样,再裁剪,这样能让重采样过程尽量少地引入边界外的无效信息。我的个人习惯是“先重投影,再重采样,最后裁剪”,顺序尽量不要反。

3. 核心实现:重分类与栅格计算器加权叠加

3.1 为什么要重分类,怎么设置阈值

栅格原始值往往不能直接参与叠加。比如地下水位埋深2米和5米,数值上只差3,但对内涝风险的意义差别巨大。如果不分等级,直接拿原始值做加法,就会出现“埋深5米的区域+不透水率70%”和“埋深2米的区域+不透水率30%”总分相同,结果在物理意义上完全说不通。所以重分类这一步,本质是在给知识编码:把连续数值变成适合目标逻辑的评分或二值条件。

重分类的阈值确定要讲依据。常见的分类方法有等间距法、分位数法、自然间断点法(Jenks)。自然间断点法能自动寻找数据分布中差异最大的分组边界,适合在没有专业标准时做探索性分析;分位数法保证每个类别像元数量大致相等,适合做相对比较;等间距法简单直观,但受异常值影响大。更理想的是结合专业规范,比如《城市内涝防治技术规范》里可能规定地下水位埋深小于3米属于高风险区,那就直接用3米作为阈值,不需要让软件自动分段。

在ArcGIS的Reclassify工具里,选择栅格后点Classify,可以看到直方图和分类边界。有人习惯把NoData也重新赋一个值,我建议课程作业里千万不要这样做。NoData一旦变成0,叠加结果中研究区边缘会被严重“稀释”,原理上也很不严谨。最佳做法是在重分类对话框里把NoData设为NoData,让NoData在整个计算链条里持续保持NoData。

3.2 栅格计算器中加减乘除与条件函数

栅格计算器是栅格叠置分析里最灵活也最能体现解题目逻辑的地方。它支持数学运算和条件函数,比如以前面提到的内涝风险二值判断为例,公式可以写成:

Con("water_depth_reclass" == 1, Con("urban_form_reclass" == 1, 1, 0), 0)

这段公式的意思就是:当地下水位重分类结果为1(埋深浅)时,再判断城市形态重分类结果是否也是1(高不透水面率),两边都满足则输出1,否则输出0。等效更简洁的写法是:

"water_depth_reclass" * "urban_form_reclass"

因为两个重分类栅格的值都只有0和1,相乘后只有1*1=1的情况会被保留下来,这正好完成了“交集”逻辑。这里很多人会用错引号:ArcGIS栅格计算器里,图层名必须用双引号括起来,运算符号两边的空格也不能省略,否则容易出现表达式解析错误。

如果你要做的是多因子加权评分,公式长这样:

0.5 * "gw_score" + 0.3 * "urban_score" + 0.2 * "slope_score"

写公式前一定要先确认三个评分栅格的数值范围统一,比如都重分类成1到5分,而不是一个1到5、一个1到100。否则权重会被量纲吃掉,名义上0.5的权重可能实际上只贡献了极小比例。

3.3 多因子加权:栅格计算器 vs 加权叠加工具

除了手动用栅格计算器写权重公式,ArcGIS还提供了一个专门的Weighted Overlay(加权叠加)工具。它的工作方式是先把每个因子栅格重分类到一个统一尺度(通常是1到9或1到10),再在工具面板上给每个因子设置影响百分比,由软件自动加权求和。这个工具的优点是规范,逼着你先把数据准备好,也方便体现“分类打分+权重”的分析思路。

但实际运用中我更喜欢直接用栅格计算器,尤其是数据量不大、逻辑清晰的时候。原因很简单:Weighted Overlay有自己的重分类步骤,有时候会在背后把NoData处理成边界值,容易掩盖问题;而栅格计算器的每一步都透明可控。再说,手工公式更便于检查和展示,交作业或写报告时把公式贴出来,老师一眼就能看懂你的解题逻辑。

两种方式我都建议掌握。如果是课程作业,可以先用计算器跑一遍结果,再用Weighted Overlay验证;如果结果明显不一致,多半是重分类方向或者NoData处理出了问题,而不是工具本身的问题。

4. 实操全过程示例:地下水位与城市形态栅格叠加

4.1 案例背景与数据准备

现在用一个完整案例,把前面所有步骤串起来。假设题目如下:某市需要开展内涝风险初判,提供的数据有:

  • water_depth.tif:我国地下水位栅格数据,像元值为地下水位埋深,单位米,分辨率90米;
  • urban_form.tif:全国城市形态栅格数据集中的不透水面率栅格,像元值范围0到100,单位百分比,分辨率30米;
  • city_boundary.shp:研究区边界,面数据,投影为CGCS2000 / 3-degree Gauss-Kruger CM 120E。

分析目标:识别“地下水位埋深小于3米,且不透水面率大于50%”的区域,划定内涝重点防范区。这个题目的难点不在公式,而在两个栅格的分辨率不同、范围不同,且一个像元是米为单位的连续值,一个是百分比连续值,必须经过统一分辨率、裁剪、重分类才能参与叠加。

4.2 从预处理到最终结果图的六个步骤

第一步,检查数据。打开ArcCatalog或在QGIS图层面板查看water_depth.tif和urban_form.tif的属性,记录坐标系、分辨率、范围和NoData值。这个案例中,两个栅格很可能一个是地理坐标系,另一个是投影坐标系,或者分辨率不同。我会先把water_depth.tif投影到与city_boundary.shp一致的CGCS2000高斯-克吕格投影,确保后面叠加时像元位置不会错位。

第二步,重采样。目标分辨率选30米,因为城市形态栅格已经是30米,地下水位是90米,选择最高分辨率能保留更多细节。对地下水位这种连续变量,用双线性插值重采样;对不透水面率栅格,如果不涉及类别变化,也可以保持30米不动,或同样用双线性插值。如果你用的是ArcGIS环境,可以在环境设置里把栅格分析中的“像元大小”设为30米,后续工具会自动对齐。

第三步,裁剪。用city_boundary.shp作为掩膜,分别对两个栅格执行Extract by Mask。这里我会创建一个独立文件夹存中间结果,例如clip_water_depth.tif、clip_urban_form.tif,避免覆盖原始数据。

第四步,重分类。在ArcGIS中打开Reclassify:

  • 对clip_water_depth,将埋深小于3米的值设为1,其余设为0。ArcGIS里操作是点击Classify,在Break Values里手动输入3,然后给0到3区间赋新值1,3以上区间赋新值0。
  • 对clip_urban_form,将大于50的值设为1,其余设为0。

两个栅格重分类时都要把NoData保留为NoData。如果你使用的是QGIS,SAGA或GRASS插件里有Reclassify by table,也可以用Raster Calculator直接写:

water_depth_reclass = ifelse(water_depth < 3, 1, 0)

第五步,栅格计算器求交集。公式:

"clip_water_depth_reclass" * "clip_urban_form_reclass"

结果栅格中值为1的像元,就是同时满足“埋深浅”和“高不透水面率”的区域,即所需的内涝重点防范区。

第六步,制图和统计。用分级色带给结果上色后,再用Zonal Histogram或Raster to Polygon转面后按行政区统计面积,就能得到各区域重点防范面积。这里要记得在结果属性里查看像元数量,乘以单个像元面积(30米×30米=900平方米),得到总面积,这一步在很多作业里是得分点。

4.3 从布尔叠加扩展到加权指数评价

如果题目要求的不只是“是否属于高风险区”,而是给出一个0到100的风险指数,那就需要把二值逻辑升级为加权评分。通常我会把所有因子统一重分类到1到5分的风险等级:分数越高代表风险越高。例如地下水位埋深小于1米给5分,1到3米给4分,3到5米给3分,5到10米给2分,大于10米给1分;不透水面率和坡度也按相同方向分成5个等级。

然后根据题目或查阅文献给出权重。比如地下水位占0.4,不透水面率占0.3,坡度占0.3,公式为:

0.4 * "gw_score" + 0.3 * "urban_score" + 0.3 * "slope_score"

得到连续指数后,再用自然间断点法或分位数法分成低风险、中风险、高风险三个等级。这里的权重不能拍脑袋,最好能在报告里写清楚为什么地下水位权重大于坡度,比如“研究区地势相对平坦,排水能力更多受地下水位和地表硬化率影响”,这种解释在答辩和报告中非常加分。

5. 常见问题速查与避坑指南

5.1 叠加结果错位,先查坐标系

如果你做完栅格计算器后,发现结果图上的道路、河流和底图明显错开,第一反应一定是坐标系不统一,而不是工具出了问题。很多公开栅格数据集是WGS84经纬度坐标,而shp是投影坐标,叠加时视觉上可能只是轻微偏移,但如果切换到投影环境,偏移会被放大。解决办法也很简单:统一投影。在ArcGIS中右键图层属性查看坐标系,再用Project Raster工具统一;在QGIS中则是“栅格→投影→栅格重投影”。

5.2 结果大片空白或范围不完整,查NoData和裁剪方式

最常见的一类问题是结果图中间一大块是空白,或者边缘被“吃掉”。原因有两种:一是参与计算的两个栅格中存在NoData,乘法和加法会把NoData传递到结果中;二是裁剪时用了Clip矩形裁剪,导致研究区外有大量NoData,或研究区内部因为数据本身的空洞出现NoData。对第一种情况,可以用以下公式先把NoData填充为合理值,或至少明确处理方式:

Con(IsNull("clip_water_depth_reclass"), 0, "clip_water_depth_reclass")

对第二种情况,检查你是否用了Extract by Mask而不是Clip,如果是,把环境设置中的“Snap Raster”设为研究区边界栅格,确保输出范围和掩膜一致。另外提醒一句,不要在重分类时把NoData设成0,除非你能合理地解释为什么研究区内的NoData区域风险为0,一般情况下解释不了。

5.3 重分类阈值太随意,结果没有说服力

有的同学为了图省事,直接在Reclassify的Classify里选了一个“等间距”就生成结果,最后画出来的图看起来“差不多”,但被老师一问为什么用3米作为阈值,就答不上来了。我的建议是:阈值必须来自规范、文献或数据分布特征。比如地下水位埋深的分级,可以查阅当地水文地质资料;如果查不到,就选自然间断点法,并说清楚“根据数据分布特点,使用Jenks自然间断点法把埋深划分为两类”。好的分析不一定多复杂,但每一步都必须有可回溯的依据。

5.4 作业和项目中容易忽略的几个好习惯

做完一道题,把中间文件命名为clip_water_depth、reclass_water_depth、result_risk,而不是新建栅格_1、最终版最终2。这个习惯能让你在复查时省下大量时间。

第二个习惯是留着模型或脚本。在ArcGIS里可以用ModelBuilder把整个流程拖成模型,在QGIS里可以用Processing历史记录查看每次操作,在Python里写好脚本就更方便了。这样以后换数据、换阈值,只需要改参数重跑一遍,不用重新点几十次按钮。

第三个习惯是验证结果。用Identify工具在结果图上点几个像元,手动核对原始栅格值是否满足条件;把结果转成矢量后,按行政区统计面积,再和实际经验对一下数字。这一步看着不起眼,但能帮你发现坐标系错位、NoData处理不当等一系列隐蔽问题。我自己做实际项目时,永远是“先验证一个小范围,再跑全图”,而不是一口气把整张图算完再检查,那时候回头改就晚了。

最后再分享一个我批作业时特别看重的小细节:做完栅格叠置分析后,在你提交的地图或报告里,把每一步的图层名、重分类阈值、权重依据写干净。栅格空间叠置分析这个题目,考点从来不在你会不会点那几个工具按钮,而在于你有没有把每一步为什么这么做讲清楚。你拿本地的数据按这个流程跑一遍,很快就能发现,真正让你觉得“会了”的并不是某个按钮,而是你开始理解每一次像元运算背后的地理意义。今天就先聊到这里,如果你最近正在做这类叠置分析题,不妨把遇到的问题在评论区说出来,大家一起踩坑一起填。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询