杭州 Landsat-GEE 运行指南(独立支线)
次脚本运行在数据组git的hangzhou-clcd-pipeline分支上
本指南描述 GEE 本地 Landsat 8/9 支线:消费由
download_gee_monthly_zhejiang.py 导出的 5 年(2021–2025)月度中值合成
GeoTIFF,产出与原 AWS S3 Landsat 支线 可互换 的 OlmoEarth 训练数据,但
完全不依赖 AWS / Requester Pays。
与原
docs/杭州Landsat-运行指南.md是并列关系,不是替代。
原文档描述的data/rslearn_hangzhou_landsat/+LandsatOliTirs(S3)那条
管线保持不变。本支线产出在data/olmoearth_hangzhou_landsat_gee/下,
二者共存。
适用前提
- 已通过
download_gee_monthly_zhejiang.py(或同等方式)下载 GEE L8/L9 月度
中值合成,放到远端存储LANDSAT_GEE_SRC(e.g./data/gee-download),布局:
每个文件叫$LANDSAT_GEE_SRC/ ├── Zhejiang_RemoteSensing_2021_2022_L89/ # 扁平,24 月 × 9 sub-tile ├── Zhejiang_RemoteSensing_2023_2024_L89/ # 扁平,24 月 × 9 sub-tile └── Zhejiang_RemoteSensing_2025/2025_L89/ # 多一层,12 月 × 9 sub-tileL89_zhejiang<YYYY>_<MM>-<row_pix>-<col_pix>.tif。 - Python 环境同主仓:
uv sync --locked --all-extras --python 3.12。 - 磁盘 ≥ 500 GB(VRT 极小,但 31,360 windows × 13 layer × uint16 raster
累积上 TB;03_run_landsat_gee_production.shpreflight 会检查)。 - 本地无数据 → 所有真数据步骤在远端服务器跑。本地只跑单元测试(合成
fake 文件,见tests/unit/landsat_gee/)。
产物
| 目录 | 内容 |
|---|---|
data/landsat_gee_zhejiang/vrt/ |
60 个月度 VRT(L89_<year>_<MM>.vrt)+ 5 个年度 median(L89_<year>_freq.tif) |
data/rslearn_hangzhou_landsat_gee/ |
rslearn 中间产物;31,360 个 window(6,272 × 5 年)× 13 layer |
data/olmoearth_hangzhou_landsat_gee/ |
最终 OlmoEarth 单文件格式,modality = landsat
|
与原 AWS Landsat 支线的关系
| AWS 支线 | GEE 本地支线(本文档) | |
|---|---|---|
| 数据源类 | rslearn.data_sources.aws_landsat.LandsatOliTirs |
olmoearth_pretrain.dataset_creation.landsat_gee.local_landsat_gee.LocalLandsatGEE |
| 原料 | S3 单景 Collection-2 Level-1 | GEE 月度中值合成(已 clip 到浙江) |
| Wrapper |
_rslearn_landsat_wrapper.py(Requester Pays / vsis3) |
无,纯本地 |
| Windows | 6,272(单年) | 31,360(6,272 × 5 年) |
| Layer 名 |
landsat_freq + landsat_mo01..mo12
|
同上 |
band_sets |
B1-B11(除 B8)+ B8,uint16 |
同上 |
time_offset |
mo01: -180d 起每 30 天 |
同上 |
| 最终 Modality 标签 | Modality.LANDSAT |
同上(norm config / model 代码零改动) |
下游训练:GEE 那条 OlmoEarth 输出与 AWS 那条 字段级一致,只是窗口数和时间
范围不同。如果两者一起喂模型,只是同 modality 的更多样本,无需改 norm
config。
第 0 步 准备(一次性)
cd <repo-root>
source .venv/bin/activate
确认源目录可访问:
ls $LANDSAT_GEE_SRC/Zhejiang_RemoteSensing_2021_2022_L89 | head
ls $LANDSAT_GEE_SRC/Zhejiang_RemoteSensing_2023_2024_L89 | head
ls $LANDSAT_GEE_SRC/Zhejiang_RemoteSensing_2025/2025_L89 | head
每个文件夹应该看到形如 L89_zhejiang<YYYY>_<MM>-XXXXXXXXXX-YYYYYYYYYY.tif
的文件。
第 1 步 单元测试(本地或远端都可,几秒)
uv run --extra all-no-flash pytest tests/unit/landsat_gee/ -vv
包含合成 fake VRT/TIF 的 LocalLandsatGEE 行为测试 + 多年 windows 创建测试。
不需要真 GEE 数据。
第 2 步 远端冒烟(小 bbox + 单年,~10 分钟)
LANDSAT_GEE_SRC=/data/gee-download \
SAMPLE_BBOX=120.143,30.236,120.161,30.254 \
YEAR=2025 \
WORKERS=4 \
bash scripts/landsat_gee/03_run_landsat_gee_production.sh
实际执行:
LANDSAT_GEE_SRC=/mnt/si000082vai5/default/Data/GEE-download \
SAMPLE_BBOX=120.08,30.28,120.10,30.30 \
YEAR=2025 \
WORKERS=4 \
bash scripts/landsat_gee/03_run_landsat_gee_production.sh
走完整条流水线但只裁 1-2 个 window × 1 年 = 1-2 个 window 目录,验证:
- VRT 预构建 + Hangzhou 覆盖检查通过(2025 单年只构 12 个 VRT + 1 个 freq)
- LocalLandsatGEE 索引正确
- rslearn
prepare + materialize成功 - OlmoEarth 输出非空、dtype uint16、CRS 32650/32651
预期:OK: sampled GEE-Landsat outputs look healthy。
第 3 步 单年/全量(每年独立跑,6,272 windows × 13 layer)
重要变更:按年单跑,不再 5 年一锅
03_run_landsat_gee_production.sh现在只接受单年(YEAR=<int>必填),
单年下输出落到${OLMOEARTH_DS_BASE}_<YEAR>/。原因:converter 把多年同
(col, row) 文件覆盖写,5 年合一只剩最后处理的那一年(详见末尾"故障排查 →
5 年合一只剩单年")。按年单跑、每年独立目录,直接绕过该问题。路径配置在
scripts/landsat_gee/landsat_gee.env(shell source 格式),
CLI 可覆盖。默认值:
变量 默认 说明 LANDSAT_GEE_SRC/data/gee-downloadGEE 月度导出根目录 LANDSAT_GEE_VRT/usr/local/olmo_earth/data/landsat_gee_zhejiang/vrtVRT 输出(跨年共享) RSLEARN_DS_BASE/usr/local/olmo_earth/data/rslearn_hangzhou_landsat_gee实际目录 = ${BASE}_${YEAR}OLMOEARTH_DS_BASE/usr/local/olmo_earth/data/olmoearth_hangzhou_landsat_gee同上 WORKERS16 rslearn / converter 并行度 FREQ_WORKERS0 freq median 并行;0 = auto。注:freq 当前训练不消费,见末尾"freq 不消费"说明 MIN_FREE_GB100 单年磁盘门槛 SKIP_VRT_BUILD0 1 = 跳过 VRT 重建 单年(典型)
YEAR=2025 bash scripts/landsat_gee/03_run_landsat_gee_production.sh多年全量
bash scripts/landsat_gee/00_run_all_years.sh # 或子集 YEARS="2024 2025" bash scripts/landsat_gee/00_run_all_years.sh每年独立写
${OLMOEARTH_DS_BASE}_<year>/,失败年份单独重跑即可:YEAR=2023 bash scripts/landsat_gee/03_run_landsat_gee_production.sh临时覆盖
YEAR=2025 LANDSAT_GEE_SRC=/elsewhere WORKERS=8 \ bash scripts/landsat_gee/03_run_landsat_gee_production.sh # 完全替换配置文件 LANDSAT_GEE_CONFIG=./my-config.env YEAR=2024 \ bash scripts/landsat_gee/03_run_landsat_gee_production.sh中途 Ctrl-C 可断点续跑(rslearn 每步都跳过已完成 window;converter 跳过已存在的输出 tif)。
如果想了解每一步具体在做什么,或想分步排查,继续看下面 3.0-3.7 手动版本(以单年 2025 为例)。脚本里把"3.4 rslearn prepare"和"3.5 rslearn materialize"合并为同一阶段(
[4a/5]、[4b/5])。
3.0 preflight(磁盘 + 源目录)
脚本自动跑,手动等价:
# 磁盘空间 ≥ 500 GB(31,360 windows × 13 layer × 2 bandset × uint16 raster 累积上 TB)
df -Pk . | awk 'NR==2 {printf "free=%d GB\n", $4/1024/1024}'
# 3 个源目录都存在
for sub in Zhejiang_RemoteSensing_2021_2022_L89 \
Zhejiang_RemoteSensing_2023_2024_L89 \
Zhejiang_RemoteSensing_2025/2025_L89; do
test -d "$LANDSAT_GEE_SRC/$sub" && echo "OK: $sub" || echo "MISSING: $sub"
done
预期:磁盘剩余 ≥ 500 GB,3 个目录全 OK。任一缺失直接 abort,回 GEE 补导。
3.1 预构建 VRT + 年度 freq median
LANDSAT_GEE_SRC=/data/gee-download \
LANDSAT_GEE_VRT=$(pwd)/data/landsat_gee_zhejiang/vrt \
YEARS=2021,2022,2023,2024,2025 \
FREQ_WORKERS=0 \
bash scripts/landsat_gee/01_build_vrts.sh
内部跑 python -m olmoearth_pretrain.dataset_creation.landsat_gee.build_vrts,做两件事:
-
60 个月度 VRT(
L89_<year>_<MM>.vrt):把每月 9 个 sub-tile 用gdalbuildvrt拼成单一虚拟栅格,不复制像素,几秒到 1 分钟搞定。每个月都会反投 WGS84 做硬校验,断言 ⊇ Hangzhou bbox(118.29, 29.16, 120.76, 30.59),不完整立即RuntimeError: <year>-<mm> VRT does NOT cover Hangzhoufail-loud,提示回 GEE 重导。 -
5 个年度 freq GeoTIFF(
L89_<year>_freq.tif):该年 12 个月 VRT 的逐像素nanmedian,uint16,11 bands,BIGTIFF=YES,默认 5 进程并行,~2-4 h。
预期:
ls $LANDSAT_GEE_VRT/L89_*_<MM>.vrt | wc -l # 60(5 × 12)
ls $LANDSAT_GEE_VRT/L89_*_freq.tif | wc -l # 5
gdalinfo $LANDSAT_GEE_VRT/L89_2025_freq.tif | grep -E "Size is|Type=|Band 11"
# Size is 5632, 5632
# Type=UInt16
# Band 11 Block=...
3.2 渲染 rslearn dataset 配置
mkdir -p $RSLEARN_DS
sed "s|LOCAL_ROOT_PLACEHOLDER|$LANDSAT_GEE_VRT|" \
data/rslearn_hangzhou_landsat_gee/config.template.json \
> $RSLEARN_DS/config.json
把 template 里的 LOCAL_ROOT_PLACEHOLDER 占位符替换成 VRT 目录绝对路径。生成的 config.json 含 13 个 layer:1 个 landsat_freq 指向 L89_<year>_freq.tif,12 个 landsat_moNN 各自指向 L89_<year>_<MM>.vrt。每个 layer 都是 class_path: LocalLandsatGEE,ingest: false(与 AWS 支线一致,直接从 VRT 读)。
预期:$RSLEARN_DS/config.json 存在,grep '"name"' $RSLEARN_DS/config.json | wc -l = 13。
3.3 生成 windows(单年 6,272)
$UV_RUN python scripts/landsat_gee/02_create_landsat_gee_windows.py \
--ds_path $RSLEARN_DS \
--years 2025 \
--windows-json hangzhou_olmoearth_windows.json
从 hangzhou_olmoearth_windows.json 读 6,272 个固定 tile,对该年创建 6,272 个 window,目录名末尾带 _<year> 后缀(例:EPSG:32651_10_87_-1309_2025),time_range 按月份/年自动写入每个 layer 的 metadata.json。
预期(单年):
ls $RSLEARN_DS/windows/res_10/ | wc -l # 6272
ls $RSLEARN_DS/windows/res_10/ | awk -F_ '{print $NF}' | sort | uniq -c # 6272 2025
ls $RSLEARN_DS/windows/res_10/ | awk -F: '{print $1":"$2}' \
| awk -F_ '{print $1}' | sort | uniq -c
# 4288 EPSG:32650
# 1984 EPSG:32651
多年全量场景
--years 2021,2022,...仍可工作,但 不推荐:
同一 RSLEARN_DS 下混 5 年 windows 会让下游 converter 按 (col,row) 覆盖写,
5 年 OlmoEarth 输出只剩"最后处理的那一年"。请改用00_run_all_years.sh,
让每年走独立的 RSLEARN_DS / OLMOEARTH_DS。
3.4 rslearn dataset prepare
$UV_RUN rslearn dataset prepare \
--root $RSLEARN_DS --group res_10 --workers 16
每个 window × 每个 layer 调一次 LocalLandsatGEE.get_items(),根据 time_range 命中对应的 VRT / freq.tif,把命中结果写到 <window>/items.json。此步只查源、不搬数据,几分钟跑完。
预期:31,360 个 window 目录每个都出现 items.json,内含 13 个 layer 各自命中的 item。
find $RSLEARN_DS/windows/res_10 -name 'items.json' | wc -l # 31360
3.5 rslearn dataset materialize
$UV_RUN rslearn dataset materialize \
--root $RSLEARN_DS --group res_10 --workers 16 --no-use-initial-job
按 items.json 调 GDAL 从 VRT 读原始像素,实时重投影到该 window 的 UTM 50N/51N,裁出 256×256 px @10 m 网格(B8 = 256×256,其余 10 波段降到 128×128),uint16 写到 <window>/layers/<layer>/<bandset>/geotiff.tif。这一步最重,5 年 × 31,360 windows × 13 layers × 2 bandsets ≈ 815,360 tif,几个小时到一天。
预期(单年):
n=$(find $RSLEARN_DS/windows/res_10 -name 'geotiff.tif' | wc -l)
echo "$n / 163072" # 6272 windows × 13 layers × 2 bandsets
应等于 163072。远小 → materialize 没跑完,直接 YEAR=<year> bash 03_run 重跑(幂等)。
与 JSON 清单对账
确认单年 windows 与 hangzhou_olmoearth_windows.json 几何一致(名字 + projection + bounds 全等),且每个 (window, layer, bandset) 都有非空 .tif:
$UV_RUN python scripts/hangzhou/verify_windows_against_json.py \
--ds_path $RSLEARN_DS \
--name-suffixes 2025 \
--require-materialized
预期:OK: 6272 windows match JSON × 1 suffixes exactly (names + projection + bounds), all materialized。该脚本三模态(SRTM / CLCD / AWS Landsat)+ 本支线共用,其它三条不需要传 --name-suffixes。
3.6 转 OlmoEarth 单文件格式
$UV_RUN python -m olmoearth_pretrain.dataset_creation.landsat_gee.landsat_gee_to_olmoearth \
--ds_path $RSLEARN_DS \
--olmoearth_path $OLMOEARTH_DS \
--workers 16
按 (col, row) 把单年 × 13 layers 的 geotiff.tif 沿时间维堆成 OlmoEarth 单文件:
-
10_landsat_freq/<crs>_<col>_<row>_20.tif— shape=(10, 128, 128)(1 年 × 10 波段) -
10_landsat_freq/<crs>_<col>_<row>_10.tif— shape=(1, 256, 256)(1 年 × B8 单波段) -
10_landsat_monthly/<crs>_<col>_<row>_20.tif— shape=(120, 128, 128)(12 月 × 10 波段) -
10_landsat_monthly/<crs>_<col>_<row>_10.tif— shape=(12, 256, 256)(12 月 × B8) - 对应
_meta目录:每 window 一份 CSV,记 image_idx / tile_time / start/end_time
预期:
ls $OLMOEARTH_DS/ # 4 个 modality 目录 + 4 个 _meta
ls $OLMOEARTH_DS/10_landsat_freq | wc -l # 12544(6272 × 2 bandsets)
ls $OLMOEARTH_DS/10_landsat_monthly | wc -l # 12544
gdalinfo $OLMOEARTH_DS/10_landsat_monthly/<...>_20.tif \
| grep -c '^Band ' # 120(12 月 × 10)
gdalinfo $OLMOEARTH_DS/10_landsat_monthly/<...>_10.tif \
| grep -c '^Band ' # 12(12 月 × B8)
⚠️ 多年场景的覆盖陷阱:若同一 RSLEARN_DS 里塞了多年 windows(老的
YEARS=2021,...,2025用法),converter 会按 (col,row) 同名覆盖写,5 年 OlmoEarth 输出只剩"最后处理的那 1 年"(monthly/_20.tif 仍 120 bands,但内容只是单年)。当前推荐做法是按年分独立目录跑(YEAR=<int> bash 03_run或bash 00_run_all_years.sh),每年独立${OLMOEARTH_DS_BASE}_<year>/,完全规避此问题。
3.7 抽样验证 OlmoEarth 产物
$UV_RUN python scripts/landsat_gee/verify_landsat_gee.py \
--olmoearth_path $OLMOEARTH_DS \
--sample_n 5
抽 5 个 .tif 查 dtype / CRS / 非零率 / DN 量级。
预期:OK: sampled GEE-Landsat outputs look healthy,DN mean 落在 1000–30000(C2 L1 DN 量纲,与 AWS 那条同量纲)。
注意:如果没有配置输出目录默认输出目录位于:/usr/local/olmo_earth/data中,也就是下表的data/目录。
中间目录详解(rslearn 阶段)
data/landsat_gee_zhejiang/vrt/ [3.1 生成]
├── L89_2021_01.vrt … L89_2025_12.vrt ← 60 个月度 VRT(虚拟,KB 级)
├── L89_2021_freq.tif … L89_2025_freq.tif ← 5 个年度 median(uint16, BIGTIFF, ~3 GB / 年)
data/rslearn_hangzhou_landsat_gee/
├── config.template.json [入仓] 13 layer 模板,含 LOCAL_ROOT_PLACEHOLDER
├── config.json [3.2] sed 替换后的实际 config
└── windows/
└── res_10/ [3.3] 主 group
└── EPSG:32651_10_<col>_<row>_<year>/ ← 每 (tile, 年) 一个目录,共 31,360
├── metadata.json [3.3] bounds + projection + time_range
├── items.json [3.4] prepare 写:13 layer 命中的 item
├── completed [3.5] materialize 完成 sentinel(若 rslearn 版本支持)
└── layers/ [3.5] materialize 写
├── landsat_freq/
│ ├── B8/geotiff.tif ← 1 band, 256×256, uint16, UTM
│ ├── B1_..._B11/geotiff.tif ← 10 bands, 128×128
│ └── */metadata.json ← num_channels + num_timesteps + timestamps
├── landsat_mo01/
│ ├── B8/geotiff.tif
│ └── B1_..._B11/geotiff.tif
… (mo02 .. mo12)
输出目录详解(OlmoEarth 训练格式,最终交付物)
data/olmoearth_hangzhou_landsat_gee/ [3.6 生成]
├── 10_landsat_freq/ ← TimeSpan.YEAR(年度 median)
│ ├── EPSG:32651_<col>_<row>_10.tif ← (5, 256, 256) uint16 B8 stub
│ └── EPSG:32651_<col>_<row>_20.tif ← (50, 128, 128) uint16 10-band stub
├── 10_landsat_freq_meta/
│ └── EPSG:32651_10_<col>_<row>.csv ← image_idx + tile_time + start/end_time
├── 10_landsat_monthly/ ← TimeSpan.TWO_WEEK(月度)
│ ├── EPSG:32651_<col>_<row>_10.tif ← (60, 256, 256) uint16
│ └── EPSG:32651_<col>_<row>_20.tif ← (600, 128, 128) uint16
└── 10_landsat_monthly_meta/
└── EPSG:32651_10_<col>_<row>.csv
关键约定:
-
.tif文件名格式<crs>_<col>_<row>_<resolution_code>.tif,_10= 10 m 网格(B8 单波段)/_20= 20 m 网格(其余 10 波段),由get_modality_fname+ bandset 决定 - 时间维压在 channel:
C = bands × T,T = 年数(freq)或 年数 × 12(monthly)。文件名里不含年份,所以 converter 必须能把同一 (col, row) 的多年源 tif 按时间排序后 stack;若实现错成"按年覆盖写",输出只剩最后一年(见 3.6 警告) - norm config / model 代码与 AWS Landsat 完全共用
Modality.LANDSAT,无需新增 norm
第3.5步 合并csv
将输出目录中的10_landsat_monthly_meta文件夹改名为:10_landsat_meta,执行以下命令
实际执行命令:
python -m olmoearth_pretrain.dataset_creation.make_meta_summary \
--olmoearth_path /usr/local/olmo_earth/data/olmoearth_hangzhou_landsat_gee_2025 \
--modality landsat
第 4 步 对账(几何完整性)
uv run --extra all-no-flash python scripts/hangzhou/verify_windows_against_json.py \
--ds_path ${RSLEARN_DS_BASE}_2025 \
--name-suffixes 2025 \
--require-materialized
预期:OK: 6272 windows match JSON × 1 suffixes exactly (names + projection + bounds), all materialized。
跑了多年:每个
${RSLEARN_DS_BASE}_<year>/各自跑一遍,--name-suffixes跟年对齐。
verify_windows_against_json.py 是三模态(SRTM / CLCD / AWS Landsat)+ 本支线
共用的对账脚本;原三条不需要传 --name-suffixes(默认行为不变)。
第 5 步 抽样查 OlmoEarth 产物
python scripts/landsat_gee/verify_landsat_gee.py \
--olmoearth_path data/olmoearth_hangzhou_landsat_gee \
--sample_n 5
抽 5 个 tif 查 dtype / CRS / 非零率 / DN 量级(预期 1000–30000,与 AWS 那条
同量纲)。
故障排查
RuntimeError: <year>-<mm> VRT does NOT cover Hangzhou
GEE 当月某些 sub-tile 没下完(可能 export task 失败、或网络中断半途)。回
GEE Code Editor → Tasks 面板,把对应 L89_zhejiang<YYYY>_<MM> task 重跑,
拉回缺失的 sub-tile 到对应源目录,然后重跑 01_build_vrts.sh(或带
SKIP_VRT_BUILD=0 重跑 03_run)。
materialize 跑出很多空 window
通常是源 VRT 范围漏掉了 Hangzhou UTM 50N 西部 —— 01_build_vrts.sh 的硬
校验应该已经在 build 时拦下;如果在 build 时通过但 materialize 仍空,优先
查 GeoTransform 是否被 rasterio / GDAL 误读(部分 vsicurl/vsis3 包装下的 VRT
有过 corner case)。
"I/O error: BIGTIFF=YES required" on annual freq
build_vrts.py 默认开 BIGTIFF。如果你改了源码导致 BIGTIFF 关掉,5632 × 5632
× 17 bands × uint16 ≈ 3.4 GB 单层,接近 4 GB GeoTIFF 上限;保留 BIGTIFF=YES。
5 年合一只剩单年(channel 维不对)
跑完 03_run 后,OlmoEarth tif 总数 12544(= 6272 × 2)看似正常,但 gdalinfo 显示 _freq/_10.tif 只 1 band、_monthly/_20.tif 只 120 bands(而非 50 / 600)→ converter 没沿 channel 维堆叠 5 年,而是按 (col, row) 同名覆盖写,结果只剩最后一个被处理的年份。
排查:
# 1. windows 是不是 5 年都建出来了(应 31360)
ls $RSLEARN_DS/windows/res_10/ | wc -l
ls $RSLEARN_DS/windows/res_10/ | awk -F_ '{print $NF}' | sort | uniq -c
# 2. materialize 是不是 5 年都跑完了(应每年 163072 个 geotiff.tif)
for y in 2021 2022 2023 2024 2025; do
n=$(find $RSLEARN_DS/windows/res_10 -maxdepth 1 -name "*_${y}" \
-exec find {} -name 'geotiff.tif' \; | wc -l)
echo "$y: $n / 163072"
done
# 3. OlmoEarth tif 的 band 数 vs 期望(50 / 600 / 5 / 60)
TIF=$(ls $OLMOEARTH_DS/10_landsat_freq/*_20.tif | head -1)
gdalinfo "$TIF" | grep -c '^Band '
判定:
- windows < 31360 → 3.3 漏建,补建后继续
- 某些年 materialize tif 数远小 → 3.5 漏跑,重跑 03_run(
SKIP_VRT_BUILD=1跳 VRT) - windows + materialize 都齐,但 band 数仍 = 1 年量级 → converter bug,需修
landsat_gee_to_olmoearth.py,让它把 5 年源 tif 按 timestamp 排序后沿 channel 堆叠,而不是按 (col, row) 覆盖写。可临时变通:把OLMOEARTH_DS拆成 5 个年度子目录(OLMOEARTH_DS=.../olmoearth_hangzhou_landsat_gee_2021...),每年单跑一次 3.6 转换。
landsat_freq 数据语义
本支线的 freq layer = 该年 12 个月 VRT 的 逐像素 nanmedian(build_vrts.py
里实现),与原 AWS 支线 GEE STAC 一整年 + rslearn 内部 median 略有不同但
本质等价。用户明确要求"用 12 个月萃取一个中值"。
freq 当前训练不消费(不影响下游)
olmoearth_pretrain/dataset/parse.py:181-183 把 TimeSpan.TWO_WEEK 注释
掉了,dataloader 只读 _monthly,10_landsat_freq/ 全 0 / 不完整 /
缺月份均不影响训练。
如果将来要启用 freq:
- 取消
parse.py:183的# [TimeSpan.YEAR, TimeSpan.TWO_WEEK]注释 - 修
build_vrts.py::build_year_freq的 nodata 处理(目前s.read(masked=True).filled(np.nan)在 uint16 上无效,把 0 当真值进 nanmedian → 边缘像素 median = 0;且 GeoTIFF 不应再设nodata=0,会让 GDAL warp drop 0 像素) - 重 build freq.tif + 重 materialize landsat_freq layer + 重 converter
清理 / 回滚
本支线全部新增文件、零修改原 AWS 那条;回滚只需:
rm -rf ${RSLEARN_DS_BASE}_* # 所有 _2021 .. _2025 目录
rm -rf ${OLMOEARTH_DS_BASE}_*
rm -rf data/rslearn_hangzhou_landsat_gee # 老的无后缀目录(若残留)
rm -rf data/olmoearth_hangzhou_landsat_gee
rm -rf data/landsat_gee_zhejiang
rm -rf olmoearth_pretrain/dataset_creation/landsat_gee
rm -rf scripts/landsat_gee
rm -rf tests/unit/landsat_gee
rm docs/杭州Landsat-GEE-运行指南.md
# verify_windows_against_json.py 的 --name-suffixes 参数也可以 revert 那一个 commit
原 AWS Landsat 支线零影响。