第一次接触USGS批量下载时,我被官网复杂的操作界面弄得晕头转向。经过多次实践后发现,整个流程其实可以拆解为三个关键环节:数据筛选、批量订单创建、BDA程序执行。每个环节都有需要特别注意的技术细节,这些细节往往决定了下载效率和成功率。
数据筛选阶段最容易犯的错误是忽略云量设置。USGS的Sentinel-2和Landsat数据默认会显示所有可用影像,但实际工作中我们往往需要云覆盖率低于10%的清晰影像。在"Additional Criteria"选项卡里,有个Cloud Cover的滑动条,建议设置为0-10%范围。这里有个实用技巧:可以先放宽到30%查看结果分布,再逐步缩小范围。
批量订单创建环节最让人头疼的是文件管理。USGS默认会为每景影像生成随机文件名,这在后期处理时会造成识别困难。我的经验是在"Product Options"里勾选"Use Entity ID for Filename",这样下载的文件会自动包含影像编号和日期信息。曾经有个项目因为文件名混乱导致重复下载了200多景数据,浪费了整整两天时间。
BDA(Bulk Download Application)是USGS批量下载的核心工具,但它的安装过程堪称"新手劝退器"。最大的坑在于Java环境配置,官方文档说需要Java 10+,但实测发现OpenJDK 17最稳定。安装时要注意三点:第一,必须将JAVA_HOME环境变量指向解压后的JDK目录;第二,系统Path变量需要添加%JAVA_HOME%\bin;第三,安装完成后要用命令行执行java -version验证。
Windows用户常遇到的问题是防火墙拦截。BDA需要持续的网络连接,如果下载中途中断,很可能是被Windows Defender阻止了。解决方法是在防火墙设置里为javaw.exe添加出入站规则。我建议在首次运行BDA时就进行这个设置,否则等下载到一半出错会更麻烦。
Linux环境下有个特殊配置技巧:创建软链接将默认java指向新安装的JDK。命令如下:
bash复制sudo update-alternatives --install /usr/bin/java java /opt/jdk-17/bin/java 1
sudo update-alternatives --config java
批量下载的效率瓶颈往往出现在网络连接和磁盘IO上。BDA的设置界面里有几个关键参数需要调整:
对于需要长期运行的下载任务,强烈建议启用"Resume Partial Downloads"选项。这个功能可以在网络中断后继续未完成的下载,而不是重新开始。实测能节省约40%的下载时间,特别是对于大体积的Landsat数据。
存储路径的设置也有讲究。我的习惯是按项目创建层级目录结构:
code复制├── Sentinel-2
│ ├── 2023
│ │ ├── 01_January
│ │ └── 02_February
└── Landsat
├── Path123
│ └── Row045
└── Path124
└── Row046
对于需要定期获取数据的项目,手动操作效率太低。我开发了一套Python自动化脚本,主要实现三个功能:
核心代码如下:
python复制import requests
from datetime import datetime
def query_usgs_api(bbox, start_date, end_date):
base_url = "https://m2m.cr.usgs.gov/api/api/json/stable/"
payload = {
"datasetName": "sentinel_2a",
"maxResults": 100,
"bbox": bbox,
"startDate": start_date,
"endDate": end_date
}
response = requests.post(base_url + "scene-search", json=payload)
return response.json()
def generate_bda_order(scene_list):
order_template = """<?xml version="1.0"?>
<order>
{scenes}
</order>"""
scene_template = '<scene entityId="{}" productId="STANDARD"/>'
scenes = "\n".join([scene_template.format(scene) for scene in scene_list])
return order_template.format(scenes=scenes)
这个脚本配合Windows任务计划程序或Linux的cron,可以实现全自动的数据更新。我在一个气象监测项目中应用后,数据获取效率提升了6倍。
下载过程中最常遇到的错误是"Authentication Failed"。这个问题90%的情况不是因为密码错误,而是USGS的API限制。解决方法有三步:首先确认账号在USGS官网能正常登录;其次检查系统时间是否准确(误差超过5分钟会导致认证失败);最后尝试在BDA设置里勾选"Use Legacy Authentication"。
另一个高频问题是磁盘空间不足。Sentinel-2的L1C数据每景约500MB-1GB,Landsat 8/9的Level-2数据每景约1.5GB。在开始批量下载前,建议用这个命令估算所需空间:
bash复制# Linux/Mac
df -h /path/to/download
# Windows
wmic logicaldisk get size,freespace,caption
对于下载速度慢的情况,可以尝试更换CDN节点。在BDA的Advanced Settings里,有个"Download Location"选项,切换不同的节点(如AWS US-West、Azure Europe等)可能会有惊喜。我测试过的最佳节点在不同地区有所不同,需要自己实测。
下载完成后的数据校验同样重要。USGS提供了官方校验工具,但命令行操作更方便:
bash复制# Sentinel-2校验
python3 sen2cor.py --validate <scene_folder>
# Landsat校验
landsat_validate <scene_file>
校验不通过的数据要及时重新下载。我的经验法则是:第一次校验失败重试3次,如果仍然失败就记录到错误日志,等全部下载完成后再统一处理。这样可以避免因为个别文件问题中断整个下载流程。
对于需要长期存储的数据,建议生成MD5校验文件:
bash复制find . -type f -name "*.jp2" -exec md5sum {} + > checksums.md5
后期可以通过比对校验值快速发现损坏文件。