简介:围绕常见遥感卫星参数与发展现状整理的PDF文档,面向遥感、GIS、环境监测与灾害评估领域的学习者和从业者,帮助快速建立SPOT、Landsat、Sentinel、JERS、ENVISAT、RADARSAT、ALOS、IRS等卫星的系列划分、参数要点与应用场景认知。压缩包内共1个PDF文件,约642KB,篇幅集中、便于检索,目录按国外常用卫星资料与中国地球观测遥感卫星发展现状组织,并延伸至陆地遥感、气象遥感等方向。已有412人学习或下载,适合课程学习、项目选星和资料查阅时对照使用。内容侧重梳理各卫星的发射时间、国别归属、主要任务、数据类型与观测能力,读者可据此快速比较不同数据源,补充遥感基础认知,也能为环境监测、灾难评估和资源管理等应用提供参数索引与查阅线索;对初次接触遥感数据源、需要快速索引卫星基本信息的读者较为友好。
1. 一份四十多页的遥感卫星参数速查表,为什么值得放在手边
上个月接了个农业监测的模拟项目,要求两周内把一套 NDVI 时序流程跑通。第一版方案我翻了三天官方 user guide,光确认 Sentinel-2 的 B8A 到底算不算 10 米波段就折腾了两个来回。后来同事甩过来一份四十多页的《常见遥感卫星参数》汇总文档,Sentinel、Landsat、SPOT、JERS、ENVISAT、RADARSAT、ALOS、IRS 加上国内陆地、气象、海洋三类卫星的轨道、传感器、波段表、产品分级和数据政策,全挤在一个文件里,选型问题一张表就能压下去。这份遥感卫星参数资料适合正在做数据源比选、影像预处理流程搭建、要写团队选型规范的遥感与 GIS 从业者,也适合刚接触多源数据、被波段编号和产品级别绕晕的新手。它不教你写算法,但能让你少在“这颗星到底能不能用”上浪费一周。
2. 参数表的四层结构:轨道、传感器、波段、产品级别
一份合格的卫星参数汇总,信息是按“能不能用 → 拍什么 → 拍多细 → 数据能不能直接算”这个顺序组织的。读的时候如果从上往下顺着翻,很容易陷进具体数字里;我一般的习惯是先跳到最后看产品级别,再倒回来确认轨道和传感器,最后才抠波段。下面按这四层拆。
2.1 轨道层:高度、倾角与重访先把可选范围框死了
选数据源最容易犯的错,是一上来就比空间分辨率。实际上轨道的三个数字先决定了你能拿到什么:高度决定单轨幅宽和分辨率的平衡点,倾角决定覆盖纬度上限,重访周期决定时间序列的采样密度。表里 Sentinel 系列这几个数字放在一起看,逻辑就很清楚。
| 卫星 | 轨道高度 | 倾角 | 重访周期 | 轨道类型 |
|---|---|---|---|---|
| Sentinel-1 | 693 km | 98.18° | 12 天(双星互补 6 天) | 太阳同步 |
| Sentinel-2 | 786 km | 98.5° | 10 天(双星互补 5 天) | 太阳同步 |
| Sentinel-3 | 814 km | 98.65° | 27 天(OLCI 全球 2 天) | 太阳同步 |
| Sentinel-4 | 约 35786 km | — | 约 60 分钟 | 地球静止 |
| Sentinel-5P | 824 km | 98.742° | 1 天 | 太阳同步 |
| Sentinel-6 | 1336 km | 66° | 10 天 | 非太阳同步 |
倾角略大于 90° 意味着逆行轨道,配合固定的降交点地方时,同一轨道的太阳高度角在一年内的波动被压得很小。这对多时相 NDVI、地表反射率这类需要“同光照条件对比”的应用是硬需求——如果光照角度每次差 20°,阴影和 BRDF 效应能把植被指数搅成一团玄学。反过来说,Sentinel-6 用 66° 倾角、1336 km 高度,是因为测高任务只关心海面高度,不需要稳定光照,反而要覆盖到较高纬度的海面,轨道设计就完全换了一套思路。
高度还直接和幅宽、分辨率绑在一起。693 km 的 Sentinel-1 在 IW 模式下做到 250 km 幅宽、5 m×20 m 分辨率;786 km 的 Sentinel-2 幅宽 290 km、最高 10 m 分辨率;814 km 的 Sentinel-3 为了全球 2 天覆盖,把 OLCI 的空间分辨率放到 300 m。轨道高度、幅宽、分辨率、重访这四个量互相牵制,没有哪个任务能四项全占,参数表的价值就在于让你在五分钟内看清这颗星牺牲了哪一项。
有一条实操经验:先确认目标区域的纬度,再去看倾角和轨道重叠。低纬度地区轨道重叠少,实际重访接近标称值;中高纬度相邻轨道有重叠,同一区域可能在两三天内被扫到两次,做时序时这一点会让采样间隔变得不均匀,别把标称重访当成均匀采样周期。
2.2 传感器层:主动微波、多光谱、辐射计、高度计各管一摊
轨道看的是“什么时间能拍到你”,传感器看的是“拍到了能算什么”。参数表里 Sentinel 系列的传感器类型分类很干脆:Sentinel-1 是 C 频段合成孔径雷达,Sentinel-2 是多光谱成像仪,Sentinel-3 挂了一组载荷(海陆表面温度辐射计、海洋陆地色彩仪、合成孔径雷达高度计等),Sentinel-4 是紫外可见近红外扫描光谱仪,Sentinel-5P 是多光谱对流层监测仪器,Sentinel-6 是 Ku/C 波段 nadir 指向的合成孔径雷达高度计。
| 传感器类型 | 观测对象 | 关键参数 | 主要限制 |
|---|---|---|---|
| C 频段 SAR(Sentinel-1) | 地表后向散射、相位、形变 | 中心频率 5.405 GHz,带宽 0–100 MHz,峰值功率 4.368 kW | 几何畸变、斑点噪声、需要 DEM 正射 |
| 多光谱成像仪(Sentinel-2) | 可见光—近红外—短波红外反射率 | 13 波段,12 bit 辐射量化,幅宽 290 km | 受云影响,需大气校正 |
| 成像光谱仪(OLCI) | 海洋水色、植被、大气 | 21 波段,400–1040 nm,300 m/1.2 km | 幅宽大但分辨率粗,混合像元严重 |
| 双视图扫描辐射计(SLSTR) | 海陆表面温度、火点 | 太阳反射波段 500 m,热红外 1 km,双视图大气校正 | 热红外波段受水汽影响,需劈窗算法 |
| 雷达高度计(SRAL) | 海面高度、有效波高 | Ku/C 波段 nadir 指向 | 只沿星下点轨迹,空间覆盖是线状 |
| 痕量气体光谱仪(TROPOMI) | 臭氧、二氧化氮、气溶胶 | 高光谱,日覆盖全球 | 空间分辨率公里级,像元内混合严重 |
SAR 和光学的差别不只是“穿不穿云”。SAR 的相位是可以拿来做干涉测量的,Sentinel-1 的 IW 模式两景影像做 InSAR,形变监测精度能到毫米级每年,这是光学影像给不了的信息。代价是 SAR 的几何是斜距成像,山区的叠掩、透视收缩必须拿 DEM 做正射校正,而且斑点噪声会让分类算法表现和光学完全不同——同一块农田,光学上是一条干净的 NDVI 曲线,SAR 上是一团需要多时相滤波才能稳住的时序。
被动光学的限制写在参数里但常被忽略:辐射分辨率和信噪比。Sentinel-2 是 12 bit 量化,辐射精度优于 5%,这个指标决定了你在做暗目标(水体、阴影)提取时的下限。如果目标反射率变化只有 1%–2%,量化噪声和大气校正残差很容易把它淹没。
2.3 波段层:中心波长和带宽决定了你能反演什么
波段表是整份文档里信息密度最高的部分,也是最容易被跳过、然后在预处理阶段翻车的部分。Sentinel-2 的 13 个波段分布很有代表性:
| 波段 | 中心波长 | 带宽 | 原生分辨率 | 主要用途 |
|---|---|---|---|---|
| B1 | 443 nm | 20 nm | 60 m | 海岸/气溶胶 |
| B2 | 490 nm | 65 nm | 10 m | 蓝 |
| B3 | 560 nm | 35 nm | 10 m | 绿 |
| B4 | 665 nm | 30 nm | 10 m | 红 |
| B5 | 705 nm | 15 nm | 20 m | 植被红边 |
| B6 | 740 nm | 15 nm | 20 m | 植被红边 |
| B7 | 783 nm | 20 nm | 20 m | 植被红边 |
| B8 | 842 nm | 115 nm | 10 m | 近红外 |
| B8A | 865 nm | 20 nm | 20 m | 窄近红外 |
| B9 | 945 nm | 20 nm | 60 m | 水汽 |
| B10 | 1375 nm | 20 nm | 60 m | 卷云 |
| B11 | 1610 nm | 90 nm | 20 m | 短波红外 |
| B12 | 2190 nm | 180 nm | 20 m | 短波红外 |
10 米只有 4 个(B2、B3、B4、B8),20 米 6 个,60 米 3 个。这个分组不是随便定的,它对应的是传感器的物理设计:多光谱推扫式成像仪要在幅宽和信噪比之间做平衡,宽波段能收集更多光子、支持更高的空间分辨率,窄波段则用来捕捉特定的吸收特征。B8 带宽 115 nm,做 NDVI 时信噪比好但容易受水汽吸收干扰;B8A 带宽只有 20 nm,避开 940 nm 附近的水汽吸收带,更适合做需要精确反射率的定量反演。两个都能算 NDVI,数值会有系统性差异,混用会让时序曲线出现台阶。
红边三个波段(705、740、783 nm)是 Sentinel-2 相对 Landsat 系列的优势所在。红边位置对叶绿素含量敏感,做作物长势、氮素诊断时,红边指数比单纯的 NDVI 更早饱和。但红边波段都是 20 米分辨率,想要 10 米结果就得做融合或者降尺度,这一步会把误差带进来。
Sentinel-3 的 OLCI 是另一个极端:21 个波段,光谱范围 400–1040 nm,波段宽度普遍在 2.5–40 nm 之间,为水色反演设计。Oa11(708.75 nm,带宽 10 nm)是叶绿素荧光基线,Oa17(865 nm,带宽 20 nm)用于云检测和气溶胶校正,Oa12(753.75 nm)落在氧气吸收带上。这类窄波段对波段位置精度要求极高,如果自己做波段运算时把中心波长记错 2 nm,反演结果就可能整片跑偏。SLSTR 则把通道分成两组:S1–S6 是 500 米太阳反射波段(含 1374.8 nm 卷云通道、1613.4 nm 和 2255.7 nm 短波红外),S7–S9 和 F1、F2 是 1 km 热红外通道,用于海表温度和火点辐射功率。
2.4 产品层:L1C 和 L2A 之间差着一次大气校正
很多人选完卫星、查完波段就以为结束了,真正决定工作量的其实是产品级别。Sentinel-2 从 L0 到 L2A 的分级很典型:L0 是仪器源数据包,不对外发布;L1A 解压后能定位像素;L1B 做了辐射校正(暗信号、像素响应不均、串扰、坏像元插值、60 米波段升采样);L1C 用 DEM 做正射投影,转成大气顶反射率,重采样到 10/20/60 米固定网格,附带云掩膜和 ECMWF 辅助数据,但没做大气校正;L2A 才是大气底反射率,附带场景分类图。
| 产品 | 几何 | 辐射 | 是否含云掩膜 | 直接可用性 |
|---|---|---|---|---|
| L1C | 正射,10/20/60 m 网格 | 大气顶反射率(TOA) | 有 | 需自行大气校正 |
| L2A | 正射,同网格 | 大气底反射率(BOA)+ 场景分类 | 有(SCL) | 可直接做指数计算 |
Sentinel-1 的分级逻辑不同,因为它有相位。L0 是原始回波;SLC 是带相位的斜距几何复数影像,用于干涉和极化分析;GRD 是多视、检波、投影到 WGS84 椭球的地距影像,只保留强度,适合做分类和变化检测;OCN 是二级海洋产品,包含风场、波浪谱和表面径向速度。选错这一层,后面的活基本白干——拿 GRD 去做 InSAR 是不可能出结果的,相位在检波那一步就丢了。
Sentinel-3 还有个时间维度上的分级:NRT 近实时产品在采集后三小时交付,NTC 非实时产品一个月后交付,文件后缀用 NR 和 NT 区分。做应急监测只能用 NRT,做气候分析用 NTC 更稳,因为后者用的辅助数据(精密轨道、改进的大气校正参数)更完整。
3. 从参数到选型:四个决策场景与一张对照表
参数表看得再熟,落到具体项目还是要做取舍。下面四个场景是我在模拟项目里反复遇到的,基本覆盖了多源数据选型的主要矛盾。
3.1 光学还是 SAR:先问“云”和“夜”
这个问题的答案不在参数表里,在项目所在区域的气候统计里。Sentinel-1 是 C 频段 SAR,全天时全天候成像,参数表里明确写了它能为陆地和海洋提供全天时全天候的雷达图像,覆盖北极海冰、日常海冰测绘、海洋环境监视、地面形变风险监测。Sentinel-2 是多光谱被动成像,云层遮挡直接导致数据不可用。
判断方式很朴素:如果目标区域全年无云窗口少于 30%,或者项目要求周级甚至更密的更新频率,光学单打独斗一定会卡住。反过来说,如果任务只需要植被指数和土地覆盖分类,SAR 的处理链路(斑点滤波、地形辐射校正、极化分解)会带来额外的工程成本,而光学数据的物理意义更直观,模型也更容易迁移。
我这里有一条血泪经验:不要用“SAR 能穿云”作为唯一理由去选 SAR。穿云只是拿到数据,拿到之后能不能解释清楚后向散射系数的变化才是关键。同一块地,土壤湿度变化、地表粗糙度变化、植被结构变化都会影响后向散射,如果不做多时相和多极化联合分析,SAR 影像看上去就是一片灰度噪声。
真正需要 SAR 的场景是形变监测。干涉宽幅模式两景影像做差分干涉,能检测到每年几毫米的地表运动,用于地面沉降、结构损坏、地下施工监测。这类应用光学完全替代不了,因为光学只能看到表面纹理,看不到几何位移。
3.2 分辨率与幅宽是一道乘法题
很多人比参数时只盯空间分辨率,忽略了幅宽,结果算数据量的时候才发现单景影像大得离谱。这里有个简单的估算法:像素总数 =(幅宽 / 分辨率)²。
Sentinel-2 单景 290 km × 290 km,10 米波段是 29000 × 29000 ≈ 8.4 亿像素,4 个 10 米波段加起来 33.6 亿像素;20 米波段 14500² × 6 ≈ 12.6 亿像素;60 米波段 4833² × 3 ≈ 0.7 亿像素。按 12 bit 存成 16 bit 算,单景未压缩数据接近 9–10 GB 量级。这意味着一个县级的时序分析,光原始数据就能上 TB,不做分块和云过滤直接读进内存,机器会当场翻车。
Sentinel-1 的 IW 模式幅宽 250 km,分辨率 5 m × 20 m,SLC 产品是复数(实部虚部各 2 字节),单景量级也在 GB 以上。EW 模式幅宽 410 km,分辨率 20 m × 40 m,适合海冰、极地和溢油监测,但幅宽大了分辨率就掉了 4 倍,做小目标检测会明显吃力。
| 模式 | 幅宽 | 分辨率 | 入射角范围 | 典型用途 |
|---|---|---|---|---|
| SM(条带) | 80 km | 约 5 m × 5 m | 18.3°–46.8° | 小岛屿成像、应急支持 |
| IW(干涉宽幅) | 250 km | 5 m × 20 m | 29.1°–46.0° | 陆地主力模式 |
| EW(超宽幅) | 410 km | 20 m × 40 m | 18.9°–47.0° | 海冰、极地、溢油 |
| WV(波模式) | 20 km × 20 km | — | 21.6°–25.1° 或 34.8°–38.0° | 公海波浪谱 |
这四个模式的取舍逻辑很清楚:幅宽和分辨率成反比,入射角范围决定了地形起伏区的几何畸变程度。山区选 IW 的 IW1 子条带(入射角 30.86°–36.59°)比 IW3(41.75°–46.00°)叠掩少,因为入射角小,透视收缩弱。这种细节在参数表的子条带入射角表格里能查到,但需要你主动去翻。
3.3 重访周期不等于你能拿到的过境次数
参数表里 Sentinel-1 写“12 天(两星互补 6 天)”,Sentinel-2 写“10 天(两星互补 5 天)”,这两个数字很容易被当成“每 6 天 / 每 5 天一定能拿到一景”。实际差得远。
首先,双星互补的前提是两颗星都在轨正常工作,一旦其中一颗退役或降级,重访立刻退回单星水平。其次,重访是轨道回归周期,指的是卫星回到同一星下点的时间间隔,但实际能不能拍到你的区域,取决于幅宽覆盖和成像计划。Sentinel-1 的 IW 模式主要在陆地上采集,海上默认用 WV 波模式,一个 20 km × 20 km 的小条带,沿轨间隔 100 km、同入射角间隔 200 km——这意味着你在海上拿到的不是连续影像,而是一串点。第三,云量和数据可用性会进一步稀释有效观测。
我做时序分析时一般不看标称重访,而是直接在检索服务里查目标区域过去一年的实际可用影像列表,按相对轨道号分组。同一相对轨道号的影像入射角一致、几何一致,做变化检测最稳;混用不同轨道号的影像,入射角差几度就会带来后向散射或反射率的系统偏差,看起来像是地表变化,其实是几何差异。这一步是很多人时序曲线抖动的真正原因。
3.4 把七八个系列压成一张选型卡
参数表里还有 Landsat 系列、SPOT 系列、JERS、ENVISAT、RADARSAT、ALOS、IRS 以及国内陆地、气象、海洋三类卫星。这么多系列,不可能每次都从头翻,我的做法是压成一张选型卡,每个系列只留四个字段。
| 系列 | 观测类型 | 分辨率量级 | 重访量级 | 适用判断 |
|---|---|---|---|---|
| Sentinel-1 | C 波段 SAR | 5–40 m | 6–12 天 | 形变、海冰、全天候监测 |
| Sentinel-2 | 多光谱 13 波段 | 10–60 m | 5–10 天 | 植被、土地覆盖、农业 |
| Sentinel-3 | 水色/温度/高度计 | 300 m–1.2 km | 1–2 天 | 大尺度海洋、气候 |
| Sentinel-5P | 痕量气体 | 公里级 | 1 天 | 空气质量、大气成分 |
| Sentinel-6 | 雷达高度计 | 星下点 | 10 天 | 海面高度、波高 |
| Landsat 系列 | 多光谱 | 中分辨率 | 中长周期 | 长时序、历史对比 |
| SPOT 系列 | 高分辨率光学 | 米级—十米级 | 数天 | 精细地物、变化检测 |
| RADARSAT | SAR | 米级—数十米 | 数天 | 海冰、溢油、灾害 |
| ALOS / JERS | 多光谱 / SAR | 十米级 | 数十天 | 历史存档、区域制图 |
这张卡的作用不是替代详细参数,而是在需求评审的前五分钟内给出方向。真正开始建流程时,再回到详细表格里抠波段、入射角、极化方式和产品级别。选型卡我一般会写进项目的 README,改一次需求就更新一次,比每次开会重新讨论快得多。
4. 把参数表接进工程:三个脚本让文档变成校验器
参数表放在 PDF 里只能查,放进代码里才能校验。下面三段脚本是我在每个影像处理项目开头都会跑一遍的,作用是把文档里的静态数字变成可执行的断言。
4.1 把波段表建成可查询的字典
第一步是把 Sentinel-2 的 13 个波段抄成结构化配置。手抄一次比每次查文档快,也方便后面做自动化。
# Sentinel-2 MSI 波段配置:cw 中心波长(nm),bw 带宽(nm),gsd 原生地面采样距离(m) S2_MSI = { "B01": {"cw": 443.0, "bw": 20.0, "gsd": 60, "name": "coastal_aerosol"}, "B02": {"cw": 490.0, "bw": 65.0, "gsd": 10, "name": "blue"}, "B03": {"cw": 560.0, "bw": 35.0, "gsd": 10, "name": "green"}, "B04": {"cw": 665.0, "bw": 30.0, "gsd": 10, "name": "red"}, "B05": {"cw": 705.0, "bw": 15.0, "gsd": 20, "name": "red_edge_1"}, "B06": {"cw": 740.0, "bw": 15.0, "gsd": 20, "name": "red_edge_2"}, "B07": {"cw": 783.0, "bw": 20.0, "gsd": 20, "name": "red_edge_3"}, "B08": {"cw": 842.0, "bw": 115.0, "gsd": 10, "name": "nir"}, "B8A": {"cw": 865.0, "bw": 20.0, "gsd": 20, "name": "nir_narrow"}, "B09": {"cw": 945.0, "bw": 20.0, "gsd": 60, "name": "water_vapour"}, "B10": {"cw": 1375.0, "bw": 20.0, "gsd": 60, "name": "cirrus"}, "B11": {"cw": 1610.0, "bw": 90.0, "gsd": 20, "name": "swir_1"}, "B12": {"cw": 2190.0, "bw": 180.0, "gsd": 20, "name": "swir_2"}, } def bands_at(gsd, table=S2_MSI): """按原生分辨率筛波段,避免把 60 m 波段当 10 m 用""" return sorted([b for b, v in table.items() if v["gsd"] == gsd]) def nearest_band(wavelength_nm, table=S2_MSI): """按中心波长找最近波段,绕过 B08/B8A 这类编号陷阱""" band, meta = min(table.items(), key=lambda kv: abs(kv[1]["cw"] - wavelength_nm)) return band, meta["cw"], meta["bw"] print(bands_at(10)) # ['B02', 'B03', 'B04', 'B08'] print(nearest_band(860)) # ('B8A', 865.0, 20.0)这段代码的关键是三个字段的含义。cw是中心波长,决定这个波段响应哪个物理过程;bw是带宽,决定光谱分辨能力,B08 的 115 nm 和 B8A 的 20 nm 差着一个数量级,做窄吸收特征分析时不能互换;gsd是原生地面采样距离,注意是“原生”,不是产品文件里重采样后的网格大小。bands_at用来在拼接前确认哪些波段本来就该是 10 米,nearest_band用来处理不同传感器之间的波段对齐——比如要把 Landsat 的某个波段映射到 Sentinel-2,按波长找比按序号找靠谱得多。
4.2 用 rasterio 校验真实影像的波段数与分辨率
抄完表,下一步是拿真实文件对一遍。这一步能提前暴露下载错产品、解压错目录、波段顺序错乱这三类问题。
import rasterio from pathlib import Path def inspect_s2(path): """检查单景 Sentinel-2 影像的波段数、分辨率、坐标参考与像元类型""" with rasterio.open(path) as ds: info = { "count": ds.count, "crs": str(ds.crs), "res": ds.res, # (x 分辨率, y 分辨率),单位与 crs 一致 "bounds": ds.bounds, "dtype": ds.dtypes[0], "nodata": ds.nodata, } return info # 10 m 目录下应为 4 个波段,20 m 目录 6 个,60 m 目录 3 个 for res_dir, expect in [("R10m", 4), ("R20m", 6), ("R60m", 3)]: for tif in Path(f"./S2_L2A/{res_dir}").glob("*.tif"): info = inspect_s2(tif) flag = "OK" if info["count"] == expect else "MISMATCH" print(f"[{flag}] {tif.name} count={info['count']} res={info['res']} dtype={info['dtype']}")逻辑说明:Sentinel-2 L2A 产品按分辨率分目录存放,R10m 下是 B02、B03、B04、B08 四个波段,R20m 下是 B05、B06、B07、B8A、B11、B12 六个,R60m 下是 B01、B09、B10 三个。如果你的代码假设“一个 tif 文件包含全部 13 个波段”,在这里就会直接对不上。参数上要注意ds.res返回的是坐标参考系下的像元尺寸,如果 CRS 是地理坐标(度),这个值看起来会是很小的浮点数,需要投影转换后才能和“米”对应;ds.dtypes[0]返回的是存储类型,Sentinel-2 L2A 常见的是 uint16,反射率经过 10000 缩放,忘了除以 10000 会让 NDVI 计算溢出。
我一般还会加一条断言:检查 B08 和 B8A 是否同时存在。如果只拿到 4 个 10 米波段,说明下游要么缺红边信息,要么得从 20 米上采样,两种情况的处理策略完全不同,必须在流程入口就明确。
4.3 用 STAC 检索时把参数表当过滤器
影像数量一多,手工下载不现实,常见做法是通过 STAC 接口检索。把参数表里的约束翻译成检索条件,能大幅减少无效下载。
from pystac_client import Client # 端点按你所用服务的实际地址填写,不同服务的集合命名和查询扩展支持不同 catalog = Client.open("https://<your-stac-endpoint>/v1") search = catalog.search( collections=["sentinel-2-l2a"], bbox=[116.0, 39.5, 117.0, 40.5], # 经纬度顺序:minx, miny, maxx, maxy datetime="2024-06-01/2024-06-30", query={"eo:cloud_cover": {"lt": 10}}, # 云量阈值,按项目容忍度调 limit=100, ) items = list(search.items()) print(len(items)) for it in items[:5]: print(it.id, it.properties.get("eo:cloud_cover"), it.properties.get("platform"))逻辑说明:collections对应产品集合,写错一个字母就是空结果;bbox是经纬度顺序,和某些 GIS 工具的 x/y 顺序容易搞混;datetime用斜杠分隔起止,只写一端表示开区间;query是查询扩展,不同服务端的支持程度不一样,有的只支持部分字段,遇到不认的字段会直接忽略而不是报错,这时候检索结果会变多而不是变少,容易被误判成“数据很充足”。
参数上要盯住两个:eo:cloud_cover是整景云量百分比,不是目标区域云量,山区单景 5% 云量也可能正好压在你的研究区上;platform用来区分是 A 星还是 B 星,做辐射一致性分析时同一颗星的影像更可比。检索完之后,我习惯再拉一次processingLevel和productType字段,确认拿到的是 L2A 而不是 L1C,这一步能省掉后面一次重跑。
4.4 校验不通过时的三条路径
脚本跑出 MISMATCH 的时候,不要急着改代码,先按三条路径排查。第一条看数据本身:文件是不是下载不完整,压缩包解压时有没有中断,波段顺序在某些第三方镜像上会不会被重排。第二条看产品定义:确认下载的是 L1C 还是 L2A,两者波段数量一致但辐射量纲不同,如果流程里写死了 TOA 转 BOA 的系数,用 L2A 跑就会双重校正。第三条看代码假设:有些开源库默认按文件名排序加载波段,而 Sentinel-2 的 B8A 在字典序里排在 B08 之后、B09 之前,稍不注意就把波段索引错位了。三条都过一遍,问题基本能定位到具体某一层。
5. 避坑:参数表和真实数据对不上的五个现场
参数表是静态的,数据是动态的,两者对不上是常态。下面五条是我在模拟项目里真实踩过的,每条都按“现象 → 原因 → 解决”记下来。
5.1 B08 和 B8A 混用,NDVI 曲线出现台阶
现象:同一块农田的 NDVI 时序,中间某几期突然掉 0.05 左右,前后趋势本身是连续的,不像是物候变化。
原因:处理链里用“第 8 个波段”来取近红外,但不同产品目录下的波段数量和顺序不一样,某些批次取到的是 B8A(865 nm,带宽 20 nm),另一些取到的是 B08(842 nm,带宽 115 nm)。两者中心波长差 23 nm、带宽差近 6 倍,反射率数值有系统性差异,NDVI 自然跳变。
解决:不用波段序号,改用波段名称或中心波长匹配,就是 4.1 里那个nearest_band的用法。同时在建流程时把使用的波段名写进日志和输出元数据,出了问题能回溯。从那之后我要求所有指数计算函数的入参必须是波段名字符串,禁止传整数索引。
5.2 分辨率写着 10 米,实际是 60 米上采样
现象:做建筑区提取时,10 米产品的边缘比预期模糊很多,小目标几乎糊成一片,但文件元数据里确实写着 10 米。
原因:有些处理流程为了统一网格,把所有波段重采样到 10 米,包括原生 60 米的 B01、B09、B10。重采样只改变像素数量,不增加信息量,60 米波段的真实空间细节还是 60 米。B10 是卷云通道,很多云检测算法要用它,如果把它当成 10 米波段直接参与分类,等于给模型喂了插值出来的假细节。
解决:在处理链里为每个波段记录“原生分辨率”字段,重采样时保留来源标记,输出产品的元数据里写清楚哪几个波段是上采样的。做定量分析时,只用原生分辨率匹配的波段组合,需要跨分辨率融合就单独走融合流程并评估误差。
5.3 把标称重访当成均匀采样周期
现象:规划月度监测任务时按“5 天重访”排了 6 期,实际执行时某些月份只有 1–2 期可用,时序分析的时间间隔完全不均匀。
原因:双星互补的 5 天是理想状态,实际受三件事影响:单星故障或轨道调整会让重访退回 10 天;成像计划按陆地/海洋分模式,你所在区域可能不在优先采集列表里;云量过滤直接砍掉大半。再加上相邻轨道重叠导致某些时段集中过境、某些时段空窗,采样间隔本身就不均匀。
解决:不要用标称重访做规划,直接用检索服务查历史同期的实际可用影像,统计每个月的有效景数,按实际分布设计时间窗口。时序模型要能处理不等间隔采样,别默认输入是等间距序列。
5.4 极化方式写成双极化,下回来只有单极化
现象:筛选条件写的是 HH+HV,下载回来的影像只有 VV 一个通道,代码在读第二个通道时报错。
原因:极化配置和成像模式、采集计划绑定。IW 模式提供双极化(HH+HV 或 VV+VH)和单极化(HH 或 VV)选项,但具体某次过境用哪种配置由采集计划决定,不是所有过境都有双极化。参数表里列的是“可选项”,不是“必然项”。
解决:检索时就把极化方式作为过滤条件,而不是下载后再判断。拿到数据后先读元数据里的极化字段确认,再做后续处理。涉及极化分解的分析,必须在流程入口显式断言通道数,缺通道直接跳过这次过境,别让流程带着错误假设往下跑。
5.5 L1C 和 L2A 混着比,差异被当成地表变化
现象:两期影像做变化检测,差异图上一大片区域显示“变化”,实地核查发现地块没动过。
原因:一期是 L1C(大气顶反射率),一期是 L2A(大气底反射率)。大气校正会整体压低反射率,气溶胶多的日期压得更多,两期影像的量纲根本不在一个层面上。差异图上的“变化”其实是大气状况的差异,不是地表变化。
解决:变化检测的输入必须统一产品级别,全部用 L2A,或者全部用同一套大气校正参数自己处理 L1C。如果做不到,至少在比较前做相对辐射归一化,用两期影像里的稳定地物(深水体、裸岩、大片建筑屋顶)做线性回归校正。这条我现在写进了项目模板的检查清单,每次新建流程第一件事就是断言所有输入产品的processingLevel一致。
6. 进阶:把这份文档变成自己的元数据底座
参数表读到这个程度,就该考虑怎么让它长期发挥作用了。我的做法是把那份四十多页的文档拆成机器可读的配置,放进项目仓库的config/sensors/目录,一颗星一个 YAML,字段就是前面那几个:轨道高度、倾角、重访、传感器类型、波段表、产品级别、极化选项、数据政策。
import yaml def load_sensor(name: str) -> dict: """按卫星名加载本地参数配置,缺失字段直接抛错,避免默认值兜底""" with open(f"config/sensors/{name}.yaml", encoding="utf-8") as f: cfg = yaml.safe_load(f) required = {"orbit", "sensors", "bands", "products"} missing = required - cfg.keys() if missing: raise KeyError(f"{name} 缺少字段: {missing}") return cfg这段的意义不在于代码本身,而在于把“查文档”变成“读配置”。流水线里所有关于波段、分辨率、重访的判断都从这个配置里取,改一处全链路生效,不用去翻 PDF 对数字。配合一个 CI 任务,每次有人新增数据源或修改参数,就跑一遍字段完整性和量纲一致性检查——中心波长必须是纳米、分辨率必须是米、重访必须是天,单位混了立刻报错。
我还会在每个项目结束时补一行记录:这次用了哪颗星、哪一级产品、哪个模式、实际有效景数是多少。攒十几个项目之后,这张表和文档里的标称参数对照着看,就能看出哪些数字是理论值、哪些接近现实。比如某个区域实际有效重访往往是标称值的两到三倍,这个倍数比任何文档都更有参考价值。
说个具体的教训。早些年做一套区域土地覆盖更新,图省事直接按文档标称的 5 天重访排了季度四期,结果整个季度只凑出两期可用影像,后面全靠插值硬撑,成果精度一塌糊涂。从那以后我每次启动新项目,都会强制走一遍“查实际可用影像 → 统计有效采样间隔 → 再定时间窗口”的流程,参数表只用来做初筛,不再用来做承诺。希望这份拆解能帮你在下一次数据源比选时,少翻几页手册,多留几个小时给真正重要的处理环节。
本文还有配套的精品资源,点击获取