2026-06-04 landsat8/9 数据处理管道

杭州 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-tile
    
    每个文件叫 L89_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.sh preflight 会检查)。
  • 本地无数据 → 所有真数据步骤在远端服务器跑。本地只跑单元测试(合成
    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-download GEE 月度导出根目录
LANDSAT_GEE_VRT /usr/local/olmo_earth/data/landsat_gee_zhejiang/vrt VRT 输出(跨年共享)
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 同上
WORKERS 16 rslearn / converter 并行度
FREQ_WORKERS 0 freq median 并行;0 = auto。注:freq 当前训练不消费,见末尾"freq 不消费"说明
MIN_FREE_GB 100 单年磁盘门槛
SKIP_VRT_BUILD 0 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,做两件事:

  1. 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 Hangzhou fail-loud,提示回 GEE 重导。
  2. 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_runbash 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-183TimeSpan.TWO_WEEK 注释
掉了,dataloader 只读 _monthly,10_landsat_freq/ 全 0 / 不完整 /
缺月份均不影响训练。

如果将来要启用 freq:

  1. 取消 parse.py:183# [TimeSpan.YEAR, TimeSpan.TWO_WEEK] 注释
  2. 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 像素)
  3. 重 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 支线零影响。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容