English | 中文
一个轻量级的 Go 命令行工具,用于查询并下载 Sentinel-1(SAR 雷达)和 Sentinel-2(多光谱光学)卫星影像。支持多种数据源、网页与终端配置向导、断点续传、自动 RGB 合成与去黑边裁切,输出为 Cloud Optimized GeoTIFF(COG)。纯 Go 标准库实现,零外部 Go 依赖。
当前版本:v2.0.0
- 三种数据源 + Sentinel-1 SAR 支持
- Earth Search STAC(AWS 公开,无需认证)
- CDSE STAC(哥白尼数据空间,按波段 COG)
- CDSE OData(哥白尼数据空间,整景 SAFE ZIP)
- Sentinel-1 GRD / SLC(SAR 雷达数据,VV/VH 极化,不受云影响)
- 配置向导:首次运行自动打开浏览器,也支持终端 SSH 模式
- 友好波段名:
red/green/blue/nir等,自动映射到各数据源对应的资源键 - 智能选景(S2):
clearest-per-tile(每瓦片取最清一景)、cloud-free-cover(贪心集合覆盖,多景缝补成无缝少云底图),配合max_nodata覆盖率过滤剔除“部分条带”;瓦片可-list-tiles干跑预览或自动发现 - 断点续传:基于 HTTP
Range,已下载文件自动跳过 - 并发下载:可配置 worker 池
- RGB / RGBA 合成:通过 GDAL 自动生成 8-bit RGB 合成图,并自动去黑边裁出真实成像范围
- KML 输出:每个影像生成独立 KML 文件,方便在 Google Earth 等软件中预览覆盖范围
- 认证:CDSE Keycloak OAuth2 密码模式,自动刷新 token
git clone <你的仓库地址>
cd sentinel-scraper
go build -o sentinel-scraper .
# 首次运行 — 自动打开浏览器进行配置
./sentinel-scraper首次运行时,如果 ~/.sentinel-scraper/settings.json 不存在,程序会自动启动本地 HTTP 服务并打开浏览器,引导你选择数据源和填写认证信息。配置完成后程序自动继续。
./sentinel-scraper# 网页向导(打开浏览器)
./sentinel-scraper -setup
# 终端向导(无图形界面 / SSH 友好)
./sentinel-scraper -setup-auth| 选项 | 说明 | 认证 |
|---|---|---|
| Earth Search STAC API | AWS 托管的公开 STAC,按波段下载 | 无 |
| CDSE STAC API | 哥白尼数据空间,按波段 COG 下载 | 用户名 + 密码 |
| CDSE OData API | 哥白尼数据空间,整景 SAFE ZIP 下载 | 用户名 + 密码 |
| 自定义 STAC | 任何兼容的 STAC API 端点 | 无 |
- 访问 dataspace.copernicus.eu 注册账号
- 查收验证邮件并完成验证
- 在配置向导中填写 CDSE 登录邮箱与密码
- 保存并继续
配置文件保存在 ~/.sentinel-scraper/settings.json,权限 0600(仅所有者可读写)。密码以明文存储,请妥善保护用户目录权限。
| 维度 | Earth Search STAC | CDSE STAC | CDSE OData | Sentinel-1 |
|---|---|---|---|---|
| 下载粒度 | 单波段 COG(50–200 MB / 波段) | 单波段 COG(50–200 MB / 波段) | 整景 ZIP(500 MB–1 GB+) | 单波段 COG / 整景 ZIP |
| 认证 | 无 | 需 CDSE 账号 | 需 CDSE 账号 | 无 / 需 CDSE 账号 |
| 速度 | 快(AWS CloudFront CDN) | 中等(欧盟直链) | 慢(实时打包 + 大文件) | 中等 |
| 国内访问 | 多数情况下需翻墙 | 多数情况下需翻墙 | 大概率免翻墙 | 大概率免翻墙(OData) |
| 断点续传 | ✅ | ✅ | ✅ | ✅ |
| RGB 合成 | ✅ 自动 | ✅ 自动 | ✅ 自动(解压 R10m B02/B03/B04 后合成) | ❌ SAR 不做 RGB |
| 云量过滤 | ✅ | ✅ | ✅ | ❌ SAR 不受云影响 |
| KML 输出 | ✅ | ✅ | ✅ | ✅ |
选型建议:
- 网络好,追求速度 → Earth Search STAC(默认,最快)
- Earth Search 连不上,或需要官方源 → CDSE STAC(按波段)
- 需要完整 SAFE 产品(含全部波段 + 元数据)或国内免翻墙 → CDSE OData
- 需要 SAR 雷达数据(全天候、穿透云层) → Sentinel-1 GRD/SLC
{
"source": "cdse",
"stac_url": "https://stac.dataspace.copernicus.eu/v1",
"collection": "sentinel-2-l2a",
"auth": {
"username": "your-email@example.com",
"password": "your-password"
}
}source 可取 earth_search(或留空)/ cdse / cdse_odata / custom。
{
"bbox": [116.2, 39.8, 116.6, 40.0],
"start_date": "2026-04-01",
"end_date": "2026-04-15",
"min_cloud": 0,
"max_cloud": 20.0,
"bands": ["red", "green", "blue", "nir"],
"satellite": "sentinel-2-l2a",
"limit": 20,
"max_workers": 4,
"max_retries": 3
}| 字段 | 类型 | 说明 |
|---|---|---|
bbox |
[float64] |
边界框 [西, 南, 东, 北] |
start_date |
string |
起始日期 YYYY-MM-DD |
end_date |
string |
结束日期 YYYY-MM-DD |
min_cloud |
float64 |
最小云量百分比(0–100,仅 Sentinel-2) |
max_cloud |
float64 |
最大云量百分比(0–100,仅 Sentinel-2) |
max_nodata |
float64 |
最大空值像元百分比(0–100,仅 S2),剔除“部分条带”景;100 = 不过滤(默认) |
select_mode |
string |
选景策略(仅 S2):all / clearest-per-tile / cloud-free-cover(见下方智能选景与 CONFIG.md) |
tiles |
[string] |
显式 MGRS 瓦片码(不带 MGRS- 前缀),留空则自动发现,仅 per-tile 模式有效 |
coverage_target |
float64 |
cloud-free-cover 每瓦片目标覆盖率(0–1,默认 0.995) |
max_per_tile |
int |
cloud-free-cover 每瓦片最多叠加景数(默认 6) |
bands |
[string] |
待下载的波段/极化列表(友好名称) |
satellite |
string |
卫星类型:sentinel-2-l2a / sentinel-1-grd / sentinel-1-slc |
limit |
int |
STAC 查询返回上限(默认 20) |
max_workers |
int |
并发下载线程数(默认 4) |
max_retries |
int |
单文件失败重试次数(默认 3) |
针对 Sentinel-2,select_mode 让你只给 bbox 就能得到“少云、无空洞”的镶嵌底图,
无需手动指定瓦片:
| 模式 | 行为 | 适用 |
|---|---|---|
all(默认) |
返回符合云量/覆盖率过滤的全部场景 | 时间序列、样本采集、存档 |
clearest-per-tile |
每个 MGRS 瓦片取最清晰的一景(满覆盖优先) | 快速单期底图 |
cloud-free-cover |
每个瓦片用最少的若干景贪心拼满,自动叠加互补条带填洞 | 无缝少云镶嵌产品 |
配合 max_nodata(如 5)剔除“部分条带”假晴空景。完整说明与示例见 CONFIG.md。
{
"satellite": "sentinel-2",
"bbox": [36.44, -4.51, 40.10, -0.90],
"start_date": "2025-01-01", "end_date": "2026-06-27",
"max_cloud": 5,
"select_mode": "cloud-free-cover",
"bands": ["red", "green", "blue"]
}| 参数 | 默认值 | 说明 |
|---|---|---|
-config |
config.json |
查询配置 JSON 路径 |
-dest |
./sentinel_data |
下载文件保存目录 |
-list-tiles |
— | 按 bbox 自动发现并打印相交的 MGRS 瓦片清单后退出(不下载,干跑预览;仅 S2) |
-default |
— | 生成默认 config.json 后退出 |
-setup |
— | 打开网页配置向导 |
-setup-auth |
— | 打开终端配置向导 |
-version |
— | 打印版本号后退出 |
config.json 中可使用 ${VAR} 引用环境变量:
{
"auth": {
"username": "${CDSE_USERNAME}",
"password": "${CDSE_PASSWORD}"
}
}在 config.json 中使用 友好名称,程序根据数据源自动映射到对应的资源键。
| 友好名称 | Earth Search 键 | Sentinel-2 波段 |
|---|---|---|
coastal |
coastal |
B01 |
blue |
blue |
B02 |
green |
green |
B03 |
red |
red |
B04 |
rededge1 |
rededge1 |
B05 |
rededge2 |
rededge2 |
B06 |
rededge3 |
rededge3 |
B07 |
nir |
nir |
B08 |
nir08 |
nir08 |
B8A |
nir09 |
nir09 |
B09 |
swir16 |
swir16 |
B11 |
swir22 |
swir22 |
B12 |
scl |
scl |
SCL |
| 友好名称 | CDSE Asset 键 | 分辨率 |
|---|---|---|
coastal |
B01_60m |
60m |
blue |
B02_10m |
10m |
green |
B03_10m |
10m |
red |
B04_10m |
10m |
rededge1 |
B05_20m |
20m |
rededge2 |
B06_20m |
20m |
rededge3 |
B07_20m |
20m |
nir |
B08_10m |
10m |
nir08 |
B8A_20m |
20m |
nir09 |
B09_60m |
60m |
swir16 |
B11_20m |
20m |
swir22 |
B12_20m |
20m |
scl |
SCL_20m |
20m |
aot |
AOT_20m |
20m |
wvp |
WVP_10m |
10m |
tci |
TCI_10m |
10m |
例如:
"bands": ["red", "green", "blue"]在 CDSE STAC 模式下会自动下载B04_10m/B03_10m/B02_10m,但保存为<item>_red.tif/<item>_green.tif/<item>_blue.tif,与 RGB 合成流程兼容。
| 友好名称 | STAC Asset 键 | 说明 |
|---|---|---|
vv |
vv |
垂直发射 / 垂直接收 |
vh |
vh |
垂直发射 / 水平接收 |
hh |
hh |
水平发射 / 水平接收 |
hv |
hv |
水平发射 / 垂直接收 |
Sentinel-1 数据不受云影响,不支持云量过滤和 RGB 合成。
sentinel_data/
S2A_50TMK_20250105_0_L2A_red.tif
S2A_50TMK_20250105_0_L2A_green.tif
S2A_50TMK_20250105_0_L2A_blue.tif
S2A_50TMK_20250105_0_L2A_nir.tif
S2A_50TMK_20250105_0_L2A_rgba.tif ← RGB + Alpha 去黑边合成图
S2A_50TMK_20250105_0_L2A.kml ← 影像范围 KML
...
CDSE STAC 的源文件为 JPEG 2000(.jp2),GDAL 工具可直接读取。RGB 输出统一拉伸为 8-bit GeoTIFF(固定 0–3000 → 0–255),并通过 gdal_trace_outline + gdalwarp + gdal_merge_simple 生成带 Alpha 通道的 RGBA 影像,自动剔除影像四周的 nodata 黑边。
sentinel_data/
S1A_IW_GRDH_1SDV_20250105_030000_039A_vv.tif
S1A_IW_GRDH_1SDV_20250105_030000_039A_vh.tif
S1A_IW_GRDH_1SDV_20250105_030000_039A.kml
...
Sentinel-1 SAR 数据直接下载为原始极化文件,不做 RGB 合成。
sentinel_data/
S2A_T50TMK_20250105T030529_MSIL2A.zip ← 完整 SAFE 产品
S2A_T50TMK_20250105T030529_MSIL2A_rgba.tif ← 自动 RGB 去黑边
S2A_T50TMK_20250105T030529_MSIL2A.kml ← 范围 KML
...
OData 模式同样会自动从 ZIP 中提取 R10m/B02/B03/B04 三个 JP2 进行 RGB 合成,并执行去黑边流程。完整产品 ZIP 始终保留,可用 SNAP / ENVI 等软件做后续处理。
# 直接构建
go build -o sentinel-scraper .
# 或用 Makefile
make build # 等价于 go build -o sentinel-scraper .
make run # 构建并运行
make fmt # go fmt ./...
make vet # go vet ./...
make clean # 清理产物
make package # Windows + GDAL 工具一并打包
make docker # 构建 Docker 镜像测试:
go test ./...docker build -t sentinel-scraper .
docker run --rm \
-v $(pwd)/config.json:/app/config.json \
-v $(pwd)/sentinel_data:/app/sentinel_data \
sentinel-scraper代码位于 package main,按职责拆分为 9 个 Go 文件:
| 文件 | 职责 |
|---|---|
main.go |
CLI 入口、STAC 流程编排、worker 池 |
config.go |
Config / SearchOptions 结构、配置加载与合并 |
settings.go |
用户级持久化设置、网页 / CLI 配置向导 |
auth.go |
认证抽象、CDSE Keycloak OAuth2 密码模式 |
stac.go |
STAC 搜索与分页、云量/覆盖率过滤、逐瓦片选景(clearest-per-tile / cloud-free-cover 集合覆盖)、按波段下载 |
odata.go |
CDSE OData 搜索、整景 ZIP 下载、JP2 提取与 RGB 合成 |
gdal.go |
GDAL 工具发现、BuildRGB / RGBA 去黑边 |
kml.go |
共享的 KML 写入辅助 |
download.go |
共享的 Range 断点续传与进度显示 |
Q:选哪种数据源?
- 首选 Earth Search:速度最快,AWS CloudFront 全球加速;但部分网络可能不通
- Earth Search 不可达 → 切到 CDSE STAC:按波段下载,文件较小
- 国内免翻墙 / 需要完整 SAFE 产品 → CDSE OData:整景 ZIP,慢但完整
- 需要 SAR 雷达数据(全天候、穿透云层) → Sentinel-1:选择 GRD 或 SLC
Q:Sentinel-1 和 Sentinel-2 有什么区别?
- Sentinel-2:多光谱光学影像,受云影响,适合做植被监测、土地利用等
- Sentinel-1:C 波段 SAR 雷达,不受云影响,适合做地表形变监测、洪水监测、海上目标检测等
- Sentinel-1 不需要云量过滤,也不做 RGB 合成
Q:如何下载 Sentinel-1 数据?
在 config.json 中设置 "satellite": "sentinel-1-grd"(或 "sentinel-1-slc"),"bands": ["vv", "vh"]:
{
"satellite": "sentinel-1-grd",
"bands": ["vv", "vh"],
"bbox": [116.2, 39.8, 116.6, 40.0],
"start_date": "2026-04-01",
"end_date": "2026-04-15"
}Q:下载失败 / 超时怎么办?
- Earth Search / CDSE STAC:每个文件约 50–200 MB,单文件超时 10 分钟
- CDSE OData:整景 ZIP 通常 500 MB–1 GB+,单文件超时 30 分钟
- 网络不稳定时,调高
config.json中的max_retries(如 3 或 5) - 中断后重新运行会自动断点续传
Q:如何一步得到“无缝、少云”的镶嵌底图?
Sentinel-2 设 "select_mode": "cloud-free-cover" + "max_cloud": 5,tiles 留空。
程序会按 bbox 自动发现所有相交瓦片,每个瓦片用最少的若干景贪心拼满(自动叠加互补
条带填补“部分条带”空洞),得到全程 <5% 云、无空洞的结果。想先看会下哪些瓦片,可先
sentinel-scraper -list-tiles -config config.json 干跑预览。详见 CONFIG.md。
Q:搜索没有返回数据?
- 确认日期范围在 Sentinel-2 归档时间内
- 确认 bbox 在陆地范围内
- 调高
max_cloud或暂时去掉云量限制 - 不同数据源的覆盖时间略有差异
Q:如何切换数据源?
./sentinel-scraper -setup随时可以切换,已下载的文件不受影响。
Q:能否使用自定义 STAC API?
可以。在配置向导中选择"自定义 STAC API",填写端点 URL 和 Collection 名称。
MIT