请求帮助从旧版sentinelsat(哥白尼开放获取中心)迁移至哥白尼数据空间生态系统
请求帮助从旧版sentinelsat(哥白尼开放获取中心)迁移至哥白尼数据空间生态系统
嘿,我完全懂你想尽量少改动原有工作流的需求——毕竟之前用Excel导出CSV配合sentinelsat脚本一直跑得顺,突然要适配新的哥白尼数据空间生态系统确实头疼。下面给你一套极简修改方案,完全能保留你现有从CSV读坐标日期、批量处理的流程:
第一步:先升级sentinelsat到最新版本
旧版本的sentinelsat不支持新的哥白尼数据空间生态系统API,所以先跑这条命令升级:
pip install --upgrade sentinelsat
第二步:修改你的核心代码(仅改关键部分,其余逻辑完全保留)
原来的代码只需要调整认证信息、API地址,以及一个小细节修复,其余查询、下载、写入CSV的逻辑都不用动。修改后的完整函数如下:
from sentinelsat import SentinelAPI from pathlib import Path from tqdm import tqdm def s5papi(latitude, longitude, startdate, enddate, xy): # 🔴 替换成你在哥白尼数据空间生态系统注册的用户名和密码 # 注意:原来的s5pguest公共账号已经失效,必须用自己注册的账号 username = "你的注册用户名" password = "你的注册密码" # 🔴 新的哥白尼数据空间生态系统Sentinel-5P专属API地址 url = "https://catalogue.dataspace.copernicus.eu/resto/api/collections/Sentinel5P/search.json" lat = str(latitude[xy]) lon = str(longitude[xy]) # 顺手补了个小bug:原来没转字符串,拼接坐标时可能报错 startdate1 = str(startdate[xy]) enddate1 = str(enddate[xy]) point = f"intersects({lat}, {lon})" # 初始化API,新版sentinelsat已经适配新系统的认证逻辑 api = SentinelAPI(username, password, url) tqdm.write('Fetching products...\n') products = api.query( date=(startdate1, enddate1), footprint=point, platformname='Sentinel-5 Precursor', producttype='L2__CH4___' ) if len(products) == 0: tqdm.write('No products found\n') return else: tqdm.write(f'{len(products)} Products found\nFetching Done\n') tqdm.write(f'Total product size : {api.get_products_size(products)} GB\n') tqdm.write('Downloading products...\n') # 下载逻辑完全不变,依然指定你的data目录 api.download_all(products, directory_path=Path('data')) tqdm.write('Download finished.\n') products_df = api.to_dataframe(products) # 控制CSV表头的逻辑也完全保留,不用改 header = True if xy == 0 else False products_df.to_csv(Path('data.csv'), mode="a", header=header) return products_df
关键修改点说明
- 必须用自己注册的账号:新的哥白尼数据空间生态系统不再支持公共访客账号,你得先去完成注册并验证邮箱,否则会返回认证失败
- API地址替换:旧的
s5phub.copernicus.eu/dhus/已经停用,换成新系统的专属目录地址 - 小bug修复:原来的
lon = longitude[xy]没有转成字符串,拼接坐标查询语句时可能触发类型错误,顺手补上了str()转换
额外提示
如果遇到下载速度慢的问题,可以给download_all方法加个并发参数:
api.download_all(products, directory_path=Path('data'), max_connections=5)
备注:内容来源于stack exchange,提问作者msalpiq95




