简介在GIS遥感分析中夜间灯光数据常用于评估城市化程度、人口分布和经济发展差异。面向使用ArcGIS处理夜间灯光影像的初学者和科研人员这份资料提供了从数据准备到结果可视化的完整操作指引。内容涵盖VIIRS/DMSP-OLS栅格数据与行政边界数据的获取利用按属性选择完成区域范围提取通过按掩膜提取裁剪出目标夜间灯光影像并借助Spatial Analyst工具下的以表格显示分区统计计算各区域灯光强度再结合字段连接与分级色彩进行专题制图还可继续添加图名、图例、比例尺等地图整饰要素。资源为单个docx文档约6.52MB文档中列出每一步的工具位置、参数设置和导出建议便于对照实操也可作为后续同类遥感任务的参考模板。已有3651人次学习下载适用于城市规划、区域发展比较、生态环境监测等场景能帮助用户系统掌握夜光遥感分析的高效工作流并理解从原始影像到统计成果的完整链路。1. 夜间灯光的提取与强度计算ArcGIS掩膜与分区统计一条链路走通夜间灯光提取和强度计算在 GIS 实务里是一对固定搭配前者用行政区边界把卫星灯光栅格“切”出研究范围后者用分区统计把切出来的像元值汇总成能写进报告的数字。这套流程在 ArcGIS 里跑一遍并不复杂但真正动手的人里七成左右会卡在坐标系不一致、NoData 被当成 0、连接字段类型对不上这类细节上。这篇笔记把整条链路拆开来讲适合正在做城市夜间灯光分析、经济活跃度评估或环境监测的从业者也适合刚接触 ArcGIS 空间分析的学生。看完你能拿着矢量边界和灯光 tif自己从属性选择一路做到分区统计和出图。2. 数据准备坐标系统一与两类灯光数据的选型细节2.1 灯光数据源差异VIIRS 与 DMSP/OLS 怎么选夜间灯光栅格数据本质是一张单波段影像每个像元记录的是该位置的灯光亮度值单位是辐射亮度或数字量化值。不同传感器产出的数据在空间分辨率、时间跨度和数值意义上差别很大选错数据源会直接导致后续统计结果不可比。VIIRS 传感器提供的合成产品是当前最常用的选择空间分辨率约 500 米数值是去除火光、气体燃烧等杂散光源后的平均灯光辐射值适合做年度或月度对比。DMSP/OLS 系列是更早的稳定灯光合成数据分辨率约 1 公里时间覆盖从 1992 年到 2013 年左右适合做长时序的城市扩张回溯分析。两类数据在 ArcGIS 里都能直接加载但要注意DMSP/OLS 的像元值是 0 到 63 的整数档位VIIRS 是浮点型的辐射值二者不能混在同一张统计表里。对比项DMSP/OLSVIIRS空间分辨率约 1000 米约 500 米数值类型0~63 整数档位浮点辐射亮度值适用场景长时序城市扩张分析近期灯光强度、经济活跃度评估拼接处理需逐年校准官方已做合成处理可直接用实际项目里我一般默认优先拿 VIIRS 月度合成数据如果只是做某一年的截面分析直接用对应年份的年度合成 tif 就够了。下载时留意文件命名里的年份标记避免把不同年份的影像叠在一起统计。2.2 坐标系为什么是第一步栅格与矢量必须坐在同一张“底图”上坐标系不统一是这条链路里翻车率最高的环节而且它翻得很隐蔽ArcGIS 打开两个图层时软件会动态投影让它俩看起来是重合的但按掩膜提取工具执行时底层会按严格的坐标值做空间计算。如果灯光栅格是地理坐标系WGS84 经纬度行政边界是投影坐标系比如 CGCS2000 投影两者即便视觉上重叠实际参与计算的坐标基准不同结果要么是范围偏移要么是输出一张看着正常但统计值全是零的废栅格。判断坐标系是否一致最快的方式是分别打开两个图层的属性——源选项卡里看“空间参考”。栅格数据一般在元数据里带着坐标系信息矢量 shp 的坐标系则写在同目录的 .prj 文件里。如果 shp 文件旁边没有 .prj 文件ArcGIS 会默认当成未知坐标系这时候必须先给定坐标系否则后面所有分析都建立在错误假设上。我一般会先做一次“图层右键—属性—源”检查把两个数据的空间参考名称记下来。理想状态下栅格和矢量都使用同一投影坐标系比如 CGCS2000_3_Degree_GK_CM_114E因为投影坐标系的单位是米分区统计的面积和强度字段直接与面积挂钩不用做单位换算。2.3 统一坐标系的操作路径先看元数据再动手如果发现坐标系不一致优先改矢量不要轻易重投影栅格。栅格重投影涉及像元重采样每重采样一次就相当于给数据做一次插值灯光亮度值会被平滑后续统计结果会失真。矢量 shp 的坐标系换起来要安全得多工具路径是 ArcToolbox—数据管理工具—投影和变换—要素—投影。操作时注意勾选“输出坐标系”为与灯光栅格一致的坐标系。如果矢量本身没有定义坐标系先使用“定义投影”工具补一个正确坐标系再执行“投影”工具完成转换。定义投影和投影工具是两个容易混淆的操作定义投影是告诉软件这个数据是什么坐标系投影才是实际转换坐标值。工具路径ArcToolbox → 数据管理工具 → 投影和变换 → 要素 → 投影 关键参数 - 输入数据集或要素类选择行政 shp - 输出数据集或要素类命名如 admin_Projected.shp - 输出坐标系选择与灯光 tif 一致的空间参考投影工具执行完成后把输出的新 shp 加载进地图右键查看源空间参考。确认与灯光栅格完全一致后再进入属性选择和掩膜提取环节。整套流程里这一步最枯燥但省掉它的代价就是后面所有输出都可能作废。3. 行政区提取与按掩膜提取属性选择的 SQL 写法与三入参对齐3.1 按属性选择区域name 字段的唯一值获取与 Or 连接拿到行政矢量后第一步是从整层数据里挑出研究区范围。ArcGIS 的“按属性选择”工具在图层右键菜单里也可以从“选择—按属性选择”打开。操作顺序是在字段列表里双击 name 字段点击“获取唯一值”这时下方会列出该字段的全部取值直接双击需要的区域名即可拼进表达式。只选一个区域时表达式就是name A市点击应用确定就能看到地图上高亮出该区域。需要选多个区域时用 Or 连接多个条件。这里有一个新手很容易忽略的点当条件比较多时必须用括号把多个 Or 条件包起来否则如果后面还要 And 别的条件逻辑会错乱。例如name A市 Or name B县 Or name C区是没问题的但如果想表达“属于这几个区域且面积大于多少”必须写成(name A市 Or name B县) And area 100。多区域连接时可以换用 SQL 的 IN 写法表达式更简洁name IN (A市, B县, C区)。ArcGIS 的标准 SQL 方言对 IN 支持良好尤其适合候选区域列表很长的情况。唯一要注意的是字段值里的中文引号必须用英文单引号别用中文引号否则表达式会直接报错。3.2 导出要素并只显示目标图层别把整层数据带进掩膜选中的区域仍然属于原始 shp 图层如果直接拿它去做掩膜掩膜范围会临时按当前选择集计算虽然也能跑但后续一旦清除选择集或重新打开工程这个掩膜图层就失效了。稳妥的做法是把选中的区域导出成独立 shp 文件。右键图层名选“数据—导出数据”在导出对话框里“导出”选项默认是“所选要素”确认无误后设置输出路径和文件名。注意这里导出的是要素类不是图层路径里不能包含中文目录文件名最好用拼音或英文否则部分 ArcGIS 版本会出现数据源无法加载的问题。导出完成后把原始行政图层前面的勾去掉地图里只保留新导出的研究区图层。这一步的价值在于后续每一次掩膜提取和分区统计都使用同一份边界数据不会因为选择集状态变化导致结果前后不一致。按属性选择这套操作在项目里往往要重复多次每提取一次研究范围就导出一次保持数据链条干净。3.3 按掩膜提取参数对照输入栅格、掩膜、输出位置的三个坑按掩膜提取工具位于 Spatial Analyst 工具—提取分析下三个输入参数看起来简单实际操作时最容易出问题的反而是环境设置。输入栅格选择夜间灯光 tif注意这里要选真实栅格文件而不是图层符号化后的对象。掩膜数据选择上一节导出的研究区 shp。输出栅格命名后还要检查一个关键环境参数地理处理环境的“处理范围”和“掩膜”设置。如果环境里的范围仍保持默认输出的栅格会保留灯光影像的原始范围掩膜以外的区域会被填成 NoData栅格文件尺寸巨大加载和后续统计都会变慢。注意掩膜提取输出栅格的 NoData 区域不等于 0 值。在分区统计时NoData 像元默认不参与统计但如果后续做栅格计算器或转成整型NoData 很容易被转成 0导致灯光暗区被当成无灯光区混入统计。正确做法是在执行工具前打开“地理处理—环境”把“处理范围”设为与掩膜相同“栅格分析”里的掩膜也设为研究区 shp。这样输出的 tif 范围与行政边界完全一致几乎所有后续操作都会更快更稳。工具路径ArcToolbox → Spatial Analyst 工具 → 提取分析 → 按掩膜提取 参数设置 - 输入栅格夜间灯光 tif - 输入栅格数据或要素掩膜数据行政研究区 shp - 输出栅格以英文命名如 night_light_extract.tif - 环境设置处理范围 → 与掩膜相同栅格分析掩膜 → 研究区 shp掩膜提取完成后建议先看一眼输出栅格的直方图。灯光数据有一定数量的 0 值像元属于正常现象但如果直方图在最大值位置出现一个突兀的尖峰多半是边界处存在异常高亮像元需要回到原始数据检查是否是传感器异常值。4. 强度计算与可视化分区统计的统计类型选择与连接回图4.1 分区统计的统计语义均值、总和与夜间灯光强度的真实含义夜间灯光强度计算不是直接拿栅格里的像元值填个颜色就完了它需要把研究区边界内的所有灯光像元汇总成有业务含义的数字。ArcGIS 里对应的工具是“以表格显示分区统计”Zonal Statistics as Table位于 Spatial Analyst 工具—区域分析下。分区统计的输入有四个关键项区域数据行政区 shp、区域字段用于唯一标识每个面的字段比如 name、赋值栅格掩膜提取后的灯光 tif以及输出表。统计类型这个参数决定了输出字段的语义可选项包括 MIN、MAX、MEAN、SUM、STD、RANGE 等。在夜间灯光分析里业务上常用的是 SUM 和 MEAN。SUM 表示区域内所有灯光像元值和可以理解为该区域的灯光总能量适合衡量城市经济规模总量。MEAN 表示平均灯光强度消除面积差异后适合比较不同区域的发展密度。如果只按默认值跑而不选统计类型工具默认输出的是所有统计字段表格会非常宽后续连接查看也不方便。统计类型输出字段含义适用业务场景SUM区域灯光总值城市规模比较、经济总量估算MEAN区域平均灯光强度单位面积灯光密度、城市化水平MAX区域内最大像元值检查是否存在异常高亮像元STD灯光值离散程度分析灯光分布集中度执行分区统计时还有一个容易忽略的选项是“忽略 NoData”。默认情况下 NoData 像元会被忽略不参与计算这个默认行为是正确的。但如果掩膜提取时没有清理干净边界面积很小的狭长像元可能因为 NoData 不参与统计而输出空值需要回到掩膜提取环节重新处理。4.2 连接回图前的字段预处理类型不一致会静默失败分区统计输出的是一张独立表格dbf里面有一列是区域字段的值后面跟着各统计类型的计算结果。要把这张表挂回行政区的属性表用的是“连接和关联”功能。右键行政区图层选“连接和关联—连接”在连接对话框中分别指定要连接的字段和外部表格的连接字段。这里最常见的坑是字段类型不一致。比如行政区属性表里的 name 字段是文本型分区统计输出表里的同名区域字段也是文本型ArcGIS 才能正确匹配。如果区域字段在统计表里被识别成数值型哪怕显示的内容看起来一样连接后结果字段会全是空值。判断方法很简单连接完成后立刻打开行政区属性表向右滑动看最后几列如果灯光强度字段全为空基本就是字段类型或字段值不匹配。解决方式有两种。一是连接时换一个字段很多 shp 文件的属性表自带 FID 或 ObjectID 字段分区统计表也保留了这个字段用整数型字段连接要比用 name 文本字段更可靠。二是如果必须用 name 字段连接先在两个表里分别给该字段做一次“字段计算器”把值统一前后去空格再新建一个文本字段复制一遍确保类型完全一致。连接是动态关联原表更新后连接字段就可能失效。做成图后如果需要把统计结果固化下来可以右键图层“数据—导出数据”把连接结果导成一份新 shp 或要素类。这一步输出的是带灯光强度字段的最终版行政图后续所有制图都基于这份数据。4.3 分级色彩与布局元素从统计表到可交付专题图统计结果挂回属性表后就可以做符号化了。右键图层—属性—符号系统选择“数量—分级色彩”字段下拉里选刚才连接的灯光强度字段例如 SUM 或 MEAN 对应的列配色方案按数据类型选择合适的渐变。这里有一个出图经验如果数据偏态严重少数城市核心区亮度极高、外围大量低值区域建议用“几何间隔”分类而不是“相等间隔”后者会把大部分区域归入最小的一档专题图看起来像一张深色底图。分级数量设置在 5 到 7 类之间比较均衡太少区分度不够太多图例冗长。分类完成后进入布局视图做最终出图视图—布局视图然后通过“插入”菜单依次加入图名、图例、比例尺和指北针。图名直接写“某研究区夜间灯光强度分布”这类业务标题图例只保留灯光强度分级字段别把 name 字段也带进图例。插入比例尺时注意设置合适的单位如果行政范围不大比例尺单位选公里更直观。指北针类型选带 N 标记的简洁样式即可不要用花哨的航海风格保持专题图的信息密度。所有元素放好后导出为 JPG 或 PDF 前先切到布局视图预览一下确认图例没有压住主体图斑比例尺长度合理再输出。5. 问题排查坐标系、NoData、连接字段五个典型翻车点5.1 高频问题速查表做夜间灯光提取与强度计算的过程中下面的问题我基本每次处理新数据都会至少遇到一次列出来方便你对号入座。现象原因修复方式掩膜提取后影像范围还是原始全图环境设置没有指定处理范围地理处理环境里把范围设为与掩膜相同分区统计结果全为 0 或极小值栅格与矢量坐标系不一致先统一坐标系再重跑分区统计连接后灯光字段全为空连接字段类型或值不匹配改用 FID/ObjectID 连接或统一字段类型统计结果与目视判读明显不符统计类型选错选了 FIRST 或含末位字段业务分析使用 SUM 或 MEAN 统计多区域选择漏掉部分区域Or 表达式里中文引号或条件间没加括号改用 IN 写法并检查引号格式5.2 逐条拆解五处最影响结果的细节第一条掩膜范围问题我在前期接触这个流程时踩得很深。当时按掩膜提取跑完输出 tif 加载进来看着是正常的但一做分区统计输出表里的像元数量比行政区内像元数量多了近十倍。原因是环境处理范围没设整个城市的灯光影像全被保留行政边界外的 NoData 黑边在栅格计算时还是占着位置。从那以后我把“处理范围与掩膜一致”当成掩膜提取的必选项跑完后看一眼属性里的范围描述确认输出范围与研究区一致再往下走。第二条坐标系问题最典型的特征是灯光图层和行政图层在地图上叠得严丝合缝但分区统计输出全是 0 或极小值。因为 ArcMap 的动态投影让视觉重叠实际参与计算的栅格像元和区域数据在真实坐标空间里错位绝大多数像元落在行政面之外。修复方法是在分区统计前单独检查两个数据源的“源”选项卡确保投影坐标系 ID 一致。第三条连接字段为空这是动态连接最容易踩的暗坑。上次处理某区县数据时连接完字段在属性表里完全显示但导出后再打开新图层却全空了原因是连接依赖原始表格路径文件移动导致连接失效。解决方式是在导出前把连接结果“物化”成新要素类不要带着动态连接到处转移。第四条统计类型要选对语义。如果只是想把各区的灯光总量对比一下用 SUM如果要比较单位面积灯光密度必须用 MEAN 再结合面积字段做二次计算。有人会误用统计表里的 FIRST 或 LAST 字段这两个字段返回的是该区域内第一个或最后一个被访问的像元值带有随机性完全不能代表区域灯光强度。第五条多区域选取时经常出现在区域列表特别长时手工点选会漏掉某个区县。检查方法是导出后打开研究区属性表统计要素数量是否与计划一致。不一致时直接重做按属性选择表达式里用 IN 比一长串 Or 更不容易出错。6. 进阶用法arcpy 把“提取统计出表”串成半自动流程如果只是单次分析ArcGIS 菜单点击完全够用。但实际项目里往往要处理多个年份、多个研究区每次都重复点同一套工具会非常浪费时间而且手动操作容易漏改参数。arcpy 可以把掩膜提取、分区统计、连接结果一次跑完脚本化之后换数据只需改路径。下面的脚本适合在 ArcGIS Pro 的 Python 窗口或独立 IDE 里运行核心逻辑是先设置环境掩膜再依次执行提取和分区统计。注意脚本里所有路径都用原始字符串写法避免转义问题。import arcpy from arcpy.sa import * # 统一管理路径换数据时只需改这三处 arcpy.env.workspace rD:\nightlight_data arcpy.env.overwriteOutput True light_tif rD:\nightlight_data\light_2024.tif admin_shp rD:\nightlight_data\admin_q.shp extract_path rD:\nightlight_data\light_extract.tif stats_table rD:\nightlight_data\light_stats.dbf # 关键一步环境掩膜直接指定为行政边界 arcpy.env.mask admin_shp arcpy.env.snapRaster light_tif # 执行按掩膜提取输出范围自动与掩膜一致 extract_obj ExtractByMask(light_tif, admin_shp) extract_obj.save(extract_path) print(掩膜提取完成:, extract_path) # 分区统计区域字段用行政区属性表里的名称字段 zone_field name stat_result ZonalStatisticsAsTable( admin_shp, zone_field, extract_path, stats_table, DATA, MEAN ) print(分区统计完成:, stats_table) # 把统计表连接回行政要素并输出带字段的新shp joined_shp rD:\nightlight_data\admin_q_light.shp arcpy.management.CopyFeatures(admin_shp, joined_shp) arcpy.management.JoinField( joined_shp, zone_field, stats_table, zone_field, [MEAN] ) print(最终结果:, joined_shp)脚本里需要注意三个细节一是环境掩膜必须在 ExtractByMask 前设置否则输出范围仍是原栅格范围二是 ZonalStatisticsAsTable 的第五个参数 DATA 表示 NoData 不参与计算这是夜间灯光统计的正确语义三是 JoinField 连接字段的名称必须与区域数据里的字段一致这里用的是 name。脚本跑完后拿输出 shp 的属性表与手动操作结果对比一下。一个可靠的验证方法是在 ArcGIS 里手动选一个面积较小的县区用“按属性选择”单独提取后做一次分区统计手动记录 MEAN 值再和脚本输出表里的同名记录对比。数值一致说明链路完整不一致就优先检查坐标系和字段类型。从那以后我每次拿到新增年份的灯光数据都强制把路径换掉后重跑一遍这套脚本。脚本输出的结果表再进 ArcGIS 做专题图整个流程从一小时缩短到五分钟。希望这篇笔记能把你在夜间灯光提取和强度计算上的弯路省下来。本文还有配套的精品资源点击获取