ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ArcMap栅格空间分析实战:从数据预处理到统计导出全流程

ArcMap栅格空间分析实战:从数据预处理到统计导出全流程 1. 栅格数据组织形式与属性表机制1.1 栅格数据在ArcMap里的三种组织方式做栅格空间分析之前先把数据在软件里的组织方式搞清楚后面所有操作才不至于蒙圈。ArcMap里栅格数据常见有三种形态单波段栅格、多波段栅格和栅格数据集镶嵌数据集。单波段栅格最常见比如DEM、坡度图、单个时期的土地利用分类图每个像元只有一个值。多波段栅格像遥感影像一个像元对应多个波段值比如标准假彩色合成的影像一般至少三个波段。栅格数据集则是把多景影像统一管理在一个存储结构里常用于大范围影像管理。这三种形态在你打开图层属性、查看符号化和做分析时操作逻辑完全不同。判断当前栅格是几波段有个很直接的办法打开图层属性切到“符号系统”选项卡看波段组合那里能选几个波段。如果你看到的波段只有“波段1”那基本就是单波段栅格如果能选红绿蓝多个波段就是多波段。识别错了后面做“栅格转Excel”或区域统计时选字段都会找错地方。属性表这块也值得单独说。单波段整数型栅格比如土地利用类型编码通常带属性表里面一条记录代表一个像元值Value字段以及这个像元值对应的面积、数量等多列信息。DEM这类浮点型栅格一般没有属性表因为像元值几乎不重复建了属性表也没有意义。所以在ArcMap里看到某个栅格图层“打开属性表”是灰色的别慌那是数据类型决定的不是数据坏了。1.2 像元深度对分析结果的影响像元深度位深决定了一个栅格能存多少不同的值直接影响你能不能做特定分析。常见的位深有8位、16位、32位浮点。8位栅格最多存256种值适合土地利用分类、土壤类型16位栅格适合DEM高程这种范围较大的整数32位浮点适合气象插值、NDVI这种需要小数的连续型数据。导出或重分类之前先看一眼数据的位深能避免很多“结果不对”的乌龙。比如你把浮点型的NDVI做重分类如果不先转成整型很多工具直接报错“输入值为非整数”。在ArcMap里看位深右键图层 → 属性 → 源选项卡里面会列出像素深度。你如果有重分类的需求可以直接用“转为整型”工具Int转换转换之后才能正常使用重分类或区域统计。注意把浮点栅格转整型会丢失小数部分精度NDVI这类指标如果转换后想用于论文统计建议先做好备份转之前想清楚是否需要保留原始精度。1.3 坐标系问题——分析前必须解决的第一道坎做完上述检查后第二个容易踩坑的是坐标系。很多初学者拿到栅格数据时根本不确认坐标系是否统一就开始做重采样和分析结果后面所有叠加、统计都是错的。这里要区分两种坐标系地理坐标系GCS单位是度和投影坐标系PCS单位是米。栅格空间分析里凡是涉及到面积计算、距离计算的都必须使用投影坐标系。如果你拿到的DEM还是WGS84地理坐标直接做坡度分析、面积统计结果不但难看而且根本没法引用。正确做法是先投影到适合所在区域的投影坐标系比如国内常看到的UTM分带或Albers等积投影。投影操作在ArcToolbox里数据管理工具 → 投影和变换 → 栅格 → 投影栅格。注意投影栅格时有“重采样技术”选项默认是双线性如果你是分类数据土地利用建议选最近邻如果是连续数据高程、NDVI双线性更好。这个细节直接决定重采样后数据属性是否失真。检验坐标系是否统一的快捷方法把所有待分析栅格加入ArcMap在内容列表中右键图层属性切到“源”选项卡逐个看坐标系或者直接在图层列表里缩放到全图看两个栅格的边界是否贴合。如果发现坐标系不一致第一时间用投影栅格工具统一坐标系再进入正式分析。2. 常用栅格空间分析工具的选型与原理2.1 区域统计Zonal Statistics到底在算什么做栅格空间分析区域统计Zonal Statistics as Table是出场率最高的工具。它的作用是给一个栅格数据值栅格和一个区域矢量或栅格区域栅格系统在每一个区域范围内对值栅格做统计输出一个表格。简单理解就是“按区域汇总统计值”。举个例子你有全国土地利用类型栅格还有一张省界矢量图你想知道每个省里各土地利用类型各占多少面积这就是典型的分区统计场景。工具输出的表格里有每个省的代码、各类像元数量、最大值、最小值、平均值、标准差等字段。注意ArcMap里有两个相似工具“区域统计”Zonal Statistics和“区域统计为表”Zonal Statistics as Table。区别在于前者输出栅格便于渲染展示后者输出表格便于做定量分析和图表导出。如果你想做统计分析、画图表、出报告直接用后者。参数设置有几个容易出问题的地方区域栅格或矢量必须是整数型如果区域栅格是浮点型工具直接报错“区域输入必须是整数栅格”“统计类型”根据需求选多数情况下选“平均值”或“总和”。“总和”配合像元大小换算面积更直观“忽略NoData”勾选与否很重要如果值栅格里有大量NoData忽略了和忽略不忽略结果差异非常大实际工作中我发现很多人直接用默认设置跑区域统计结果表格出来一堆字段看不懂。建议跑之前先搞清楚你到底想要什么想要单位面积的平均值还是每个区域内的总量这决定了你是选择求平均值还是求和。2.2 重分类栅格数据预处理的核心操作重分类是栅格分析中最常用的预处理手段。它的作用是把栅格像元值按规则重新赋值比如把坡度分成四个等级或者把高程分成十个区间。在ArcMap里就是“Spatial Analyst 工具 → 重分类 → 重分类”。为什么需要重分类因为很多分析模型不接受连续值。比如做生态敏感性评价坡度、高程这些连续数据必须重分类成1到5的等级分才能和其他图层叠加计算。另一个场景是符号化展示原始DEM的值太多重分类成几个区间后图面更清晰也更容易做专题图。使用重分类时有几个极易踩坑的地方第一重分类前看数据是否为整型。浮点型栅格做重分类时“重分类”对话框默认是按“数据值”逐条列出的你直接改新值即可。但如果报错说“输入必须为整型栅格”你就得先转为整型。第二设置重分类时注意新旧值的对应关系。对话框上端有“旧值”和“新值”两列你要手动把每个旧值区间对应的新值填上。默认所有值都被设定为NoData你必须逐条修改。很多人跑完结果一片黑就是这里没改好。第三重分类区间的划分方式要根据实际数据分布来定。默认等间距分组往往不是最佳方案。比如坡度数据一般集中在0到15度你用等间距分了五级可能第一级全是有坡区域最后两级几乎没有像元。建议先通过栅格图层属性里的直方图看数据分布再手动调整断点值。2.3 栅格计算器批量运算和条件分析的万能钥匙栅格计算器Raster Calculator是栅格分析里最灵活的工具适合各种复杂运算。比如计算NDVI、提取符合特定条件的像元、多图层叠加权重求和都可以在里面写表达式完成。使用栅格计算器的正确姿势是先打开Spatial Analyst模块的“地图代数”工具箱再找到栅格计算器。在表达式框里你可以在左侧图层列表里双击选择栅格也可以通过右侧工具列表插入运算函数。然后点“确定”执行结果栅格会自动添加到内容列表里。初学者最容易犯的错误是直接在表达式里输入中文或包含空格的图层名称导致计算报错。正确做法是把图层重命名为英文字母和下划线的组合再写表达式。另外栅格计算器里布尔运算符要和条件函数结合使用比如提取坡度大于25度的区域表达式是Con(slope 25, 1, 0)。很多人直接写“slope 25”结果是布尔矩阵也行但不如Con函数灵活不能自定义输出值。此外多图层叠加时要注意坐标系和像元大小必须一致。如果不一致栅格计算器运算出的结果范围会错位甚至直接报错“No spatial reference exists”。建议执行任何多图层叠加计算前先用“重采样”或“像元大小”工具把所有输入栅格统一到相同像元大小和坐标系。这个小习惯能节省大量的调试时间。2.4 像元统计与邻域分析做局部空间特征必用的工具除了区域统计像元统计Cell Statistics和邻域统计Focal Statistics也是经常使用的栅格分析手段。前者是对多个栅格的同一位置像元做逐像元统计常用于多期数据求平均、求最大最小值后者是统计每个像元周边一定范围内的特征常用于平滑、热点识别。你可能遇到这样的需求手里有10年年累计降水量栅格需要求一个十年平均降水分布图。这时用像元统计最合适简单说就是“同行同列求平均”。操作路径为Spatial Analyst工具 → 叠加分析 → 像元统计。输入多个栅格选择统计类型为“平均值”直接得到结果。邻域统计则适用于搞分辨率增强、滤波降噪或者在任意像元周围划定圆形或矩形邻域计算局部最大值、方差。最常见的应用场景是土地利用格局中的景观指标计算比如计算某一像元周围500米范围内建设用地占比。这时用邻域统计里的“平均值”再乘个100就能得到占比。核心参数是邻域形状和大小矩形Rectangle、圆形Circle、环形Annulus选什么形状取决于你的研究目的和空间尺度。3. 实操复盘从栅格分析到Excel导出的完整流程3.1 分析前的数据准备与检查清单以半开玩笑的方式说栅格数据处理中80%的问题都是数据“脏”导致的。进入实操流程的第一步永远不是直接开工具而是按顺序核对几项内容第一步检查栅格数据的坐标系和像元大小。打开属性 → 源看行列数和像元大小。如果多个栅格要一起分析确保像元大小、范围完全一致。不一致的先用重采样统一。第二步检查NoData范围。用栅格图层的符号系统看看NoData区域在哪里。如果NoData范围太大、位置关键分析结果肯定会出问题。必要时用“填挖”工具或插值方法补齐。第三步统一数据范围为同一分析区域。如果只有目标区域边界矢量可以用“提取按掩膜提取”工具把栅格裁剪到范围内避免统计到范围外冗余像元。举个例子。假设现在要做的是“某县坡度分级与土地利用类型的相关性统计”。数据清单包括该县的DEM30米分辨率、土地利用分类栅格30米分辨率、县域边界矢量。操作顺序是投影统一 → 按掩膜裁剪 → 坡度计算 → 坡度重分类 → 区域统计为表 → 导出Excel。这一步的关键在于DEM和土地利用栅格必须对齐。如果土地利用栅格分辨率是30米DEM是30米但几何位置有偏移统计出来的交叉表就没法用。强制对齐的方法是数据管理工具 → 栅格 → 重采样或者直接用“栅格代数”里的“重采样”统一像元大小与范围。3.2 核心环节一DEM坡度提取与重分类以DEM为例做坡度分析的核心目的往往不是看坡度本身而是为后续的区域统计提供分区依据。在ArcMap里提取坡度的路径Spatial Analyst 工具 → 表面分析 → 坡度。这个工具有三个参数值得注意输入栅格、输出测量单位度或百分比、Z因子。Z因子常常被忽略但它特别重要当DEM是经纬度坐标单位是度时高程单位是米这时X、Y单位和高程单位不一致必须设置Z因子为111320左右一米相当于多少度坡度结果才准确。如果你已经把DEM投影到米制坐标系那么Z因子保持1即可。我见过很多人拿着经纬度坐标的DEM直接算坡度结果坡度全在0.0000几徘徊就是这个原因。坡度栅格生成后接下来是重分类。我这里把坡度分成5级0-5度5-15度15-25度25-35度大于35度。重分类时在“重分类”对话窗里把每个区间对应到新值1、2、3、4、5。断点怎么确定不要拍脑袋先用属性源里的直方图看坡度分布再结合规划标准或文献确定分级阈值。如果你想以后在Excel里做统计把新值设置成整数并保证NoData为新值0。3.3 核心环节二分区统计与属性表导出Excel分区统计是整个流程里最容易卡住的一步值得多花笔墨把参数理清楚。跑“Spatial Analyst 工具 → 分区分析 → 区域统计为表”命令弹出对话框需要设置三个输入输入区域数据可以是矢量面比如县界也可以是整型栅格比如土地利用分类或重分类后的坡度分级。如果用矢量面注意矢量面坐标系必须和值栅格一致区域字段矢量面里用来分区的字段比如县名或编码栅格的话用Value字段输入值栅格要被统计的连续栅格比如高程、NDVI、降水量输出表格会生成一个dbf表文件包含每个区域的名称、像元数量COUNT、统计值等字段。注意这个dbf表并不是Excel格式需要通过“表选项”导出。导出方法有两种比较好用。第一种是直接在ArcMap中打开属性表点左上角“表选项”按钮选“导出”在保存类型中选dBase Table或地理数据库表再通过Excel打开。第二种更快直接用“转换工具 → Excel → 表转Excel”工具一步到位直接生成xls格式。注意ArcMap的“表转Excel”工具要求电脑上装有对应版本的Excel才能正常写入如果不想依赖Excel就导出为CSV逗号分隔直接右键图层→数据→导出为CSV再用Excel打开中文乱码的可能性也小。如果硬核一点也可以考虑用ArcPy脚本把表格转成DataFrame然后to_excel输出xlsx。脚本不复杂就把ArcToolbox的操作自动化包装成代码适合那种每天都要重复导出一遍的批量流程场景。3.4 核心环节三土地利用交叉统计与Excel视角修正很多时候你要的不是单一栅格的分区统计而是两个栅格之间的交叉分析。比如“坡度等级与土地利用类型的面积交叉表”这是空间分析里经常需要的结果。最简单粗暴的方法是先把两个栅格都重分类为整型然后通过“组合”工具Combine让两个栅格逐像元两两组合输出一张组合表。实际操作路径Spatial Analyst 工具 → 数学 → 逻辑运算 → 组合输入两个栅格输出表里每个像元记录两个输入栅格各自的值。然后把这张表导出Excel在Excel里再用透视表做交叉汇总。这里手动操作量大用Excel数据透视表反而效率高。先把组合表用“表转Excel”工具导出然后用Excel里的插入透视表把坡度分级字段拖到行区域把土地利用字段拖到列区域把计数拖到值区域几秒钟就能出交叉表。透视表做完后再乘以单个像元面积就得到对应的面积矩阵。3.5 导出Excel后的字段含义对照与数据整理从ArcMap导出的表格里字段往往是英文的比如VALUE、COUNT、AREA。新手拿到手容易懵这里把常见字段含义理一下VALUE栅格重分类后的编码值对应你重分类时设置的新值COUNT该分区里每个像元值出现的次数AREA面积注意这个面积是根据投影坐标系的单位自动算出来的如果是米制投影就是平方米MIN / MAX / MEAN / STD分区内值栅格的最小值、最大值、平均值、标准差导出Excel后还要做几个收尾动作第一检查NoData值是否混入统计结果。分区统计表里通常没有NoData但重分类时如果把NoData设成了0那你统计的时候就要特别过滤一下。第二检查面积单位是否与预期一致米制投影下算出来是平方米如果要换算成公顷或者平方公里在Excel里除以10000或1000000即可。第三把英文表头重命名为中文加上备注列方便报告直接引用。其实很多人忽视的一个操作是导出之前先把表格的关联字段和排序顺序理好。比如区域字段建议用数字编码避免中文地名乱码。表格导出后如果发现有字段是空的先回ArcMap确认一下是不是分区范围太小、区域内没有值栅格像元导致的这种情况不算错误但要在Excel里单独标记免得后面统计时当成0处理。4. 高频报错梳理与排查思路实录4.1 “输入栅格必须是整型栅格”到底怎么破这个报错出现的频率极高。几乎所以基于分类统计的栅格分析工具比如区域统计、重分类、组合都要求输入为整型栅格。解决办法有两个一是用“转为整型”工具直接转换二是先查看原始数据是不是浮点类型。排查思路是先判断数据该不该转整型。如果原始数据本身就是分类编码比如土地利用类型1、2、3那这个数据应该是整型如果显示为浮点多半是之前做过某些运算导致变浮点了直接转回去影响不大。但如果是NDVI、温度这类连续数据把它转成整型会损失精度。这时不要盲目转而是考虑换一种分析方案比如保留原始值做区域统计。还要注意一点用“转为整型”工具时会默认四舍五入到最近整数。如果转完之后某些像元值出现0或负值要检查原始数据是否包含负值或小于1的小数必要时先在栅格计算器里加一个偏移量再转。4.2 区域统计表里出现大片0值或NoData的排除方法区域统计表跑完后看到某个区域对应的统计结果为0或NoData先别急着怀疑数据按以下步骤排查第一步打开值栅格图层用“识别”工具查看该区域内对应的值是不是真的全部为NoData。如果全部为NoData说明值栅格和区域在空间位置上没有重叠多半是坐标系不一致。第二步检查区域边界是否覆盖到了值栅格范围之外。用“按掩膜提取”或“重采样”将值栅格范围调整到区域范围内。第三步检查区域字段选择是否正确。比如你用县界矢量做区域数据但“区域字段”选错了不是唯一的字段统计结果就会按错误的类别分组。第四步检查NoData处理设置。区域统计工具默认忽略NoData但如果值栅格内部有大片NoData统计结果会表现为计数很小平均值却偏差很大。建议先对值栅格做插值填空或剔除保证源数据干净。4.3 导出Excel后中文乱码与字段错位的应对ArcMap导出的dbf表自带的编码是dBASE格式Excel直接打开容易出现中文乱码。遇到乱码后我一般用两种方式处理第一种是在ArcMap里用“表转Excel”工具输出xls格式乱码概率低第二种是导出为CSV时用UTF-8编码但CSV用Excel打开又会遇到UTF-8中文乱码这时可以把文件扩展名改为csv后用Excel的“数据 → 从文本/CSV”导入并在导入时选择UTF-8编码。字段错位通常是因为表格里存在特殊符号或较长数据导出的CSV文件自动用逗号分组但字段内容里如果也有逗号就会错位。建议导出之前先把字段名统一为纯英文、不含空格再把内容里的特殊字符清洗掉这样导出的表格基本不会错位。提示如果表格数据量大几万行以上不要直接在Excel里手动筛选排序建议先建数据透视表不然每次操作都会卡到怀疑人生。几十万行的组合统计表在Excel里处理可以把Excel逼死这种时候就该上Access或Python的pandas了。4.4 像元大小不一致导致的面积统计偏差一次真实的项目中我拿到两个不同来源的栅格一个是30米分辨率DEM一个是10米分辨率土地利用数据。做交叉统计前没有统一分辨率直接用组合工具跑。结果面积统计比真实值偏大了将近三倍原因就是组合工具会以分辨率更细的栅格为基准进行重采样导致最终像元大小混乱。解决方式很简单先做重采样把10米土地利用数据重采样成30米或把DEM重采样成10米。重采样时注意方法选择分类数据用“最近邻”连续数据用“双线性”。做完之后再跑组合或区域统计面积就稳定了。这个坑大多数教程不会写。原因是很多人做分析时根本没意识到分辨率差异对最终统计的影响。所以我把这个放在最后重点强调每一次做多源栅格分析前先把所有栅格的像元大小、范围、坐标系统一到一致的基准再开始后续操作。5. 关于这套流程的几点个人体会这套栅格分析流程里真正做到后面你会发现ArcMap里每个工具其实都不是独立存在的。无论是区域统计、重分类还是栅格计算器它们组合起来才能解决一个完整的分析问题。单学工具没有意义意义在于怎么把多个工具串成一个完整的工作流。我用这套流程做过土地利用变化分析、生态敏感性评价、作物种植适宜性评价模板基本一致只是输入栅格和统计目标不同。另一个体会是Excel导出永远不是最后一步。导出后的数据清洗、字段解释、单位换算、图表制作才是真正花费时间的地方。建议在导出之前就规划好最终的Excel报表样式把需要的字段提前整理好减少来回修改的工作量。最后说个小技巧ArcMap里跑完一个完整的分析流程后可以把整个工具链保存为“模型”ModelBuilder或者用Python窗口录制成脚本下次换数据直接跑。对于需要频繁重复的流通分析这个做法至少能节省一半以上的时间。我自己的习惯是每次做完项目都会顺手把工具链整理成工具箱下次遇到类似需求直接调出来复用非常省心。
返回列表