
简介面向卫星遥感数据处理与GIS应用开发者整合国产高分GF系列、资源ZY系列卫星的绝对辐射定标系数和光谱响应函数覆盖GF-1、GF-2、GF-4、GF-6、ZY-3、ZY1-02C、HJ-1A/B、CBERS-04等常见传感器可用于大气校正、地表参数反演与辐射一致性分析。压缩包共94个文件约1.85MB包含35个txt参数表、30个json配置、10个xls与5个xlsx光谱响应曲线、10个doc定标系数文档、3个pdf年度报告另含1个jpg元数据文件txt与json方便程序直接读取表格与文档便于核对历年定标结果目录按“定标系数/光谱响应函数”分类查找方便。已有156人学习下载适合从事定量遥感、生态环境监测、农业估产等方向的工程师与科研人员使用。附带的资料来自2011—2019年多个年份可直接配合6S辐射传输模型开展大气校正与反射率反演为国产卫星数据应用提供扎实的基础参数支撑。1. 定标系数与光谱响应函数为什么同一块玉米地两颗卫星算出的反射率能差一倍同一片玉米地A 卫星的 L1 级影像反演出的地表反射率是 0.38B 卫星同一周算出来是 0.28。两台传感器看的是同一束太阳光输出的物理量却差了十个百分点——问题不在分类算法不在大气校正参数而在最开头那一步你有没有用对定标系数和光谱响应函数。这个动作看起来只是查表却决定了后续大气校正、植被指数、水质反演整条链路的可信度。国产陆地观测卫星GF、ZY、HJ 等系列发布过多年份的绝对辐射定标系数传感器的光谱响应函数又是一条连续波长与响应关系曲线到底哪年哪台相机用哪组系数SRF 怎么参与波段等效计算把这些底层机制吃透才算真正接住了卫星影像从 DN 值到地表反射率的“第一公里”。这份资源正是把这堆零散文档收敛成一套可编程读取的参数集。2. 绝对辐射定标从 DN 值到辐亮度靠的不只是乘一个系数2.1 线性定标模型gain 和 bias 到底在补偿什么卫星传感器最终输出的不是能量值而是一个无量纲的 DNDigital Number。这个 DN 经历了光电转换、电荷放大、AD 量化、辐射校正等一串环节后和传感器入瞳处的辐亮度之间近似保持线性关系于是有了遥感中最常用的一条定标公式L DN × gain bias这里 L 是入瞳辐亮度单位通常是 W·m⁻²·sr⁻¹·μm⁻¹gain 是系统总增益把 DN 的量化台阶换算回辐射能量bias 是偏置项用来补偿暗电流、电噪声以及定标时刻的零响应偏移。我一般会这么理解这条公式DN 是传感器的“读数”gain 决定这个读数代表多大能量bias 决定“零读数”时仪器是不是真的在接收零能量。实际外场定标时作业人员会在卫星过境瞬间同步测量大片均匀地物的地表反射率、大气光学厚度、水汽含量等参数再通过辐射传输模型正向推算出传感器入瞳处应该看到多少辐亮度和影像 DN 做回归把 gain 和 bias 拟合出来。资源里的 GF1_MSS1.json、GF2_PAN1.json 这一类文件本质上就是这台相机、这个波段组在某次定标作业后算出来的回归结果。明白这一点就不会把定标系数当成一个永恒不变的常数去复用。2.2 增益为什么会漂移一年一标定背后的物理现实卫星在天上飞传感器不是铁板一块。紫外和可见光波段的窗口材料在轨受到原子氧侵蚀、污染膜沉积、高能粒子辐照探测器的量子效率也会随累积辐照剂量缓慢退化。反映到数值上就是同一个地表目标发射第一年和在轨五年后测得的 DN 可能明显偏低如果还拿发射前的实验室定标系数去换算反演出的反射率会系统性偏小。这也就是为什么这份资源里能看到 2011、2012、2013……一直到 2019 年各有独立文档的原因。定标系数不是一组静态参数它带着显式的时间维。处理影像前先看数据的接收日期再去资源里挑一个“时间口径”最接近的定标文件这才叫用对了系数。早期高分卫星发射后的一年内定标频次较密后期趋于稳定后基本以年度外场定标为主中间还会穿插交叉定标来监控短期漂移。2.3 文档命名里的信息年份、卫星、载荷如何对号入座这套资源的组织方式对老手很友好对新手却容易看晕。先看文档类的定标系数2014年国产陆地观测卫星绝对辐射定标系数GF-1, ZY-3, ZY-1 02C, SJ-9A, HJ-1AB.doc文件名里其实浓缩了三层信息——定标年份、覆盖卫星、大致载荷范围。再看 JSON 和 TXT 这类逐传感器参数文件命名规律是“卫星号_载荷号”GF1_MSS1.json 就是高分一号的多光谱相机 1GF2_PAN1.json 是高分二号的全色相机 1。下面这张表可以帮助快速建立载荷缩写和实际传感器之间的对应关系文件前缀载荷含义典型空间分辨率GF1_MSS多光谱相机8 mGF1_WFV宽幅相机16 mGF1_PAN全色相机2 mGF2_PMS / PAN全色多光谱相机1 m / 4 mGF4_PMS / IRS凝视相机 / 红外相机50 m / 400 mZY3_MSS三线阵多光谱5.8 mHJ1A_CCDCCD 相机30 m还有一点容易忽略同名文件有时候会同时出现 .json 和 .txt 两个扩展名比如 GF1_WFV1.json 与 GF1_WFV1.txt 成对出现。它们内容的物理含义基本一致差异在格式上——JSON 适合程序读取TXT 适合快速人工查看和文本处理。实际工程里如果两套文件同时存在我会以 JSON 作为程序读入源用 TXT 做人工核对避免两边数值不一致时无从溯源。3. 光谱响应函数你真以为“蓝波段”是一条线3.1 SRF 到底记录了什么很多人提波段下意识认为它是一条细线比如“蓝波段中心波长 485 nm”好像传感器只接收 485 nm 一个波长的光。真实情况远不是这样。传感器的每个波段像是戴了一副有颜色的眼镜对不同波长的光响应权重不同。光谱响应函数 SRF 描述的就是这个权重横坐标是波长纵坐标是归一化响应值通常在 0 到 1 之间。它可能在中心波长处逼近 1两侧缓慢衰减甚至带上旁瓣。打开资源里的 HJ1A_CCD1-光谱响应函数.txt典型的两列数据就是波长和响应值。资源里同时给出 xls 版本是因为实验室测量出来的原始 SRF 往往还要做平滑、归一化和单位换算Excel 表格方便人检查曲线形状。你要把 SRF 当什么用直接决定选哪个格式——写代码遍历波段积分时用 TXT 最顺手放进配置系统里用 JSON 最合适画响应曲线做技术报告时 xls 最方便。很多人跳过了看 SRF 形状这一步直接把中心波长当成矩形波段去算这是后续一系列误差的起点。3.2 用 SRF 做波段等效反射率6S 模型怎么消化这份数据光谱响应函数真正的价值在于“压缩光谱”。一块地表有连续的光谱反射率曲线 ρ(λ)但卫星只在几个波段上成像每个波段记录的实际上是整段光谱按 SRF 加权后的积分效果。波段等效反射率的标准算法如下ρ_band ∫ ρ(λ) × SRF(λ) dλ / ∫ SRF(λ) dλ分母是对 SRF 自身积分做归一化分子是地表光谱与响应函数的加权积分。这样做的物理含义是传感器看到的反射率不是地物在某个波长上的反射率而是地物光谱经过传感器这个“滤镜”之后的平均效果。理解这一点就能解释为什么同一个载荷的两个相机白平衡看起来会不同——GF-1 的 WFV1 和 WFV4 虽然都叫多光谱但各自的 SRF 峰值位置和带宽并不完全一致。用 Python 落地这个过程时核心逻辑其实就几行import numpy as np def band_equivalent_reflectance(rho_spectrum, wl_grid, srf_wl, srf_val): # 把SRF插值到地表光谱的波长网格上防止采样点错位 srf_interp np.interp(wl_grid, srf_wl, srf_val) # 分子光谱与SRF的加权积分分母SRF自身的积分 numerator np.trapz(rho_spectrum * srf_interp, wl_grid) denominator np.trapz(srf_interp, wl_grid) return numerator / denominator理解这段代码的关键在分母。如果只算分子不除以 SRF 积分带宽更宽的波段会天然得到更大的加权值但这个值并不是传感器真正输出的等效反射率。归一化把不同波段的响应强度拉平到同一个尺度上保证“同等亮度、同等光谱形状”的目标在不同传感器上读出接近的反射率。6S 这类辐射传输模型在计算大气路径辐亮度时也需要逐波长模拟太阳光谱穿过大气的过程再跟 SRF 做同样的加权积分才能得到传感器真正会看到的表观信号。所以整理出来的国产卫星 SRF不只是给人看的曲线它是定量遥感反演里不可绕过的输入。3.3 中心波长相同不代表能混用SRF 的形状差异这份资源里同时能看到 GF 系列、ZY 系列、HJ 系列的光谱响应函数其中很容易踩一个逻辑陷阱觉得“反正大家都是蓝波段中心波长差不多互相替代没问题”。实际上不同载荷的 SRF 带宽和旁瓣位置差异很大。一个典型的例子是植被遥感里的红边波段叶绿素在 680750 nm 之间的反射率变化极其剧烈SRF 峰值哪怕偏移 5 nm算出来的归一化植被指数 NDVI 可能差出 0.05 以上。这个量级的误差足以让同一块农田在不同卫星的监测报告里被分成“长势好”和“长势一般”两档。所以 SRF 的使用原则是哪个传感器出的影像就必须用哪份 SRF宁可文件里只有中心波长也不能拿别的传感器的响应曲线硬套。资源里每份 SRF 文件都精确到具体的卫星和相机编号正是为了堵住“近似混用”这个漏洞。4. 工程化落地JSON 配置、程序读取与 6S 输入组装4.1 先把定标参数变成可运行的代码有了 JSON 格式的定标参数整条辐射定标流程就能从“手抄文档”变成“读配置”。以资源里典型的 GF1_WFV4.json 为例整理后的内容大体是这种结构{ satellite: GF-1, sensor: WFV4, calibration_year: 2017, bands: [ { band: B1, wavelength_um: 0.485, gain: 0.1817, bias: -0.0021 }, { band: B2, wavelength_um: 0.555, gain: 0.1984, bias: -0.0030 } ] }import json import numpy as np def dn_to_radiance(dn_image, config_path): with open(config_path, r, encodingutf-8) as f: cfg json.load(f) rad np.zeros(dn_image.shape, dtypenp.float32) for i, band_cfg in enumerate(cfg[bands]): gain band_cfg[gain] bias band_cfg.get(bias, 0.0) # 部分JSON没有bias字段时兜底 rad[..., i] dn_image[..., i].astype(np.float32) * gain bias return rad这段代码里有几个工程细节值得展开。第一band_cfg.get(bias, 0.0)不是偷懒是因为资源里不同年代的整理者对 bias 的保留习惯不一致有的 JSON 只给了 gain强行读取会直接 KeyError 翻车。第二辐亮度计算要先把 DN 转成 float32因为原始 DN 一般是 uint16乘增益后容易溢出或损失精度。第三输出数组保持和输入相同的波段顺序后续做表观反射率或 6S 大气校正时波段顺序必须和 SRF 文件里的顺序严格对应这是配置化设计能顺畅跑起来的前提。4.2 算完先别急着用定标结果的三条自检标准程序写完不等于能出可靠结果。每次做完 DN 到辐亮度的换算我会强制做三个快速体检任何一个不过说明定标系数选错了。第一个是找影像里的暗像元比如深湖水、山体阴影辐亮度应该接近 0 但不应该为负数如果出现大面积负值多半是 bias 用错了符号或者增益系数张冠李戴。第二个是看常见地物的表观反射率是否落在合理区间植被绿波段一般在 0.050.15水体在蓝绿波段偏低而近红外接近 0裸土在红波段明显抬升。如果一片茂密森林的近红外反射率算出来只有 0.02基本可以断定系数选错或波段顺序搞反了。第三个是检查辐亮度量级对于 0.10.3 反射率的地表入瞳辐亮度在可见光近红外波段通常在 10100 W·m⁻²·sr⁻¹·μm⁻¹ 量级。量级差出十倍以上先查单位而不是查公式。这三条自检都不依赖现场数据拿着影像本身就能做是遥感数据到手后最便宜的保险。4.3 把 SRF 组装给 6S一条完整的反演前链路6S 模型的输入是几何、大气、气溶胶、传感器和地表五个模块其中传感器模块最关键的就是 SRF。6S 自带了一批国际常用卫星的 SRF国产卫星基本不在默认库里所以需要手动喂数据。组装过程分成三步先读取资源里对应传感器的 SRF 文件再把离散的波长和响应值插值到 6S 要求的波段网格上最后按 6S 的输入格式写入波段响应向量。下面是一段示意性的参数组装s6_input { geometry: {solar_zenith: 32.0, view_zenith: 5.0, rel_azimuth: 120.0}, atmosphere: {model: midlatitude_summer, aerosol: continental, visibility_km: 23.0}, target: {altitude_km: 0.2, surface_type: lambertian}, spectral: {srf_bands: srf_b1, srf_response: srf_val}, calibration: {gain: gain, bias: bias} }组装这些参数的时候要脑子里有一条完整的数据链DN 先经定标系数变成辐亮度辐亮度结合太阳天顶角和日地距离变成表观反射率表观反射率进入 6S 后由辐射传输方程剥离大气影响输出地表真实反射率。SRF 在这条链里出现了两次——一次是在计算波段等效表观反射率时一次是在 6S 内部模拟大气对每个波长的衰减时。两处用的必须是同一份 SRF否则 6S 模拟的大气路径与传感器真实看到的信号就会对不上这也是很多人把 6S 参数填得很完整但结果依旧离谱的根源。5. 避坑排查定标系数与 SRF 使用中的高频翻车现场5.1 载荷编号搞混WFV1 的系数处理 WFV2 的影像现象某验证项目里用 WF1_WFV1.json 的定标参数处理 WFV2 相机拍的影像算出的 NDVI 整体偏低和同期地面实测光谱对比差异明显。原因GF-1 的四个宽幅相机 WFV1WFV4 是独立的光学系统各自的增益、偏置、光谱响应都不完全相同资源里也明确按 WFV1、WFV2、WFV3、WFV4 分开存储。混用的系数相当于拿 A 相机的电子学特性去解读 B 相机的信号误差不是噪音是系统性偏置。解决处理前先看影像元数据的 Sensor ID再和 JSON 文件前缀严格比对自动化批量处理时在脚本里加一道断言文件名中的传感器编号必须与影像元数据一致不一致直接拒绝运行。5.2 定标年份与影像时相不匹配现象用 2014 年的定标系数处理 2018 年接收的 GF-1 影像暗像元看起来正常但亮地物反射率普遍偏高约 7%。原因传感器增益随在轨时间单调漂移2014 年系数里记录的增益已经不适合 2018 年的探测器状态。资源把定标系数按年份拆分本质上就是在说“这是一个时间敏感参数”。解决以影像接收日期为准挑选距离最近的年度定标文件如果处理跨度超过一年的影像序列逐景检查每景数据对应的接收年份不能图省事统一套一份系数。5.3 波长单位混用nm、μm、Å 之间的数量级灾难现象把 HJ1A_CCD1 的 SRF txt 读进程序后和 GF 系列的 JSON 波段配置做拼接结果波长轴完全对不上部分波段权重全落到零。原因这份资源里 txt 文件的波长单位不统一有的用纳米有的用微米而 JSON 里统一用微米。肉眼看不出来程序按数值直接计算时0.485 和 485 差了整整一千倍。解决读取任何一份 SRF 文件后先检查波长列的数值范围大于 100 的按纳米换算成微米在公共读取函数里强制做一次单位归一化并打印换算后的波长范围供人工复核。5.4 负 bias 被当成绝对值处理现象某次反演水质参数时水体暗像元辐亮度全部被抬高了 0.002 左右导致透明度反演结果系统性偏小。原因定标公式里的 bias 在物理上可以是负值它代表 DN 为零时传感器的真实响应偏移。整理成 JSON 后有些字段保留负号有些整理版本却写了正数代码里如果对 bias 取了 abs()等于人为抹掉了这个偏移。解决严格按照 L DN × gain bias 计算bias 一律按原始符号读入自检暗像元时对水体像元辐亮度做统计正常情况应接近零而略偏正若出现固定正向偏移回头检查 bias 符号。5.5 JSON 字段名不统一导致批量解析失败现象批量处理多个卫星文件时A 文件读取正常B 文件报 KeyError排查发现字段名一个是 gain一个是 gain_coef。原因这份资源是几位开发者跨年份整理的不同时期整理的文件字段命名没有完全统一属于典型的“半结构化数据”。解决封装解析函数时做一层字段映射兼容 gain、gain_coef、coef 等常见命名对未知字段做白名单日志输出既能定位问题又不会中断批量流程。6. 设计取舍一手标定文档、机器可读格式与可验证的反演链这套资源最值得琢磨的不是某个具体系数而是它的组织方式官方原始定标材料以 doc、pdf、xls 为主整理者把它们归一成 JSON、TXT、XLS 三套并存的形态。这背后其实是一个工程取舍——JSON 丢掉了很多非结构化信息比如定标场地的气象条件、处理说明、外场测量人员备注这些信息对追溯系数质量是有价值的但纯 JSON 带来的好处是程序化访问、跨语言解析、批量校验。我一般会这么看待这个设计它把“科学文档”变成了“软件资产”牺牲一部分叙事性换取整个反演链路的可重复性。另一个取舍在定标系数的选择口径上。资源里收敛的是“绝对辐射定标系数”意味着它直接对应 DN 到辐亮度这一层物理转换而日常生产中还有一类相对定标系数用于消除传感器各探元之间的响应不一致。两者用途完全不同用错会把条带噪声消除和辐射定标混为一谈。整理者选了前者说明这个资源定位在绝对物理量恢复而不是 L1 级辐射校正预处理。真正用好这套数据建议把验证动作固化成习惯每一景影像在进入业务反演前先跑完当年定标系数、SRF 波段等效计算、暗像元体检三条链路确认反射率量级合理后才交给下游算法。六年前我第一次用国产卫星做长时间序列分析时因为图省事统一套了同一份定标系数结果整个序列的植被指数趋势被增益漂移污染返工了整整一周。从那以后我每次拿到新的卫星数据集都强制先做一次“系数-时相-传感器”三者一致性检查再谈反演。希望帮到你。本文还有配套的精品资源点击获取