ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

栅格数据空间叠置分析全流程:从预处理到栅格计算器加权叠加

2026/10/4 1:20:35 拓冰建站 浏览量
栅格数据空间叠置分析全流程:从预处理到栅格计算器加权叠加 今天想聊一个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是有数值0NoData表示这个地方没有有效观测值。如果两个栅格中同一个位置一个有效一个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, cropTrue)需要注意的是在勾选“将掩膜外像元设为NoData”时裁剪结果的范围虽然是研究区形状但边缘会出现一圈NoData。这是正常的后面重分类时要注意把NoData保持在NoData不能随意设成0。如果题目明确要求输出范围与shp完全一致还要在环境设置中把栅格分析的范围指定为“与面数据的交集”。2.3 分辨率不匹配怎么统一分辨率不统一是所有栅格叠置分析都会遇到的问题。最稳妥的办法是先把所有栅格重采样到同一个像元大小。重采样工具各家都有ArcGIS里是ResampleQGIS里是“栅格→投影→重采样”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*11的情况会被保留下来这正好完成了“交集”逻辑。这里很多人会用错引号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区间赋新值13以上区间赋新值0。对clip_urban_form将大于50的值设为1其余设为0。两个栅格重分类时都要把NoData保留为NoData。如果你使用的是QGISSAGA或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处理不当等一系列隐蔽问题。我自己做实际项目时永远是“先验证一个小范围再跑全图”而不是一口气把整张图算完再检查那时候回头改就晚了。最后再分享一个我批作业时特别看重的小细节做完栅格叠置分析后在你提交的地图或报告里把每一步的图层名、重分类阈值、权重依据写干净。栅格空间叠置分析这个题目考点从来不在你会不会点那几个工具按钮而在于你有没有把每一步为什么这么做讲清楚。你拿本地的数据按这个流程跑一遍很快就能发现真正让你觉得“会了”的并不是某个按钮而是你开始理解每一次像元运算背后的地理意义。今天就先聊到这里如果你最近正在做这类叠置分析题不妨把遇到的问题在评论区说出来大家一起踩坑一起填。