ARTICLE DETAIL

资讯详情

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

ArcGIS分区统计全攻略:众数、均值、中位数等统计量实战详解

ArcGIS分区统计全攻略:众数、均值、中位数等统计量实战详解 日常工作里只要跟栅格数据打交道基本都跑不掉“按区域统计”这个操作。比如你有全国的降雨量栅格、人口分布栅格或者某种土壤属性栅格手上又恰好有一个县级行政区划的矢量面想把每个县对应的栅格均值、最大值、最小值都算出来挂到属性表里这时候ArcGIS的分区统计工具就是最直接的选择。但很多人用的时候会发现工具会跑了可众数、中位数、少数这些统计类型到底什么意思、什么情况下算出来才有意义、为什么有时候工具报错或者结果全为空这些问题文档里写得简单实际操作里坑却不少。这篇东西我打算不按软件帮助文档那种干巴巴的写法来而是把“根据矢量范围统计栅格数据”这条完整链路拆开从工具选型、参数含义、栅格类型对统计项的限制、常见报错排查这几个方面把众数、最大值、均值、中位数、最小值、少数这些统计量一次讲透。无论你是刚入门的学生还是已经在用ArcGIS做项目的从业者这篇内容应该都能帮你少踩几个坑。1. 先搞清楚你要用的是哪一个分区统计工具1.1 两个名字很像但用途不同的工具ArcGIS里做“按区域统计”工具有好几个版本最容易搞混的就是下面这两个分区统计Zonal Statistics直接在栅格范围上计算统计值输出的结果可以是一个栅格图层也可以是一个表格。分区统计为表Zonal Statistics as Table输出结果一定是一张表格不会生成新的栅格而且这个表格可以直接通过属性字段连接回矢量图层。如果你是要“根据矢量范围统计栅格数据”绝大多数场景下应该选第二个也就是“分区统计为表”。原因是我们最终的诉求往往是把统计结果挂到原来的行政区划、流域边界这类矢量要素上表格输出之后用“连接字段”一下就能匹配上比栅格输出方便得多。有人会问那“分区统计”工具输出的栅格就没用了吗也有用。比如你想把每个县的降雨均值直接做成一张新的格网图每个格网值代表该县的均值那么栅格输出就是对的。但从日常项目交付角度来说表格输出的通用性和可操作性更强尤其是需要做成Excel或者导入数据库时“分区统计为表”几乎是唯一选择。1.2 工具藏在哪个位置工具位置分两种入口最好都记住ArcToolbox路径空间分析工具Spatial Analyst Tools→ 区域分析Zonal→ 分区统计为表Zonal Statistics as Table搜索窗口直接按CtrlF打开搜索输入“分区统计为表”或者“Zonal Statistics as Table”比在菜单里一级一级找快特别多。需要注意空间分析工具不是默认加载的模块需要提前在“自定义 → 扩展模块”里勾选Spatial Analyst否则工具是灰色不可用的。遇到工具点不动的情况十有八九就是这个模块没启用。1.3 这个工具到底干了一件什么事用一句大白话解释分区统计的原理给出一组“区域”矢量面或栅格数据再给出一层“待统计的栅格”工具会遍历每一个区域把落在该区域范围内的所有像元值收集起来然后按你指定的统计类型算出一个或多个数值。举个例子你有全国地下水位栅格数据每个格网代表该位置的埋深值手上有一个省级行政区矢量范围。用“分区统计为表”运行后工具会为每一个省单独提取栅格格网点计算这些点在“分区”范围内的均值、最大值、最小值、标准差等。这个原理听着不难但深入一点就有几个关键点会直接影响结果是否准确比如矢量面和栅格的范围、投影是否一致栅格分辨率大小对统计精度的影响落在面边界上的像元算不算入该区域NoData值怎么处理这些细节在后面各个章节里逐一展开。2. 众数、少数、中位数等统计量到底代表什么2.1 从最小值到最大值各个统计量的实际含义在“分区统计为表”工具的“统计类型Statistics type”下拉菜单里ArcGIS提供了以下这些选项统计类型英文原名表示意义适用数据平均值MEAN区域内全部像元的算术平均值浮点/整型栅格最大值MAXIMUM区域内像元值的最大值浮点/整型栅格最小值MINIMUM区域内像元值的最小值浮点/整型栅格中位数MEDIAN区域内像元值排序后位于中间的值浮点/整型栅格标准差STD区域内像元值的离散程度浮点/整型栅格总和SUM区域内全部像元值加总浮点/整型栅格范围RANGE最大值减最小值浮点/整型栅格众数MAJORITY区域内出现频次最高的像元值仅整型栅格少数MINORITY区域内出现频次最低的像元值仅整型栅格变异度VARIETY区域内不同像元值的个数仅整型栅格注意这个表格里最后三行众数、少数、变异度后面都标注了“仅整型栅格”。这个限制非常关键。如果你拿一块浮点型栅格比如温度、降雨量、NDVI基本都是浮点型去跑众数统计工具有时候会直接提示该统计类型不适用于浮点数据有时候则会自己把数据取整再统计取整后结果可就不准了。2.2 众数统计的真实应用场景大数据领域里众数大家都很熟悉就是一串数据里出现次数最多的数。GIS里的众数统计也是这样统计学意义完全一致不同点在于它统计的对象是空间像元值。众数最适合处理的是类别型栅格数据。什么叫类别型栅格比如土地利用类型栅格1代表耕地、2代表林地、3代表建设用地或者土壤类型栅格、植被类型栅格。这种栅格的特点是像元值是离散的整数每一个整数值代表一个类别而不是连续的测量值。假设你想统计每个县里最主要的土地利用类型是什么直接计算平均值没有任何意义因为“耕地”“林地”“建设用地”的平均数是个不存在的虚构类别。正确的做法就是统计众数哪个整数类别出现次数最多哪个就是这个县的主导类型。少数MINORITY在业务中用的少一些它的含义是区域内出现频次最低的整数值。如果某个县的少数值是建设用地就说明该县建设用地分布极少这对一些生态环境保护类项目有参考价值。变异度VARIETY表示区域内不同类别的数量比如区域内落地了5种不同土壤类型变异度就是5。这几种统计量本质上是围绕“类别栅格”设计的大家使用时一定要有数据类型的概念。2.3 均值、中位数、最大值、最小值在连续栅格分析中的取舍对于连续型栅格像降雨量、气温、POP人口网格、DEM高程最常用的统计量就是均值、最大值、最小值有时也会用到中位数和标准差。均值是最直观的区域代表值比如计算流域平均降雨量直接选平均值就行。但均值也有个弱点它对异常值敏感。如果某个区域内有一个像元值是传感器异常导致的极端大值平均值会被明显拉高。中位数的好处是对异常值不敏感。比如统计某个城市区域的建筑物高度栅格中间混杂了一栋极高的信号塔像元算均值会被明显抬高但中位数几乎不受影响。所以在做数据质量一般、含有离群值的栅格统计时中位数往往比均值更稳健。最大值和最小值则是极端情况监测的重要指标。比如做洪水淹没分析时你关心的是每个行政区内的最高水位做低温灾害监测时关心的是最低温。这两个统计量在ArcGIS工具里计算逻辑很直接就是扫描区域内所有像元值找最大和最小唯一的注意点还是NoData像元处理后面我会专门说。2.4 为什么栅格数据类型会限制统计项的选择这里值得展开说说栅格数据类型对统计项的限制机制。栅格数据可以粗分为两大类整型Integer和浮点型Floating Point。整型栅格像元值是不带小数的整数常见来源包括土地利用分类结果、类型编码栅格、从矢量转换过来的ID栅格。浮点型栅格像元值带小数常见来源包括气象插值结果、遥感反演参数、DEM有时候DEM存储为整型但本质上高程是连续量。众数、少数、变异度这类“频数统计”指标数学前提是数据可以分组每个组别有一个明确的整数值。浮点型数据理论上几乎每个像元值都不同统计众数没有实际意义。所以ArcGIS才把众数、少数、变异度锁定为只允许整型数据使用。如果你确实需要用浮点型栅格来统计“哪个范围的像元值最集中”可以先把栅格重分类成整型等级比如把降雨量分成1-5五个等级再用重分类后的整型栅格去跑众数这样就符合工具约束了。不过这种做法改变了原始数据精度实际项目中一定要在文档里写清楚处理方式否则成果数据自己回看都会犯迷糊。3. 实操全过程用矢量和栅格跑出统计表3.1 前期准备数据格式和处理范围检查正式开始跑工具之前先花两分钟检查三样东西能省掉后面不少麻烦。第一矢量面要素必须是面要素不能是点或线。这个听起来是废话但确实有同事拿点要素去当分区数据用工具直接报错。第二矢量面和栅格数据的投影坐标系最好保持一致。如果矢量面是地理坐标系WGS84栅格是投影坐标系UTM工具可以运行但计算过程中会做动态投影转换一方面速度慢另一方面边界匹配可能出现偏差。最稳妥的做法是先把矢量面和栅格都统一到同一个投影坐标系下。第三确认栅格数据文件本身没有损坏金字塔是否构建完整。数据量大时建议先画一个较小的测试范围运行一次确认输出无误后再全量跑。3.2 环境设置里的隐藏细节很多人打开“分区统计为表”对话框填好输入数据就开始点了很少关注“环境”按钮里的内容。但环境设置恰恰是决定结果是否正确的关键。环境设置里面最值得关心的是“栅格分析 → 像元大小”和“处理范围”。像元大小如果矢量面范围比较小而栅格分辨率比较粗比如栅格是1公里分辨率的矢量面是几百米的小地块这时统计结果会非常粗糙。工具默认会使用输入栅格本身的像元大小所以一般不需要额外设置。但如果你同时输入了多个栅格做批量统计又想保持输出结果具有可比性建议把所有统计的像元大小统一成一个值。处理范围如果只想统计某一个局部区域可以在环境里设定范围这样能大幅提升计算速度因为工具不需要扫描整个栅格。此外还有一个容易被忽略的选项“栅格分析 → 掩膜”。如果你设置了掩膜工具会只处理掩膜范围内的像元。在某些项目中掩膜本身会改变统计结果所以没有明确需求的时候建议不要设置掩膜。3.3 分区统计为表的参数填写逻辑打开“分区统计为表”对话框会看到这些参数输入栅格或要素区域数据Input raster or feature zone data选择你的矢量面文件比如行政区shp。区域字段Zone field选择用来区分不同区域的字段通常选行政区名称字段或者区划代码字段。注意这里不能选面积字段只能选标识字段。输入值栅格Input value raster选择你要统计的那个栅格数据。输出表Output table设置输出表格路径。统计类型Statistics type根据数据情况选择。忽略NoDataIgnore NoData in calculations默认勾选一般保持勾选。参数填完之后点确定工具会弹出一个进度条。这里因为ArcGIS版本不同进度条显示状态也不太一样。10.x版本如果数据量大进度条可能卡在某个百分比很久这属于正常现象不要急着关掉。运行完成后输出表会自动加载到内容列表里。右键点击这个表选择“打开”就能看到每一行对应一个区域比如一个县每一列对应一个统计值。3.4 把统计结果连接回属性表“分区统计为表”工具直接输出一张独立表格如果你想让表里的数据直接作为矢量面属性显示和导出就需要做一次“连接字段”。操作流程右键属性表中的行政区图层选择“连接和关联 → 连接”。在对话框里“要将什么连接到该图层”选择“基于某个字段的连接”。“选择此图层中连接将基于的字段”选行政区名称字段或区划代码。“选择要连接到此图层的表”选刚生成的统计表。“选择此表中连接所基于的字段”选统计表里对应的区域名字段。连接完成后打开属性表可以看到右侧多出了均值、最大值、最小值这一串新字段。如果想把连接结果永久保存下来右键图层 → 数据 → 导出数据存成一个新的shp或要素类即可。有一点要非常小心连接字段的两边必须完全一致。比如左边区划代码是“110101”右边表格里的区划代码也是“110101”才能匹配。如果左边是“110101”右边是“110101.0”因为读入Excel时被识别成了数字并保留了小数格式匹配就会失败最终统计结果会全部为空。这种问题在实战中太常见了后面会专门讲。3.5 批量统计时如何提高效率一个项目里往往会遇到“一个矢量范围对多个栅格统计”的情况比如一个县界shp要对月份降雨栅格1到12月分别统计均值。如果手动跑12次操作量不大只是无聊和容易出错。推荐两种批量方式在ArcGIS Pro里使用“迭代栅格”模型构建器ModelBuilder配合“收集值”和“分区统计为表”循环处理多个栅格。写一段ArcPy脚本遍历文件夹下的全部栅格调用ZonalStatisticsAsTable函数。ArcPy调用示例大致是这样一个逻辑import arcpy from arcpy.sa import * arcpy.env.workspace rD:\你的数据目录 arcpy.CheckOutExtension(Spatial) zones rD:\行政区.shp zone_field NAME value_rasters [raster1.tif, raster2.tif, raster3.tif] for raster in value_rasters: out_table rD:\输出_ raster.split(.)[0] arcpy.gp.ZonalStatisticsAsTable(zones, zone_field, raster, out_table, DATA, ALL)这样就可以一次性把所有栅格的均值、最大值、最小值、中位数、众数等全算出来并且每个栅格生成一张统计表。有基础的读者可以直接用脚本比手动点击高效很多。4. 深入解读NoData、面积加权和边界像元的处理逻辑4.1 NoData像元对统计结果的影响NoData在栅格中表示没有数据的像元。分区统计时遇到NoData默认处理方式是“忽略NoData”也就是这个像元不会参与计算。如果你把环境设置改成“将NoData视为0”那这些像元就会按0值参与统计结果会完全变样。举个例子统计某流域平均降雨量流域内有一部分格网点没有数据比如传感器缺失。默认情况下工具会忽略这些点用剩下有数据的点计算均值。如果你不小心把NoData视为0那么均值会被大量0值拉低结果根本没有参考价值。所以我的建议是除非你明确知道NoData代表的含义就是0有些栅格数据集里NoData和0值确实做了特殊处理否则永远保持默认的“忽略NoData”。4.2 边界像元到底算不算进去栅格像元是正方形网格矢量边界切割网格时不可避免地会出现一个像元被边界切成两半的情况。ArcGIS默认的处理方式是只要像元的中心点落在区域内就认为这个像元属于该区域统计时纳入计算。这是比较主流的处理方式叫做“中心点归属法”。由此带来的误差是边界上的像元虽然有一部分面积在区域外但计入了全部像元值。栅格分辨率越粗这种边界效应越明显。如果你做的是县级粗粒度分析1公里分辨率栅格带来的边界误差在可接受范围内但如果做的是街道级别精细分析还是建议换更精细的栅格数据源。补充一种特殊情况有些需求会要求“按面积加权平均”就是说要把落在边界上的像元按面积比例拆开计算。ArcGIS基础的分区统计工具不直接支持这种算法通常需要用到“栅格加权叠加”或者第三方工具实现。大家可以知道这个需求存在但不建议在基础工具上强行实现。4.3 为什么有时候算出来的均值和手动提取的不一致这是一个让很多人困惑的问题先用“提取工具 → 按掩膜提取”把栅格裁出来再拿栅格计算器算平均值结果跟分区统计算出来的均值差了一点。原因主要有两个一是掩膜提取时默认会保留矢量范围外的NoData像元这些NoData可能变成0或者保留为NoData导致后续平均值计算中分母不一样。二是分区统计基于所有落入区域内的像元中心点来判断归属而掩膜提取时按边界几何裁剪边界处的部分像元会被裁掉一半参与计算的像元集合就不一样了。在实际项目中这两种算法都有应用场景但如果你是要做“按区域汇总统计”并且后续要连接回属性表直接使用分区统计为表是最标准、最不易出错的做法没必要绕道掩膜提取。4.4 面积加权适用于哪些场景前面提到面积加权的概念再展开说说。在做一些资源统计业务时比如基于遥感反演的生物量栅格统计每个县的总生物量如果只用像元值求和不考虑不同纬度像元实际面积差异在高纬度地区会产生明显偏差。栅格数据在投影坐标系下每个像元的实际地面面积基本一致等面积投影下完全一致但在地理坐标系下不同纬度像元对应的实际面积不一样。这种情况下如果做总量统计最好先把数据投影到等面积投影或者对每个像元乘以面积权重再做统计。ArcGIS的分区统计工具本身不直接输出面积加权结果。需要用到“面积加权”时通常做法是先通过“以表格显示分区几何”工具算出每个区域内的像元个数再结合分辨率换算实际面积进而计算面积加权值。这块属于进阶用法大家知道有这个方向即可大部分常规项目用不到。5. 常见报错与排查经验5.1 运行报错“ERROR 010240”之类的问题怎么办分区统计工具最常见的报错是“ERROR 010240: Could not save raster dataset to the specified location of output table”或者其他输出路径相关错误。这个错误大部分时候不是算法问题而是输出路径权限或磁盘空间不够。排查思路检查输出路径是不是只读目录试试输出到默认的“默认地理数据库”路径。检查磁盘剩余空间是否充足。统计大范围栅格时临时文件可能占用几倍于源文件的空间。检查输出表名是否包含中文或特殊字符尽量用英文字母和下划线组合。还有一类报错是“空间分析模块未授权”或“Spatial Analyst extension is not available”这类问题先去“自定义 → 扩展模块”勾选Spatial Analyst如果已经勾选还是报错可能是许可过期重启ArcGIS再试。5.2 统计结果全为空或值明显不合理如果你发现结果表里的统计值全部为空或者明显大到离谱优先排查三个方向。第一矢量面和栅格数据的空间范围是否重叠。如果范围完全错开每个区域都统计不到像元结果当然为空。用“缩放至图层”分别看一下两个图层的实际范围。第二区域字段和值栅格类型是否匹配。如果区域是整型字段但值栅格是浮点型部分统计类型识别异常也可能导致输出异常。第三连接字段出问题。很多“统计结果全空”其实发生在连接阶段。前面说过两个字段格式不一致或精度不一致都会导致连接失败属性表里新列显示为空。5.3 众数、少数统计项无法选择怎么办前面聊过众数、少数、变异度只适用于整型栅格。如果你发现统计类型下拉菜单里这几个选项是灰色不可选或者运行时明确提示“无法为浮点型栅格计算该统计量”原因是你的值栅格是浮点型。解决思路如果业务上只需要统计众数而栅格原本是分类整数数据只是被误存成浮点型用“栅格计算器”或“转为整型”工具处理一下。如果栅格本质是连续浮点数据需要先把连续值重分类成离散分级再统计众数但这时的众数含义是“最常出现的等级”不是“最常出现的原始值”。这个区别在做成果说明时一定要讲清楚。还有一种情况是栅格本身确实是整型但图标显示为带小数这通常是因为栅格有色彩映射表或缩放因子。可以在图层属性里关闭“应用符号系统缩放”或查看栅格属性中的像素类型确认。如果像素类型显示的是整型就能够正常使用众数统计。5.4 运行特别慢怎么优化大范围、高分辨率的栅格统计确实很吃性能。比如全国范围的30米分辨率土地利用栅格按县级区划统计动辄几百万甚至上亿个像元工具跑几个小时也正常。优化经验有这些在环境设置里把“处理范围”限定到实际分析范围。比如分析的是黄河流域就没必要让工具扫描全国范围的数据。检查矢量面要素数量。区域数量如果特别多比如按乡镇边界统计计算量也会很大可以考虑把需求拆成几个批次跑。关闭其他占用内存的程序。ArcGIS是单线程处理为主内存充足时能减少卡顿。如果用的是ArcGIS Pro可以把“地理处理选项”里的“后台处理”打开这样至少不至于界面卡死。还有一个偏方先把栅格重采样到更粗的分辨率再统计比如把30米重采样成100米速度能提升近十倍代价是统计精度降低。能不能用取决于业务容差如果只是做前期趋势判断完全可行。6. 案例复盘一次地下水埋深栅格的分区统计全过程6.1 任务需求和数据情况早些年我做过一个项目需要统计某几个地市级行政区范围内的地下水埋深特征值包括最大埋深、最小埋深、平均埋深和中位数埋深。手上拿到的数据是全国地下水位栅格数据浮点型单位米分辨率1公里行政区划是我们自己整理的地市shp。这个需求有两个重点一是地下水埋深数据的值越大代表埋深越深越小代表越靠近地表二是为了后续写报告需要每个地市单独一组特征值方便横向比较。6.2 操作步骤复盘第一步把地市shp和地下水位栅格都加载进ArcMap先目测一遍空间范围是否重叠、投影大概在哪个位置。确认无误后如果有必要就做一个投影统一定义。第二步在内容列表右键栅格图层查看属性确认像素类型是浮点型然后在“符号系统”里把拉伸类型设置为“最小值-最大值”直观浏览埋深空间分布。第三步打开“分区统计为表”输入矢量范围选地市shp区域字段选“市名”统计类型选择“全部”因为我们要同时要均值、最大值、最小值、中位数直接选ALL。第四步设置输出表路径开始执行。1公里分辨率栅格量不算太大跑起来大概一两分钟就出结果。第五步结果表连接回地市shp导出成最终成果再用Excel整理成报告附表。做这一步时还遇到一个小插曲有个地市的名字里面有空格导致连接字段匹配不上后来用“字段计算器”把空格去掉才解决。这类数据清洗问题非常实际大家做连接前最好先检查字段值里有没有隐藏空格、全角字符。6.3 结果验证方法连接完成后我习惯做两个验证第一个是挑一个市用“提取工具 → 按掩膜提取”把该市的埋深栅格单独裁出来然后用“栅格计算器”算一下平均值再跟分区统计表里的均值对比误差在合理范围内就说明结果基本可靠。第二个是查看最大和最小埋深跟原始栅格的拉伸显示是否吻合。比如某个市最大埋深是80米放大到该市范围看栅格颜色最大埋深位置颜色最深这一步就是肉眼抽检。两个验证都通过这组分区统计结果才敢正式用于报告。实际项目的严谨性影响着后续决策花这几分钟做验证非常值得。6.4 统计结果在项目中的用途延伸地下水埋深的统计结果除了直接呈现数值之外项目里一般还会进一步做分析求每组均值之后把均值字段做分级渲染能够直观看出不同地市的地下水位深浅空间格局。把最大值减最小值算出极差可以辅助判断各地市地下水埋深的空间变异性。结合气象数据做相关性分析时每个地市的均值埋深可以作为代表值参与统计建模。这些延伸分析其实都在证明同一件事分区统计的最终目的不是拿到一张表而是把栅格数据浓缩成区域特征值让后续的制图、统计、建模都建立在可靠的汇总数据基础上。7. 用ArcPy脚本让整套流程自动化7.1 为什么建议掌握脚本方式点击按钮操作虽然直观但遇到多区域、多栅格、重复性强的任务时效率就捉襟见肘了。尤其是项目周期紧张时一遍遍手工点工具既浪费时间又容易因为漏选参数导致结果不一致。这时候脚本自动化是更优的路径而且ArcPy的学习门槛并没有想象中那么高。只要会按顺序写参数只需要知道工具名和参数顺序就能跑通一个基础脚本。官方帮助文档提供了每个工具的语法参考照着套模板改参数就行。写多了之后还能把自己的脚本整理成模板下次换数据直接改路径复用。7.2 ArcPy完整实现代码与注释下面这段代码实现了“按矢量范围统计多个栅格并输出多张统计表”的功能比较完整也包含了环境设置和许可检查。# -*- coding: utf-8 -*- import arcpy from arcpy.sa import * # 启用空间分析扩展模块 arcpy.CheckOutExtension(Spatial) # 设置工作空间所有相对路径都基于这个目录 arcpy.env.workspace rD:\GIS_Project arcpy.env.overwriteOutput True # 定义输入数据 zones rD:\GIS_Project\地市行政区.shp zone_field 市名 value_rasters [ rD:\GIS_Project\raster\埋深1月.tif, rD:\GIS_Project\raster\埋深7月.tif, rD:\GIS_Project\raster\埋深年均.tif, ] # 设置处理范围和像元大小建议根据实际需求调整 arcpy.env.extent rD:\GIS_Project\分析范围.shp arcpy.env.snapRaster value_rasters[0] arcpy.env.cellSize value_rasters[0] # 输出目录 out_dir rD:\GIS_Project\output if not arcpy.Exists(out_dir): arcpy.CreateFolder_management(rD:\GIS_Project, output) for raster in value_rasters: # 提取栅格文件名作为输出表名 raster_name os.path.basename(raster).split(.)[0] out_table os.path.join(out_dir, 统计_ raster_name .dbf) # 执行分区统计为表 try: arcpy.gp.ZonalStatisticsAsTable( zones, zone_field, raster, out_table, DATA, # 忽略NoData ALL # 计算所有统计量 ) print(完成统计 raster_name) except Exception as e: print(统计失败 raster_name 原因 str(e)) arcpy.CheckInExtension(Spatial) print(全部处理完成)这里有几个脚本细节值得说明arcpy.env.extent设置了处理范围也就是只处理分析范围内数据速度提升显著。输出表格式选了dbf优点是通用性好Excel可以直接打开连接shp也没有障碍。ALL参数会一次性输出包括众数、少数、中位数在内的所有统计量避免为了缺一个统计量重新跑一次。但要注意如果栅格是浮点型输出表中众数、少数、变异度几个字段会是-9999或空值这是正常表现。7.3 脚本批量处理后的结果整理脚本运行完成后输出目录里会生成多张统计表。每张表的结构是一致的第一列是区域名称后面依次是面积、周长等几何属性取决于区域数据的源格式再往后是各类统计值。把多张表汇总到一张Excel表时可以通过区域名称做横向匹配整理出“区域×月份”的矩阵表格方便后续作图和数据分析。用脚本配合Excel或者Pandas甚至可以做到“一键产出全套统计报表”这也是很多行业项目里的标准做法。8. 个人实操经验分享避开那些文档里没写的坑最后聊几个这条技术路线上我踩过、也见别人踩过的典型问题。这些内容在ArcGIS帮助文档里通常不会写得那么细但实战中遇到一次就能让人记住很久。第一个坑是输出表名的命名规范问题。ArcGIS的表格输出对字段名长度有严格限制而且不支持一些特殊字符。比如输出字段名过长时表结构保存后字段会被截断或重命名连接属性表时找不到对应字段就很头疼。处理原则是输入矢量字段名尽量简短且有规则例如用拼音缩写加数字编号不要用又长又含特殊符号的中文名。第二个坑是默认地理数据库与文件地理数据库的取舍。输出统计表时如果默认路径是默认地理数据库生成的表格在图层属性里打开没问题但在文件夹里找文件就找不到因为它存成了地理数据库要素类而不是独立的dbf文件。如果想让统计数据方便传递或者发给别人用建议输出路径指定到一个普通文件夹格式选dbf。第三个坑是中文路径和中文文件名。ArcMap对中文路径的支持在多数环境下没问题但偶尔会遇到莫名其妙的“不能创建输出”或者“无法读取栅格”错误。遇到这种问题最有效的排查方案就是把数据复制到纯英文路径下再跑一遍。不要跟软件较劲直接换路径节省不少时间。第四个坑是没有及时保存地图文档或工程文件。每次调好参数测试完一定要先保存工程文件再批量跑数据。因为大批量运行ArcGIS时偶尔会崩溃一旦崩溃参数配置和中间结果可能全丢。跑大型作业前先保存工程这是基本的职业习惯。这些坑很少被写进教程但大多数人实际工作中遇到的情况很大程度上就是被这些小问题卡住的。希望大家看了之后能少折腾一点把精力放到真正值得研究的业务问题上。分区统计看似简单但牵扯到的数据原理、工具逻辑和应用场景其实不少。把众数、中位数、均值这些统计量的适用条件搞清楚把NoData、边界像元这些处理机制弄明白整个流程跑下来就会顺畅很多。
返回列表