利用Python自动化获取Sentinel-1精密轨道数据:从环境配置到批量下载实战

张开发
2026/4/19 13:16:42 15 分钟阅读

分享文章

利用Python自动化获取Sentinel-1精密轨道数据:从环境配置到批量下载实战
1. 环境准备与依赖安装搞遥感数据处理的朋友都知道Sentinel-1卫星的精密轨道数据Precise Orbit Data是InSAR处理的关键输入。但手动下载这些数据简直是场噩梦 - 每次都要在ESA的网站上点来点去遇到大时间范围的数据需求更是让人崩溃。我去年处理一个项目时需要下载3年的轨道数据手动操作花了整整两天还漏了几十个文件。后来痛定思痛研究出了这套Python自动化方案现在同样的工作量5分钟就能搞定。首先得准备好Python环境。我强烈建议使用Python 3.8或更高版本因为data_downloader这个神器库对旧版本支持不太好。安装过程很简单pip install data_downloader这里有个坑我踩过 - 如果你之前装过旧版的data_downloader比如1.0版本必须升级到1.1以上才能支持Sentinel-1轨道数据下载。升级命令也很简单pip install data_downloader -U验证安装是否成功可以跑个简单测试from data_downloader import __version__ print(f当前data_downloader版本{__version__}) # 应该显示1.1或更高2. NASA Earthdata认证配置下载精密轨道数据需要NASA Earthdata的账号认证这个步骤很多新手容易栽跟头。我见过不少人在这一步卡住最后发现是认证配置没做好。原理其实很简单 - 我们需要把登录凭证安全地存储在.netrc文件里。先在Earthdata官网注册个账号如果还没有的话。然后执行这段Python代码配置认证from data_downloader import downloader netrc downloader.Netrc() netrc.add(urs.earthdata.nasa.gov, 你的用户名, 你的密码) print(netrc) # 检查配置是否正确这里有几个实用技巧.netrc文件默认存放在用户目录下Linux/Mac是~/.netrcWindows是%USERPROFILE%/_netrc如果遇到权限问题记得给.netrc设置600权限chmod 600 ~/.netrc建议用print(netrc)检查下配置确保没有手误输错用户名密码我团队里有位同事曾经因为.netrc文件权限设置不对折腾了一下午都没下载成功。后来发现是Windows系统下文件名应该是_netrc而不是.netrc这个细节文档里很少提到。3. 精密轨道数据下载实战终于到重头戏了Sentinel-1的轨道数据主要分两类精密轨道数据(aux_poeorb)精度最高延迟约20天发布辅助数据(aux_cal)包含各种校准参数先设置好下载目录我习惯用Pathlib管理路径比直接写字符串更可靠from pathlib import Path from data_downloader import downloader, services # 设置下载目录 folder_cal Path(/data/sentinel1/aux_cal) # 辅助数据 folder_preorb Path(/data/sentinel1/poeorb) # 精密轨道数据 # 创建目录如果不存在 folder_cal.mkdir(parentsTrue, exist_okTrue) folder_preorb.mkdir(parentsTrue, exist_okTrue)3.1 下载辅助数据辅助数据相对简单因为不需要指定时间范围s1_orbit services.SentinelOrbit() urls_cal s1_orbit.cal_urls(platformall) # 获取S1A和S1B的所有辅助数据链接 downloader.async_download_datas(urls_cal, folderfolder_cal)这里用了异步下载(async_download_datas)因为辅助数据文件通常较小但数量多异步方式能大幅提升下载速度。实测下来用异步比同步下载快3-5倍。3.2 下载精密轨道数据精密轨道数据需要指定时间范围和卫星平台S1A或S1Burls_preorb s1_orbit.poeorb_urls( date_start20230101, date_end20230331, platformS1A # 也可以是S1B或all ) downloader.download_datas(urls_preorb, folderfolder_preorb)这里有几个实用参数可以调整platform指定卫星平台S1A、S1B或alldate_start/date_end格式为YYYYMMDDproduct_type默认为AUX_POEORB也可以下载其他类型我处理过一个项目需要下载2014-2023年的全部轨道数据代码只需要改下日期范围就行完全不用人工干预。期间网络断了三次都自动续传成功了特别省心。4. 高级技巧与问题排查4.1 断点续传实战data_downloader内置的断点续传功能是我最喜欢的特点。有次我在下载800多个轨道文件时突然断电本以为要重头开始结果重新运行脚本后它自动跳过了已下载的文件只下载缺失的部分。原理是它会检查目标文件夹里是否已存在同名文件并且通过文件大小校验是否完整。如果你想强制重新下载可以加个参数downloader.download_datas(urls_preorb, folderfolder_preorb, overwriteTrue)4.2 代理设置与下载优化在国内直接连NASA服务器有时速度不太理想。我们可以通过设置代理来改善downloader.set_proxy(http://your_proxy:port)如果下载大批量数据建议添加延迟避免被封downloader.download_datas(urls_preorb, folderfolder_preorb, delay1) # 1秒间隔4.3 常见错误排查认证失败检查.netrc文件格式是否正确特别是注意空格和换行连接超时尝试设置更长的超时时间默认是30秒downloader.set_timeout(120) # 设置为120秒文件损坏偶尔会遇到下载不完整的情况可以手动删除文件重新下载我整理了个错误代码速查表错误现象可能原因解决方案401 Unauthorized.netrc配置错误检查用户名密码确认主机名是urs.earthdata.nasa.govConnection timeout网络问题设置更长超时或启用代理404 Not Found文件不存在检查日期范围是否有效5. 批量下载实战案例去年我们团队需要处理一个覆盖东南亚地区、时间跨度5年的Sentinel-1数据集。手动下载轨道数据根本不现实于是我写了这个脚本from datetime import datetime, timedelta def batch_download_orbits(start_date, end_date, platformS1A): current datetime.strptime(start_date, %Y%m%d) end datetime.strptime(end_date, %Y%m%d) while current end: next_month current timedelta(days31) date_start current.strftime(%Y%m%d) date_end min(next_month, end).strftime(%Y%m%d) print(f下载 {date_start} 到 {date_end} 的数据) urls s1_orbit.poeorb_urls( date_startdate_start, date_enddate_end, platformplatform ) downloader.download_datas(urls, folderfolder_preorb) current next_month timedelta(days1) # 使用示例 batch_download_orbits(20180101, 20221231, platformall)这个脚本把5年的数据按月份分批下载既避免了单次请求数据量过大又方便跟踪进度。总共下载了约1.2TB数据用了不到两天就完成了期间网络断了七八次都自动恢复了。6. 数据管理与后续处理下载完的数据需要妥善管理。我的经验是按照卫星平台和日期组织目录结构/sentinel1_orbits /S1A /2023 /01 /02 ... /2022 ... /S1B /2023 ...可以用这个Python代码自动整理for file in folder_preorb.glob(*.EOF): # 文件名示例S1A_OPER_AUX_POEORB_OPOD_20230101T120000_V20221231T225942_20230102T005942.EOF parts file.name.split(_) platform parts[0] # S1A或S1B date parts[5][1:9] # 20230101 year date[:4] month date[4:6] target_dir folder_preorb / platform / year / month target_dir.mkdir(parentsTrue, exist_okTrue) file.rename(target_dir / file.name)对于后续的InSAR处理我通常会用PyAPS或者自己写的工具来读取这些轨道数据。这里有个简单的检查数据是否可用的代码片段def check_eof_file(filepath): 检查EOF文件是否完整 try: with open(filepath, r) as f: lines f.readlines() return len(lines) 100 # 粗略检查 except: return False这套自动化方案在我们团队已经稳定运行了两年多累计下载了超过5TB的轨道数据。最大的优势不仅是节省时间更重要的是保证了数据完整性 - 再也不会因为人为疏忽漏下载某些文件了。对于需要处理大量Sentinel-1数据的研究者来说这种自动化方法绝对是必备技能。

更多文章