ARTICLE DETAIL

资讯详情

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

ArcMap栅格数据组织形式与导出Excel实操详解

ArcMap栅格数据组织形式与导出Excel实操详解 栅格数据的空间分析系列写到第四篇前面三篇把栅格怎么配色显示、怎么算坡度坡向、怎么做地图代数和重分类都过了一遍。按原计划第四篇应该直接讲水文分析与流域提取但最近留言区风向变了——好多人在问两个看着基础、实际很要命的问题栅格数据的组织形式到底有哪几种选错了会不会影响结果另一个就是怎么把arcmap里的栅格数据转化导出为excel拿去做统计分析或者跟同事对接交付。这两个问题其实是一条线上的你只有把栅格数据的组织形式理解到位做导出的时候才知道该踩住哪些关键点。这篇就把“组织形式”和“Excel导出”串起来聊透适合已经会用ArcMap做基础分析、但还没系统整理过栅格数据“出口”流程的读者。1. 栅格数据的组织形式先摸清你的数据是哪种“性格”1.1 主流栅格格式及其底层差异很多人在ArcMap里双击一个图层就开始干活根本不管背后的文件是什么格式。我刚入行那年也这样直到有一次拿到一个6G多的DEM叠加、切片、重分类每一步都卡到让人怀疑人生后来才发现那是一张无金字塔、无压缩的裸TIFF。所以说动手分析之前花几分钟把栅格数据的组织形式盘清楚后面能省下成倍的时间。我把栅格数据的“组织形式”拆成两层来看存储格式层ESRI Grid、TIFF/GeoTIFF、IMG、NetCDF、CRF、JPEG2000等决定数据以什么文件结构躺在磁盘上。内部组织层波段数量、像元深度bit depth、金字塔、分块tiling、压缩方式以及NoData的标注方式这些细节直接影响后续每一次读取和处理的速度与正确性。主流格式之间的差异挺大我整理了一张自用对比表格式存储组织核心特点典型场景ESRI Grid文件夹形式含info目录、hdr/adf等ArcGIS原生浮点Grid属性表不完整整数Grid自带VAT本地长期分析、成果管理TIFF/GeoTIFF单文件可外挂tfw/ovr/aux通用性强支持各种压缩与内嵌金字塔数据交换、跨软件QGIS/ENVIIMGHFAERDAS Imagine格式遥感生态常用支持金字塔和压缩遥感影像处理NetCDF/HDF多维数组结构自带维度、变量、属性适合时空科学数据气象、海洋、气候模式CRF云栅格分块存储ArcGIS Pro大数据分析格式支持并行读写大规模栅格分析、分布式存储JPEG2000/MRF压缩分块按需读取体积小、Web发布友好有损/无损可选影像服务发布这里我想单独说下ESRI Grid。很多人以为Grid是一个文件其实它是一个文件夹里面放着hdr、adf等一堆文件还有公共的info目录。这种组织方式的优点是ArcGIS读写它几乎不需要额外处理速度稳定缺点是文件散、拷贝容易漏。TIFF则刚好反过来一个文件走天下但同样大小的数据如果没做LZW或Deflate无损压缩体积会大得离谱。IMG在ERDAS生态里很顺跨到ArcGIS也基本兼容。NetCDF这类科学格式则胜在能塞进多维数组适合温度、降水这种随时间变化的栅格序列。1.2 内部组织细节是如何影响空间分析的格式选完了真正决定分析“顺不顺”的是内部那一层。我踩过的坑基本都集中在这里第一像元深度。8位无符号整数最大只能存25516位整数最大65535浮点型才能存小数。坡度坡向计算出来的是浮点结果你要是为了省空间硬转成8位整型斜率信息直接丢光后面算汇流量全是台阶状。反过来你把分类结果如土地利用类型存成浮点白白占空间不说整数栅格自带的属性表功能也没了。第二NoData的标注方式。NoData不是某个具体的数值而是数据里“没有值”的标记。TIFF通常把这个标记写在文件标签里但数据拷贝、格式转换过程中标签一旦丢失NoData就会变成真实像元参与统计分析。最经典的案例是SRTM等高程数据把海平面以下区域记为-32768如果你没显式定义NoData导出Excel求均值时会出现一个让人完全没法解释的负值。第三金字塔与分块。金字塔是预先生成的低分辨率概览作用是加快显示缩放分块是把大栅格切成256×256等大小的块读取时只加载视野涉及的块。这两样不影响最终计算结果但影响操作体验。一张没有金字塔、没有分块的大TIFF每次全图渲染都等于从头硬读卡是必然的。ArcMap里可以右键图层属性查看是否已构建金字塔通常第一次加载时它会提示你是否构建。第四压缩方式。无损压缩LZW、Deflate不影响像元值适合分析数据有损压缩JPEG系会改变像元值做定量分析绝对不能碰。你要是手里只有一张JPEG压缩的影像用来做显示底图没问题但别拿它做NDVI或者地表温度反演。所以我的选型建议很简单本地长期分析、要保留属性表优先用ESRI Grid需要跨软件交换、要给别人发文件用GeoTIFF并顺手构建好金字塔、选LZW压缩大数据量、要在ArcGIS Pro里做分布式分析直接转CRF。把这一层理顺后面导出Excel遇到的各种幺蛾子至少能少一半。2. 导出之前想清楚栅格转Excel的三条主流路线2.1 什么样的场景真的需要把栅格转成表格很多人一听“栅格导出Excel”就想到把每个像元值拉出来其实这个需求远不止“逐像元导出”这一种。我的经验里最常见的其实是下面四类采样点取值你在DEM上布了一批采样点想提取每个点的高程、坡度、坡向然后丢进SPSS或R里做回归分析。这种场景要的是“点属性”不是全部像元。逐像元导表把整个栅格每个像元的值加坐标拉出来拿去做模型训练或者外部统计软件复算。分区汇总按行政区、流域或缓冲区分区统计栅格的均值、总和、标准差输出一张汇总表交给业务部门。多栅格联合取数同一个点位上同时采样DEM、降雨、温度等多个栅格拼成一张宽表做环境变量建模。这四类场景对应的技术路线完全不同。如果你不问清楚“我要的是哪种表格”就直接拖工具大概率导出来的结果不是同事要的回头还得返工。2.2 三条路线的对比与选型针对上述场景ArcGIS里真正的“栅格转Excel”路线主要有三条外加一个变体路线核心工具输出形态适用场景许可证要求采样法Sample / Extract Multi Values to Points采样点上的栅格值表点对值、多栅格联合取数需要Spatial Analyst转点法Raster to Point 属性表导出每个像元一条记录逐像元导出、小范围栅格转换工具基础许可即可脚本法ArcPy pandas / Table To Excel任意形态表格批量、自动化、大表格取决于所用工具函数分区统计变体Zonal Statistics as Table每分区一条汇总记录行政区/流域汇总统计需要Spatial Analyst选型逻辑很简单要特定位置的值就采样要全图逐像元就转点或用脚本要按区域交结果分区统计表才是正解千万别把几百万个像元交给Excel再自己透视那是行为艺术。明确了出口形态我们再看具体操作。3. ArcMap实操三种导出方式的完整流程3.1 路线一Sample采样工具最推荐首选先给结论只要你要的是“点位置上的栅格值”Sample工具是效率最高、最稳的一条路。它的原理是读取每个采样点所在像元的值输出一张标准表格不需要先生成成百上千万个中间点。完整步骤是这样准备点要素。可以是GPS采集的点、随机生成的点也可以是矢量面转成的质心点格式shapefile或要素类都行。打开ArcToolbox依次找到“Spatial Analyst Tools → 提取分析 → 采样Sample”。参数设置输入点要素选你的点图层输入栅格可以单选也可以按住Ctrl多选把DEM、坡度、降雨一起选中一次出多列输出表指定一个输出路径格式默认是dbf如果你装了Excel驱动也可以直接给.xls采样方式ArcGIS Pro版本工具界面上有“Resampling method”下拉ArcMap脚本里通过第四个参数传。取离散分类栅格用NEAREST最近邻取连续型栅格如高程、温度用BILINEAR双线性要求更平滑的曲面用CUBIC三次卷积。点击确定生成一张dbf表。单栅格时字段名通常是RASTERVALU多栅格采样时字段名会拼上栅格名和波段信息比如dem_TIF_1。用“Conversion Tools → Excel → 表转ExcelTable To Excel”把dbf转成xls/xlsx。这一步有个细节值得说NEAREST不会对像元做任何插值它就是把点所在像元的原始值拿过来适合土地利用、土壤类型这类“类别值”。你要是把土地分类栅格用BILINEAR去采样分分钟给你采出一个“1.37类地”后续统计直接崩。反过来DEM这种连续面用NEAREST虽然也能用但坡度陡峭区域容易出现锯齿状取值BILINEAR更平滑也更接近真实地表。如果你不想多生成一张dbf可以用另一个工具Extract Multi Values to Points提取多值至点。它的特点是直接把栅格值追加到点要素的属性表里作为新字段。操作上就是在Spatial Analyst工具箱里找到它输入点要素在栅格列表里勾选你要的栅格点确定后打开点图层的属性表就能看到多出来的值字段再“表选项 → 导出”即可。ArcMap脚本里控制插值的参数是NONE最近邻或BILINEAR双线性。3.2 路线二Raster to Point逐个像元转点当你确实需要把栅格的每一个有效像元都变成一行或一个点最直观的方法是“栅格转点”。这个工具在ArcToolbox的“Conversion Tools → 从栅格 → 栅格转点Raster to Point”不需要Spatial Analyst扩展许可基础许可就能跑这点对没有高级扩展授权的朋友很友好。操作流程输入栅格选的可以是任意栅格字段参数整数栅格可指定VALUE字段浮点栅格直接用默认的Value。输出点要素指定shapefile或要素类路径。工具会为每个非NoData像元的中心生成一个点属性表里带一个GRID_CODE字段就是原像元值。打开生成点的属性表“表选项 → 导出”导出为dbf表或直接存成要素类表。再用Table To Excel转成Excel。这里面有几个必须提前心理建设的点。一是点数等于有效像元数一张1024×1024的栅格有效像元超过一百万Excel的xlsx格式上限是一百零四万八千五百七十六行你稍微大一点的栅格就直接爆表。二是Raster to Point对超大栅格非常吃力因为它要把每个像元实例化成空间点磁盘读写压力很大。三是生成的点携带的是像元中心坐标如果你是在做精度验证记得后边要把XY坐标也导出来方便跟真实点位对照。所以我一般把这条路线限定在“小范围栅格导出”或“需要像元坐标做点位化处理”的场景。整景大影像逐像元导出请直接看后面的脚本法。3.3 路线三ArcPy脚本批量处理数据量一大、栅格一多、流程一重复手点工具就彻底不现实了。这时直接写ArcPy脚本把“采样/转点 → 转Excel”串成一条流水线还能顺手加校验逻辑。在ArcMap的Python窗口或独立IDE里跑下面这个脚本就能完成“点采样栅格值 → 输出Excel”的全过程# -*- coding: utf-8 -*- import arcpy import pandas as pd raster_path rC:\data\dem.tif point_path rC:\data\sample_points.shp out_dbf rC:\data\sample_out.dbf out_excel rC:\data\sample_out.xlsx # 检查并占用空间分析扩展许可 if arcpy.CheckExtension(Spatial) Available: arcpy.CheckOutExtension(Spatial) else: print(空间分析扩展许可不可用请检查授权) arcpy.env.workspace rC:\data # 方式ASample工具采样 arcpy.sa.Sample(point_path, raster_path, out_dbf, NEAREST) arcpy.conversion.TableToExcel(out_dbf, out_excel) print(采样表格已导出, out_excel) # 方式B把整个栅格转成NumPy数组再写Excel逐像元导出 arr arcpy.RasterToNumPyArray(arcpy.Raster(raster_path), nodata_to_value-9999) df pd.DataFrame(arr) df.to_excel(rC:\data\dem_all_cells.xlsx, indexFalse) print(全像元表格已导出)脚本里有两个值得解释的点。nodata_to_value-9999这一步是把NoData在数组层统一替换成一个可识别值否则数组里会出现NaN或者浮点栅格默认的-3.4e38极端值后面写进Excel没法看。TableToExcel工具负责把dbf转成真正的Excel文件比你自己手动复制粘贴属性表靠谱得多。跑这种脚本最容易翻车的地方是环境设置。Execution环境的“掩膜”、“像元大小”、“捕捉栅格”三个参数务必在脚本开头统一设定尤其是捕捉栅格。如果不设采样时ArcGIS可能用分析环境的默认网格去对齐跟原始栅格差半个像元结果出来你自己都说不清采的是哪一格的值。脚本里建议加一行arcpy.env.snapRaster raster_path arcpy.env.mask raster_path arcpy.env.cellSize raster_path顺便提醒一句ArcMap自带的Python环境版本较老2.7pandas不一定预装。如果你只跑方式A完全不需要pandas要跑方式B逐像元导表可以先在ArcGIS Pro的Python 3环境里跑或者单独装一个ArcGIS Python环境再补pandas。这属于环境问题里最常见的一道坎。4. 常见问题与排查技巧实录4.1 NoData值混进统计结果这个我几乎每次答疑都会碰到。表面症状是Excel表里一大堆-9999、-32768或者-3.4e38一算平均值出现明显离谱的负数图表直接没法看。根因就两个原始栅格NoData定义丢了或者转换时没有做显式处理。排查与解决按顺序来先用“栅格计算器”跑一句Con(IsNull(raster), -9999, raster)把NoData统一替换成显式的-9999然后记住在后续统计时把-9999过滤掉千万不要图省事把NoData设成0因为0在DEM、降雨这类数据里是真实有效值混进均值会把结果拉低一大截。如果数据要交给别人最好在Excel里新增一列“是否有效值”而不是直接删行保留原始记录方便溯源。4.2 采样点与像元没对齐值偏了半格偏了半格这件事静态图层上看不出来但你把采样值和真实地面实测值放在一起做回归时误差会突然变大。原因通常是点没有落在像元中心或者分析环境的捕捉栅格没设。采样工具的NEAREST模式会取点所在像元的值点稍微偏到邻格取到的就是邻格的值尤其坡度大、空间变化快的区域差异肉眼可见。我的做法是两条腿走路要严格对齐先用栅格转点生成像元中心点再用这些中心点去做采样要快速排查就在脚本里把arcpy.env.snapRaster设成被采样栅格本身强制所有操作对齐到同一网格。对精度要求极高的定量分析这两步都别省。4.3 栅格太大Excel行数爆表Excel的xlsx工作表行数上限是1048576这在很多需求里是隐形雷。一张稍微像样点的栅格比如10000×10000有效像元就是上亿个别说Exceldbf都撑不住。Raster to Point生成百万级点之后属性表打开都费劲导出Excel时直接报“内存不足”。正解不是换电脑是改变数据形态。真需要逐像元数据让脚本直接输出CSV后续用Python、R去读如果只是要看整体分布用分区统计或者直方图汇总如果必须按区域交结果就用Zonal Statistics as Table输出每区的均值、总和、标准差这张表通常只有几十行才是Excel该干的活。4.4 字段名被截断和中文乱码用dbf做中转时字段名会被限制在10个字符内多栅格采样自动生成的字段名如果太长就会被截断比如dem_TIF_1变成dem_TIF_1倒还好遇到更长的名字可能出现两个字段名撞车。中文更麻烦直接在Excel里双击打开dbf经常乱码。我现在的习惯是所有导出的字段名一律用英文短名比如elev、slope、aspect坚决不用中文当字段名转换表格时统一走Table To Excel工具不要直接拿Excel去开dbf如果输出CSV编码用UTF-8 with BOM这样Excel双击打开才不会乱码。这属于“一开始规范后面全省事”的典型。4.5 许可证和工具可用性对照写进第四篇就是因为后台总有人卡在这一步。Sample和Extract Multi Values to Points都挂在Spatial Analyst工具箱下没有这个扩展许可的话菜单是灰的。如果你只有基础许可又不想申请扩展就用Raster to Point加属性表导出来实现逐像元取数或者如果装了3D Analyst可以用Add Surface Information往点上追加表面值。每个工具的许可证要求不一样开工前先看一眼工具箱里的灰显状态比写完脚本跑出错误再回头查高效得多。5. 一些个人习惯和后面想聊的东西最后说点我自己的经验。这几年做栅格分析最深的体会是导出Excel这件事难的不是工具操作而是你有没有在动手前把“统计口径”定死——到底要每个像元值、采样点上的值、还是按区分区的汇总值。口径没定清楚导出几遍都是白忙最后还得靠人工去比对口径差异。我自己现在的工作流基本固定批量交接数据用ArcPy脚本跑完自动校验行数、检查NoData占比再把生成的CSV和说明文档一起发给对方给不懂GIS的同事就给分区统计表加一张结果图真遇到必须逐像元交付的我宁可给压缩CSV也不硬导xlsx——你试一次万级乘万级的栅格导出Excel就会明白这条路有多堵。这个系列后续本来该进水文分析了到时候我打算专门做一期“栅格转矢量在流域提取里的那些坑”跟大家聊聊矢栅转换的取舍和典型翻车案例到时候再细聊。
返回列表