尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Sentinel-2影像高效下载指南:从L1C/L2A选择到API批量自动化

发布时间:2026/9/29 18:21:04

资讯中心
01
ARTICLE

Sentinel-2影像高效下载指南:从L1C/L2A选择到API批量自动化

Sentinel-2影像高效下载指南:从L1C/L2A选择到API批量自动化
刚开始跑通Sentinel-2下载流程的时候我其实走了不少弯路。那时候对哥白尼数据中心的印象还是老版Open Access Hub结果换了新平台之后界面和接口全变了连注册方式都和以前不一样。后来把查询、下载、批量自动化整条链路梳理清楚才发现很多时间其实都浪费在“不知道选什么产品”和“一个文件一个文件手动点”上。这篇内容就是想把我的处理过程完整拆出来从决定用哪种Sentinel-2数据到注册认证再到网页检索和API批量下载最后到文件校验每一段都讲实际操作里会遇到的问题而不是光贴一个网址给你。1. 先搞清楚要下载的产品再谈效率1.1 L1C和L2A名字就差一位数用途差很多很多人一进哥白尼数据中心就急着搜影像但第一个坑往往不是“搜不到”而是“搜出来一堆你看不懂的产品”。Sentinel-2官方数据产品主要有两大类L1C和L2A。L1C是大气表观反射率产品几何定位精度高但没有做大气校正L2A是大气校正后的地表反射率产品做植被指数、土地利用分类、水体提取这类定量分析时直接用L2A省掉了很多预处理工作。从文件命名上也容易区分S2A_MSIL1C开头的是L1CS2A_MSIL2A开头的是L2A。在哥白尼数据中心的搜索结果里产品类型字段也会明确标出来。我的习惯是如果只是做影像查看、目视解译、或者是做深度学习样本的原始底图L1C完全够用如果要算NDVI、NDWI或者拿去做时间序列分析直接选L2A。有人非要在L2A基础上再自己跑一遍Sen2Cor那就是重复劳动没必要。还有个容易忽略的小点L2A产品的处理时间通常比L1C晚一拍因为地面系统要先对L1C做大气校正才生成L2A。所以你要找“某一天”的影像如果L2A还没有可以看看L1C是否已经上线。另外L1C能覆盖到的地方L2A不一定能覆盖因为大气校正有时会因为云覆盖和数据处理问题缺失部分区域。多搜几天或者放宽时间范围往往比死盯一个日期更效率。1.2 新老平台交替别再守着老网址浪费时间如果你之前收藏的是scihub.copernicus.eu这样的老地址那我要提醒一句这个老版Copernicus Open Access Hub已经逐步退出主流下载通道了。当前的主力平台是哥白尼数据空间生态也就是Copernicus Data Space Ecosystem域名是dataspace.copernicus.eu。新平台不光是网页界面换了底层数据存储和接口也换了支持了S3对象存储和更灵活的OData查询API。最开始我不适应新平台总觉得老站点更顺手。但实际对比之后新平台的搜索响应速度明显更快批量下载方式也更多样。更重要的是新平台的账号体系是独立的你去老平台登录过的账号不一定能在新平台用需要重新注册。所以别再按“哥白尼数据中心”的旧教程去老网址找入口了直接认准新平台首页。新平台的另一个变化是下载文件时不再提供一个直链让你复制到IDM里那么简单而是需要Token认证。这一点对普通用户来说只是多点一次按钮但对写脚本的人来说等于认证方式整个变了。后面第4部分我会细说怎么处理Token和API请求。1.3 单景下载用网页最快没必要上脚本开始讲批量之前我还是先把丑话说在前面如果你只是需要三五景影像别折腾API和Python脚本网页端手动下载反而是最省时间的。点开影像右侧的下载箭头选“Download”就会触发打包下载。整个过程不超过三十秒。我见过很多人为了两三景影像费劲去配环境最后折腾两小时还没跑通这种投入产出比非常不划算。网页端比较适合的场景是单次下载、临时查看、数据量小、不需要自动化。搜索时把模式调成“List”筛选好云量和日期在结果列表里直接下载。窗口会自动记住你上一次的筛选条件第二次再查会更顺手。如果你发现自己需要每周下载、或者一次要下几十上百景那才真正值得花时间把API脚本跑起来。判断标准也很简单打开结果列表如果超过20个产品还打算一页一页翻着下载那就是时候自动化了。2. 哥白尼账号注册与登录几个容易忽略的细节2.1 注册时的密码策略和邮箱验证坑哥白尼数据中心的注册页看起来中规中矩但密码要求比很多平台严格必须同时包含大写字母、小写字母、数字和特殊字符而且长度不能太短。我第一次注册时连续被弹了几次提示才意识到密码里那四种字符类型一个都不能少。建议直接用一段随机生成的强密码记在密码管理器里而不是用自己习惯的短密码硬凑。注册后系统会给你的邮箱发一封验证邮件。这里有个小坑如果没收到验证邮件先看一眼垃圾箱。有些企业邮箱可能把它的邮件标记成垃圾邮件。点邮件里的链接确认后账号状态才会变成可用。我遇到过注册完马上想登录结果提示账号未激活就是因为没点邮箱里的链接。另外注册时填写的“组织”名称只是个人档案信息不会影响下载权限随便填一个能代表你身份或单位的名称就行。真正影响下载权限的是账号类型普通注册用户下载公开的Sentinel系列数据都没问题。2.2 新版登录改用Token脚本也要跟着变新平台的登录模式走的是OAuth 2.0认证网页端登录后会拿到一个短期Token。你在网页上手动下载文件浏览器后台其实就是用Token去请求下载接口。如果想自己写脚本就得先想办法拿到这个Token。获取Token有好几种方式。最简单的是使用账号密码向认证服务发送POST请求。认证地址大概是identity.dataspace.copernicus.eu/auth/realms/CDSE/protocol/openid-connect/token。用Python的requests库可以这样写import requests auth_url https://identity.dataspace.copernicus.eu/auth/realms/CDSE/protocol/openid-connect/token payload { grant_type: password, client_id: cdse-public, username: 你的用户名, password: 你的密码 } res requests.post(auth_url, datapayload) access_token res.json()[access_token]注意这个Token有有效期通常是60分钟左右。过期后需要重新获取不能一直放在脚本里用。所以写下载脚本时把获取Token的逻辑封装成一个函数每次下载前检查Token是否过期如果过期就重新认证这样能少踩很多401报错的坑。2.3 配额限制批量下载前心里要有数哥白尼数据中心对用户下载是有限流和配额控制的。作为匿名或普通注册用户配额会限制每小时的并发请求数量和总下载量。实际操作中如果单线程下一会儿断了或者返回429错误多半就是触发了限流。不同时间段配额压力也不一样。工作日白天全球用户请求多下午时段更容易撞上限流凌晨时段相对宽松。这个规律在不同地区体验会略有差异但整体建议大批量下载安排在低峰时段比如本地时间的深夜或清晨。同时API接口对并发请求数有约束。代码里并发设太高反而容易全部请求失败。我自己的经验是把并发控制在2到4个线程配合等待重试机制整体吞吐量和稳定性都比开10个线程硬冲要好。3. 搜索影像的关键操作范围、时间和云量一次设对3.1 用AOI框选和瓦片网格定位你要的区域哥白尼数据中心网页端支持在地图上框选区域也支持直接输入地理坐标范围。要高效地搜索不要在地图上随便画一个很大的矩形因为范围越大返回结果越多筛选越浪费时间。更专业的做法是先确定你研究区域的UTM所在条带然后直接用对应的Tile编号去搜索。Sentinel-2影像按照固定网格通常叫MGRS切分成瓦片每个瓦片有唯一的编号例如50TLR、50TLQ这种格式。Tile编号在文件名里就能看到。只要你确定研究区落在哪些Tile里搜索时可选的“Tile number”条件能帮你精确锁定。比如研究区在华北平原你可能只需要搜50TLR和50TLQ两个Tile比在图上框一个多边形更精确。不过新手不太清楚自己的研究区域落在哪个Tile这时候还是用地图框选更直观。框选时注意把范围稍微放大一点给边缘对齐留点余量免得之后做镶嵌处理时边缘数据不够。我一般在原范围基础上外扩2到3公里。3.2 时间范围与云量阈值平衡“最新”和“可用”搜索一次Sentinel-2影像时间范围和云量条件是最影响结果的两个参数。时间范围要看你研究需求。如果做物候监测可能想按整月连续搜索如果是找特定事件前后的影像就要把前后窗口留宽。云量条件上很多教程建议设成小于10%但在多云地区比如贵州、四川盆地这个阈值可能一个月都找不到几景无云影像。我的经验是云量阈值要根据实际需求动态调整。如果做单期分类尽量选小于10%如果做时间序列填补缺失可以放到30%甚至50%后续用掩膜把云去掉。宁可先下载再用云掩膜也不要因为阈值设太死导致时间序列断档。搜索结果页面通常按时间排序但你可以切到按云量排序。如果某一期数据云量超过80%而你又必须用到这个日期可以看看同一天内是否有相同Tile的L1C产品有时L2A缺失但L1C能弥补。3.3 千万别小看云量排序多光谱影像选景的隐形规则网页端搜索返回的每一景影像通常会附带一个快照预览图。点开快照可以先目视判断云的分布和位置。云量数字低不代表云不在你的研究区域上。有时候整景云量只有5%但那5%的云恰好覆盖了你关心的区域这种影像如果直接下载后期会很尴尬。更合理的做法是结合云量数字和预览图一起判断。如果是农业分类或地表覆盖分类研究区域是条带状要重点看云是不是覆盖在条带范围内。预览图是缩略图可能看不清细节建议点开大图看到底是哪块被云遮住了。如果多期数据都满足条件我一般会优先选择云量更低的那景。但也要注意同一天同一Tile下不同产品的时间可能略有差异比如在跨界条带时两个Tile都覆盖研究区需要检查它们的拍摄时间是否有差异避免后续做反射率拼接时交界处不连续。4. 批量下载从网页点击到API脚本自动化4.1 网页一个个点下载为什么效率最低网页端手动下载有几个非常明显的瓶颈一是必须逐条点开下载结果页翻页冗长二是浏览器一次只能同时进行几个下载任务而且中途断掉还得手动去下载管理器里找三是下载几十个文件时你很难对每个文件做大小校验下到一半的损坏文件在网页端没有明确的提示。另外一个隐藏瓶颈是Token的状态。网页端用久了Token过期后下载会突然失败你和普通用户第一时间不一定能发现原因。脚本则不同它可以主动检测响应状态码碰到401就重新认证碰到429就等待重试。所以如果你的数据量到了两位数以上认真准备一个下载脚本是完全值得的。批量下载还有一个好处你能精确地把每个文件的下载URL、文件大小、文件落盘位置全部记录下来。日后排查哪个文件没下载成功一条日志就清楚了。这个记录能力是网页端很难做到的。4.2 用Python写一个稳定的下载脚本下面这个脚本是我调过很多轮之后的版本。它先搜索指定范围内的所有产品然后逐个下载。核心逻辑不复杂但处理了认证、搜索、下载三件事import requests import json import os import time # 先获取Token def get_token(username, password): auth_url https://identity.dataspace.copernicus.eu/auth/realms/CDSE/protocol/openid-connect/token payload { grant_type: password, client_id: cdse-public, username: username, password: password } res requests.post(auth_url, datapayload, timeout30) res.raise_for_status() return res.json()[access_token] # 用OData API查询产品 def search_products(token, tile_id50TLR, start_date2024-06-01, end_date2024-06-30): url https://catalogue.dataspace.copernicus.eu/odata/v1/Products params { $filter: fAttributes/OData.CSC.StringAttribute/any(att:att/Name eq tileId and att/OData.CSC.StringAttribute/Value eq {tile_id}) fand Attributes/OData.CSC.StringAttribute/any(att:att/Name eq productType and att/OData.CSC.StringAttribute/Value eq S2MSI2A) fand ContentDate/Start gt {start_date}T00:00:00.000Z fand ContentDate/Start lt {end_date}T23:59:59.999Z, $orderby: ContentDate/Start, $top: 50 } headers {Authorization: fBearer {token}} res requests.get(url, paramsparams, headersheaders, timeout30) res.raise_for_status() return res.json() # 下载单个产品 def download_product(access_token, product_id, local_path): url fhttps://catalogue.dataspace.copernicus.eu/odata/v1/Products({product_id})/$value headers {Authorization: fBearer {access_token}} with requests.get(url, headersheaders, streamTrue, timeout600) as r: r.raise_for_status() with open(local_path, wb) as f: for chunk in r.iter_content(chunk_size8192): f.write(chunk)这里重点说一下搜索接口的$filter参数。它是OData查询语法上半部分筛选tileId和productType下半部分筛选日期。注意日期格式必须是ISO 8601格式如果你只给了2024-06-01有些接口会报格式错误需要补上T00:00:00.000Z这种完整时间戳。另外$top限制了返回条数默认可能只返回10条或20条。如果你需要的影像数超过这个值需要写分页逻辑通过$skip参数翻页或者循环按日期分段搜索避免一次拉几百条数据超时。4.3 并发、重试和断点续传三个必须考虑的细节脚本能跑通只是第一步真正在批量下载中稳定工作需要考虑并发控制、失败重试和断点续传。这三个问题看起来是工程细节但实际下载几百个文件时它们决定了你的脚本是顺利跑完还是一直断。并发方面我建议用concurrent.futures.ThreadPoolExecutor开2到4个线程给每个下载任务分配独立的会话并在线程内随机sleep 0.5到1秒降低触发限流的概率。不要用asyncio或者多进程因为瓶颈通常不在CPU而在远程服务器的速度限制线程数太高反而容易触发429。重试方面对网络超时、连接中断、服务端5xx错误都要做重试机制。最简单的策略是下载失败后等待15秒重试一次再次失败后等待60秒再重试。如果连续三次都失败就把这个文件的下载URL记到日志里跳过并继续下一个而不是让整个脚本卡死。断点续传稍微复杂一些。老的requests库直接下载不太方便支持断点续传建议使用curl命令通过-C -参数下载文件这样中断后再次执行时会自动从断点继续。也可以用aria2c对多个文件做批量下载非常方便但前提是你得先通过OData查询拿到产品URL列表再让aria2去并发拉取。5. 下载后的文件校验与常见故障排查5.1 看懂文件名什么时候、哪个区域、什么级别下载下来的Sentinel-2产品是一个包含SAFE目录结构和一堆JPEG2000、MTD文件的压缩包。文件名本身就是关键信息以S2A_MSIL2A_20240619T023541_N0510_R078_T50TLR_20240619T064315.SAFE.zip为例S2A表示发射星编号A星或B星。MSIL2A表示产品级别是L2A。20240619T023541是采集日期和时间也就是卫星获得数据的时间。N0510表示处理基线版本。R078表示轨道编号。T50TLR表示MGRS瓦片编号。末尾的时间戳表示该L2A产品实际生成的时间通常比采集时间晚几个小时。理解文件名能帮你快速判断这个文件拍摄于什么时候、处理到什么级别、覆盖位置在哪。在批量整理目录时我会建议直接把文件名按日期排序建文件夹比如2024/06/19/不要把几百个ZIP都丢到一个目录里否则后期想清理过期数据非常痛苦。5.2 文件完整性检查避免“下到一半”的数据坑下载过程中最怕的就是表面上下载完成实际文件损坏。最简单的检查方式是看你下载的ZIP文件大小与官网上大小是否一致。脚本里可以在请求响应的Headers中读取Content-Length字段和落盘文件大小做比较。如果两者不一致说明下载中断或文件未完整写入需要删除重新下载。更专业的校验是对比MD5或SHA256哈希值。哥白尼数据中心的产品元数据里通常包含对应文件的校验值但普通用户的下载接口不一定每次都能直接获取到。在没拿到校验值的情况下先用大小对比再用一个简单的解压测试import zipfile def is_valid_zip(path): try: with zipfile.ZipFile(path) as zf: badfile zf.testzip() return badfile is None except Exception: return False如果解压太慢也可以只读取压缩包的中央目录快速判断文件头是否完整。对于批量下载我会在脚本中每下载完一个文件就执行一次大小校验失败则重试最大重试次数设为两次。这样可以避免整批文件都下载完才发现有十几个文件损坏又要全部重新拉取。5.3 一张速查表解决90%下载报错我整理了一下实践中最常见的下载异常遇到问题时不用再去论坛里翻帖直接按下面这个表排查错误现象常见原因处理办法401 UnauthorizedToken过期或未携带Authorization头重新获取Token检查脚本中认证逻辑403 Forbidden账号无权限或IP被临时封禁检查账号状态稍后再试429 Too Many Requests触发下载限额或并发过高降低线程数增加等待时间404 Not Found产品已被删除或URL拼写错误通过OData重新查询产品ID连接超时/ReadTimeout网络波动或远端负载过高增加timeout值启用重试机制下载中断后文件大小不一致网络不稳定或磁盘空间不足删除重建启用断点续传压缩包无法解压下载时文件没有完整写入校验大小重新下载这里要特别提醒的是403错误。有时候你账号没问题但短时间内大量下载触发了服务端的IP安全策略它会临时封禁IP一小段时间。遇到这种情况不要硬刷停止下载十五到三十分钟再继续比一直重试更容易恢复。我碰过一次连续下载几百景后突然被403后来发现等一段时间再下载就正常了应该是服务端的临时策略。另外如果下载的是L2A产品有些时间段数据量特别大单文件体积可能到800MB到1GB。要确保磁盘空间充足我一般会给批量下载目录留出至少两倍于所有产品总大小的空间防止空间不足导致文件只写了一半。最后再说一个我自己常用的习惯每次批量下载前先把搜索结果导出一个CSV记录文件名、产品ID、大小、下载日期。这样后续万一哪一景数据丢了翻一下CSV就能定位不需要重新搜一遍。高效获取Sentinel-2影像说到底就是把“查询-下载-校验”这条链路每一步都做扎实批量任务才不会一次次卡在同一个地方。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。