Landsat 8 和 Landsat 9 这两颗卫星,是我这些年做地表变化分析时翻得最多的两套数据源。原因很实在:免费、开放、重访周期稳定、波段配置够用,30 米的空间分辨率做区域级的地类提取、水体范围变化、作物长势对比、城市扩张监测都拿得下来。但真正让新手卡住的往往不是后续的分析处理,而是最开始的那一步——数据去哪下、怎么下、下完了哪几个文件才是自己要的。这篇就把从海外主站到国内云平台这两条下载路线彻底走一遍,把路径、参数、字段、坑点都摆出来。不管你是刚接触遥感的学生、做国土调查的技术员,还是只想拿两景影像做个对比图的爱好者,照着走都能跑通。全文基于我自己的实操流程,涉及平台界面细节的部分会说明哪些是基于常见版本的描述,你手上的界面若有出入,按字段名去找即可。
1. 动手之前先想清楚:你要的到底是哪一景
很多人一上来就打开检索框,输个地名,看到一堆结果就开始下,下完发现云量 80%、太阳高度角低得离谱、或者行列号偏到了隔壁省。这一步先花十分钟把需求定义清楚,能省掉后面两小时的返工。
1.1 行列号(Path/Row)是检索的骨架,不是可选项
Landsat 系列用的是 WRS-2 参考网格,全球被切成 233 条 Path(降轨编号,从东往西)和 248 条 Row(从北往南)。每一景影像的幅宽约 185 公里,实际覆盖约 170 km × 183 km。你在检索框里填的每一个地名,背后都对应唯一的一组 Path/Row。
拿国内几个常做实验的区域举例,大致对应关系是:京津冀一带落在 Path 123 / Row 32 附近,长三角在 Path 118 / Row 38 上下,珠三角在 Path 122 / Row 44 左右,成都平原在 Path 130 / Row 39,乌鲁木齐周边在 Path 145 / Row 29。这些数字我建议你只当参考,真实项目里一定要用平台的“坐标查行列号”工具或者 WRS-2 矢量图层核一遍,因为同一个城市的东西两端完全可能跨两景。
为什么要死磕行列号?因为时间序列分析的前提是同一景、同一几何框架。你今天用 Path 123 下了一景,明年换成 Path 122,两景的重叠区只有一部分,拼接和比对都会多出一堆边界处理。做 NDVI 时序、做城市扩张、做水体频率图,行列号一旦不统一,后面所有的掩膜和裁剪逻辑都要跟着改。
提示:如果研究区正好压在两景交界处,不要偷懒只下一景。掉头去下相邻那一景,几百兆的代价换取完整的空间覆盖,远比后期补数据划算。
1.2 云量、季节、太阳高度角:选片的三条硬标准
云量字段有两个,一个叫全场景云量(Land Cloud Cover),一个叫场景中心云量(Scene Center Cloud Cover)。前者统计整景陆地范围内的云占比,后者只看景中心那块区域。做区域分析看前者,做单点核查看后者。我的经验阈值是:常规地表分类控制在 10% 以内,城市建成区提取可以放宽到 20%,但一定要打开快速预览图肉眼确认云的位置——云量 8% 全压在你研究区正上方的情况太常见了。
季节这事因人而异。做植被物候,得选生长季;做不透水面提取,秋季落叶后反而更干净;做洪涝淹没范围,自然是汛期。但有个通用原则:同一组对比影像尽量落在同一物候窗口内,前后相差别超过一个月。我见过有人拿三月的影像和八月的影像做“植被退化”结论,那结果全是物候差异,跟退化没关系。
太阳高度角容易被忽略。北纬 40 度左右,冬季过境时太阳高度角只有 25 度上下,建筑和山体的阴影会拉得很长,阴影区在可见光波段基本是无效数据。夏季同一地点能到 65 度以上,阴影短得多。如果你要做城市三维结构或者山区地类,冬季影像的可用像元比例可能比你想象的低很多。这个角度在元数据里记作 SUN_ELEVATION,下完数据看 MTL 文件就能查到。
2. 两条下载路线怎么选:海外主站与国内云平台
标题里说的两个渠道,本质上是同一批数据的两个分发入口。国内平台做的是镜像和本地化服务,海外主站是原始分发方。两者没有绝对优劣,取决于你的网络条件、数据版本要求和批量规模。
2.1 两条路线的能力对比
先看一张对照表,把差异摆清楚再决定走哪条。
| 维度 | 海外主站(原始分发方) | 国内云平台(镜像分发) |
|---|---|---|
| 数据版本 | Collection 2 全系列,Level-1 与 Level-2 齐全 | 以 Level-1 为主,部分数据集提供合成产品 |
| 更新时效 | 过境后数小时到数天入库 | 通常滞后数天到数周 |
| 检索维度 | 行列号、坐标、多边形、上传矢量、云量、日期 | 行政区划、经纬度、行列号、矢量上传、云量 |
| 批量能力 | 支持批量加入购物车、批量提交订单 | 一般单景提交,批量需多次操作 |
| 获取方式 | 浏览器直下或脚本调用 | 多数为 HTTP 直链,部分数据集需先生成订单 |
| 适用场景 | 大范围时序、需要 Level-2 地表反射率 | 快速拿几景做验证、网络条件受限时 |
我自己的习惯是:正式项目一律从主站下 Collection 2 Level-2,因为地表反射率产品省掉了大气校正这一步,不同时相之间的可比性明显更好;如果只是给学生演示、或者临时要看一眼某地长什么样,云平台上搜一下更快,单景提交即得,不用折腾账号权限。
2.2 账号注册与权限,别在第一步就卡住
两个平台都要注册,但流程不一样。主站注册是邮箱验证加身份信息填写的组合,提交后立即生效,普通检索和下载不需要额外申请权限。需要注意的是密码策略比较严,包含大小写、数字和符号,别用弱口令,后面找回很麻烦。
国内云平台的注册更简单,手机号验证即可。但要留意两点:一是部分数据集设有下载配额或账号等级限制,页面上会标注“需登录”“需实名”“每日限 N 景”之类的说明,提交前先看一眼;二是有些数据集不是即时下载,提交后会生成一个订单,几分钟到几十分钟不等才出现下载链接,新手常以为点错了反复重试,其实只是没等够。
注意:两个平台都建议在注册后先下个小文件试通链路。用一景云量 90% 的影像做测试最合适——反正也不要,但能验证账号、网络、下载工具这条链路是不是通的。
3. 海外主站下载全流程拆解
这部分按实际操作顺序走一遍,每个界面元素我会说清楚它是干什么的、为什么这么填。
3.1 检索区的四个关键输入框
进入检索页面后,左边一列是检索条件,常用的就四块:地址/地名、坐标、时间范围、数据集勾选。
地址栏输入地名后,地图会自动飞到对应位置并画出所有覆盖该点的行列号矩形。这一步只是定位,不代表筛选,很多人以为输了地名就筛完了,结果下载列表还是全球的。正确的做法是:定位完之后,在结果面板里点“显示覆盖此点的景”,或者直接把地图上的那个矩形框选中,让检索条件变成“按此景检索”。
坐标栏支持十进制度和小数度两种格式,填的时候注意经纬度顺序。我踩过的坑是把手上的 WGS84 坐标直接粘进去,结果因为分隔符用了中文逗号,平台把整串当一个数解析了,地图飞到太平洋中间。稳妥的做法是逐格填,或者直接上传一个点/面的 KML、Shapefile、GeoJSON。上传矢量是最省事的,研究区边界什么样就传什么样,检索结果直接落在边界内。
时间范围建议分两段填:先填个宽范围(比如近三年)看有多少可用影像,再逐步收窄。一次性填太窄容易零结果,然后你会怀疑平台坏了。
数据集勾选是最容易出错的地方。列表里 Landsat 系列有多个条目,你需要认准的是 Collection 2 Level-1 和 Collection 2 Level-2 这两项。老版本的 Collection 1 已经停止更新,做新项目不要再用,否则和别人 2024 年之后下的数据混不到一起。同理,Landsat 7 的 ETM+ 有扫描线失效问题,Landsat 8 和 Landsat 9 的波段编号和几何特性高度一致,这两颗混用没问题,和 Landsat 7 混用就要额外处理。
提示:Level-1 给的是经过辐射定标和几何校正的 DN 值,Level-2 给的是地表反射率和地表温度。做定量分析、跨时相对比、植被指数计算,直接用 Level-2 省事得多,文件也差不多大。
3.2 结果列表怎么读、怎么筛
检索结果出来是一张表,每行一景。我关注这几列:影像标识、采集日期、Path/Row、云量、产品级别、几何精度等级。
几何精度等级里 Tier 1 是最高档,几何定位误差控制在 12 米圆误差(95% 置信)以内,可以直接用于时序配准。Tier 2 是没达到 Tier 1 标准的,虽然也能用,但做像素级变化检测时会引入位移。项目里我基本只用 Tier 1,除非某个月份实在没有 Tier 1 覆盖。
结果表顶部可以按云量升序排,先把最干净的几景挑出来。但别只看数字,点开每行的缩略图,会弹出一个快速预览,能直接在影像上看云在哪。这一步花的时间绝对值回票价——我遇到过云量 3% 但正好一条薄云带横穿研究区的,也遇到过云量 25% 而研究区完全无云的。
有个很实用的功能是导出为 KML,把结果列表导出来在三维地球上飞一圈,云的分布、地形的遮挡、水体范围一眼就看到。这个技巧在山区项目里特别管用,因为平台自带的平面预览看不出地形阴影。
筛选完,勾选需要的景,点批量加入购物车,再进入下载队列。批量提交时平台会打包成一个订单,逐景生成下载链接。链接有效期有限,不要一次提交几十景然后放着不管,过期了要重来。
3.3 下载下来的文件结构,和该拿哪几个
不管从哪个渠道下,解开压缩包后你会看到一堆文件名很长、后缀各异的文件。以一个典型的 Level-2 场景为例,命名结构大致是:卫星标识 + 产品级别 + PathRow + 采集日期 + 处理日期 + 集合版本 + 精度等级 + 波段/产品类型。
拆开看:LC08代表 Landsat 8,LC09代表 Landsat 9;中间那段L2SP表示 Collection 2 的 Level-2 科学产品;后面的六位数字前三位是 Path、后三位是 Row;再往后是八位采集日期和处理日期;02是集合版本;T1是 Tier 1。
文件清单里必看的几类:
- 单波段 GeoTIFF:每个波段一个文件。Level-2 里
SR_B1到SR_B7是地表反射率,ST_B10是地表温度,SR_B8是全色波段(15 米)。 - QA_PIXEL:质量评估波段,uint16 格式,每一位代表一种状态。这是去云的核心,后面会讲怎么用。
- QA_RADSAT:饱和标记,亮云和雪容易饱和,做定量分析前要拿它剔除。
- MTL 元数据文件:
.txt和.xml两个版本,内容一样。里面记录了定标系数、太阳高度角、方位角、角点坐标、投影参数。所有定标计算都要从这里取数。
波段本身也值得记一下,Landsat 8 和 9 的波段配置基本一致:B1 海岸/气溶胶(0.43–0.45 μm)、B2 蓝(0.45–0.51)、B3 绿(0.53–0.59)、B4 红(0.64–0.67)、B5 近红外(0.85–0.88)、B6 短波红外 1(1.57–1.65)、B7 短波红外 2(2.11–2.29),以上都是 30 米;B8 全色(0.50–0.68)是 15 米;B9 卷云(1.36–1.38)30 米,主要用于云检测,不做地表分析;B10 和 B11 是热红外,原始分辨率 100 米,产品里重采样到 30 米存放。
注意:热红外波段的 30 米是重采样结果,不代表真实的空间细节。做地表温度反演时心里要有数,别拿它和可见光波段做同尺度的纹理分析。
4. 国内云平台的下载路径
云平台的优势在检索路径短、界面语言无障碍、下载链接是本地直连。流程和主站大同小异,但有几处细节不一样,单独说一下。
4.1 数据集定位与检索参数的填法
进入平台后先看数据集目录,找 Landsat 系列下的 Landsat 8 OLI_TIRS 条目。点进去会看到数据集说明、时间覆盖范围、产品级别、以及最重要的——数据格式和坐标系。有些条目提供的是原始 L1T 产品,有些提供的是经过拼接裁切的合成产品,两者的用途完全不同,选之前看清楚。
检索区一般提供四种定位方式:按行政区划(省市区县逐级选)、按经纬度范围、按行列号、按上传矢量。行政区划方式最省事但精度最差,因为省市边界和影像范围不是一回事,搜出来的结果往往比你需要的多。我一般用矢量上传,把手上的研究区边界文件传上去,结果直接落在里面。
云量筛选在云平台上通常只有一个“最大云量”输入框。这里有个小技巧:填 100 先看全量,再根据结果分布决定阈值。我试过在某区域直接填 5,结果零条,以为自己搞错了区域,改回 100 才发现那个月总共只有两景,云量分别 12% 和 35%。先看全量再收窄,能避免这种误判。
4.2 下载慢、断流、链接失效的应对
国内平台的整体速度比海外主站稳,但也不是没有毛病。常见的三种情况:
第一,提交后没有立即出现下载按钮。这是订单在生成中,通常几分钟到半小时。刷新页面之前先看“我的订单”或者“下载中心”里有没有排队状态,别急着重复提交,重复提交会占配额。
第二,单景下载到 60% 卡住。浏览器自带下载对长连接的处理不太好,尤其文件接近 1 GB 的时候。换一个支持断点续传的工具会稳很多,比如常见的多线程下载器,注意把线程数压在 4 以内,线程开太高反而容易被限速。
第三,链接过一段时间打不开。下载链接有有效期,一般是 24 到 72 小时。批量下的时候不要一次性把所有链接都生成出来,分两三批,下完一批再提交下一批。
用命令行工具批量拉取会更可控。假设你已经拿到了若干直链,写进一个文本文件,每行一个,可以这样跑:
# links.txt 每行一个下载直链 while read -r url; do aria2c -x 4 -s 4 -c --file-allocation=none "$url" done < links.txt参数含义:-x 4是单服务器最大连接数,-s 4是分片数,-c开启断点续传,--file-allocation=none跳过预分配,对机械硬盘和网络盘更友好。中断了重新执行同一条命令就能接着下。
5. 数据到手之后:定标、去云与预处理
下载只是把原料搬回家,真正决定分析质量的是后面这几步。很多人拿到 TIFF 就急着算 NDVI,算出来的值域不在 -1 到 1 之间,就是因为跳过了定标。
5.1 Level-2 地表反射率的定标与裁剪
Collection 2 Level-2 的地表反射率产品已经做过大气校正和太阳高度角归一化,处理起来很简单:DN 值乘系数加偏移,然后裁剪到有效区间。系数在 MTL 文件里,Collection 2 的 SR 用的是 2.75E-05 和 -0.2。
import numpy as np import rasterio src_path = "LC08_L2SP_123032_20231015_20231024_02_T1_SR_B4.TIF" with rasterio.open(src_path) as ds: dn = ds.read(1) profile = ds.profile sr = dn.astype("float32") * 0.0000275 - 0.2 sr = np.clip(sr, 0.0, 1.0) # 负值和超 1 的视为无效 sr[dn == 0] = np.nan # 填充区剔除 profile.update(dtype="float32", count=1, nodata=np.nan, compress="lzw") with rasterio.open("B4_sr.tif", "w", **profile) as dst: dst.write(sr, 1)为什么不直接除以 10000?因为那是老版本的处理习惯,Collection 2 改了系数。用错系数最典型的症状是水体反射率算出来是负数、植被 NDVI 超过 1。看到这类异常先回去查 MTL 里的REFLECTANCE_MULT_BAND_x和REFLECTANCE_ADD_BAND_x这两个键,以文件里的实际值为准。
如果你手上只有 Level-1,那就得多一步:先算大气顶辐亮度或大气顶反射率,再除以太阳高度角的正弦。
# Level-1 转 TOA 反射率(参数从 MTL 读取) M_rho = 2.0000e-05 A_rho = -0.1 sun_elev = 62.3 # SUN_ELEVATION,单位度 toa = (dn * M_rho + A_rho) / np.sin(np.deg2rad(sun_elev)) toa = np.clip(toa, 0, 1)太阳高度角这个除数很关键。冬季影像高度角 25 度时,sin 值只有 0.42,不做这步校正,同一地物冬夏两景的反射率能差出一倍多。
5.2 用 QA_PIXEL 做云掩膜,别只信云量字段
云量字段是整景统计值,不告诉你云在哪。真正的逐像元去云要靠 QA_PIXEL。这个波段是 16 位无符号整数,每一位或每一对位记录一种状态:bit 0 填充、bit 1 膨胀云、bit 2 卷云、bit 3 云、bit 4 云阴影、bit 5 雪、bit 6 晴空、bit 7 水体。
with rasterio.open("..._QA_PIXEL.TIF") as ds: qa = ds.read(1) fill = (qa >> 0) & 1 dilate = (qa >> 1) & 1 cirrus = (qa >> 2) & 1 cloud = (qa >> 3) & 1 shadow = (qa >> 4) & 1 snow = (qa >> 5) & 1 clear = (qa >> 6) & 1 valid = (clear == 1) & (cloud == 0) & (shadow == 0) & (fill == 0)实践中的取舍:做植被指数时我会把膨胀云和卷云也剔掉,因为它们对近红外的污染很明显;做城市不透水面提取时,云阴影可以适当保留一部分,因为阴影下的像元在短波红外仍有信息,全剔掉会在建成区里挖出一堆空洞。这个尺度靠试,没有统一答案。
提示:去云之后的 NDVI 时序里如果出现单点突降,先怀疑是残留薄云而不是真实变化。把 QA 掩膜叠上去看一眼,十有八九能找到对应位置。
5.3 打开方式与显示拉伸
16 位数据直接用看图软件打开,大概率是一片黑或者一片白。原因是没有做显示拉伸。在 QGIS 里把波段的最小最大值设为累计 2% 到 98% 分位数,影像立刻正常;在 ArcGIS 里用“标准差拉伸”,倍数设 2 到 2.5。这只是显示层面的调整,不改动原始 DN,放心用。
如果要合成真彩色,顺序是红波段放 R 通道、绿放 G、蓝放 B。Landsat 8/9 对应 B4、B3、B2。标准假彩色是近红外、红、绿,对应 B5、B4、B3,植被会显示成鲜红色,用来快速判断植被覆盖状况非常直观。短波红外组合(B7、B5、B4)对地质和建筑用地敏感,做建成区提取时很好用。
6. 实操中踩过的坑与速查表
这部分是我这些年积累下来的问题清单,大部分在官方文档里找不到,都是实际操作撞出来的。
6.1 典型问题速查
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 检索结果为零 | 时间窗太窄 + 云量阈值太严 | 云量放宽到 100,时间放宽到一年,先看全量 |
| 地图飞到海里 | 坐标分隔符用了中文标点 | 逐格填,或改用矢量文件上传 |
| 下载中断且无法续传 | 浏览器单连接超时 | 换支持断点续传的工具,线程数控制在 4 以内 |
| 打开全黑/全白 | 未做显示拉伸 | 累计 2%–98% 线性拉伸 |
| 反射率出现负值 | 定标系数用错(Collection 1 的系数用在 Collection 2 上) | 核对 MTL 中的 MULT/ADD 键 |
| NDVI 超出 -1 到 1 | 跳过了定标,直接拿 DN 算 | 先转地表反射率再算指数 |
| 时序影像错位 | 混用了 Tier 1 和 Tier 2 | 统一到 Tier 1,或做几何配准 |
| 相邻景拼接有缝隙 | 只下了一景,覆盖不全 | 补下相邻 Path 或 Row 的影像 |
| 全色融合后色调异常 | 全色与多光谱的采集时间不同步 | 只用同一景内的 B8 与多光谱融合 |
| 云平台下载链接打不开 | 链接超时过期 | 重新生成订单,分批提交 |
6.2 几个不写在文档里的经验
第一个,先下 QA_PIXEL 再下其他波段。听起来反直觉,但 QA 文件只有几兆,拿它跑一遍有效像元比例,立刻知道这景到底能不能用。我遇到过云量字段显示 6%、实际研究区有效像元不到 40% 的情况,如果先把 1 GB 的全套波段下完再发现,纯属浪费。
第二个,Landsat 8 和 9 联合使用能把重访周期从 16 天压到 8 天左右,但两者的过境时间相差十几分钟,太阳高度角会有细微差别。做高精度的时序分析时,把这两颗的数据分成两组分别处理再合并,比不加区分地混在一起更稳。
第三个,做跨年对比一定要对齐物候。同样是 6 月,今年 6 月初和去年 6 月底的植被状态能差一个生长阶段。我现在的做法是先拉一遍研究区近五年的 NDVI 曲线,找到最平稳的那两周作为固定窗口,后面所有年份都只取这个窗口内的影像。
第四个,大范围项目别用单景堆叠。几十景影像直接拼,内存先爆掉。正确做法是先按行政边界或流域边界裁剪到分析范围,再镶嵌,文件体积能降一个数量级。
第五个,元数据里的角点坐标是影像四角的经纬度,但影像本身在投影坐标系下是矩形,四角经纬度连起来是个梯形。用角点坐标直接构造多边形去裁剪会切掉边角。老老实实用影像自带的坐标系和范围,让软件去处理重投影。
6.3 关于选哪条下载路线,我的实际做法
小规模验证、教学演示、临时看一眼某个地方的变化,走国内云平台,注册快、点几下就能下、不用折腾网络。正式项目、需要 Level-2 地表反射率、需要批量几十景的时序,走海外主站,数据版本统一、字段规范、可以脚本化。两边都注册着,不冲突,哪个顺手用哪个。
还有个细节值得说:同一景影像在两个平台上的文件大小可能略有差异,这不是数据被改过,而是压缩参数或打包方式不同。判断两景是否同源,比对 MTL 里的LANDSAT_SCENE_ID和FILE_DATE这两个字段就行,一致就是同一份。
6.4 关于存储和命名的一点建议
一景 Level-2 全套解压出来接近 1.2 GB,做十年的时序就是几十上百景,几个 TB 的硬盘很快就见底。我的做法是:原始压缩包解压后立刻删掉,只留 GeoTIFF 和 MTL;单波段文件按项目需要裁剪后再存,不保留全幅;命名统一成“卫星_行列号_日期_产品级别_波段”的格式,别指望文件夹结构能记住一切。
再补一个小习惯:每次下载完,把当时的检索条件(时间范围、云量阈值、行列号、数据集版本)记在一个纯文本文件里,和数据放在一起。半年后你回头想复现同样的数据集,没有这份记录,靠回忆是拼不出来的。这个习惯我坚持了好几年,救过不止一次。
用下来最深的体会是,下载这一步本身技术含量不高,难的是想清楚自己要什么。行列号定死了空间框架,物候窗口定死了时间框架,产品级别定死了后续处理的复杂度。这三件事在打开检索页面之前就想明白,后面全是机械操作;想不明白,下十景返工十景。