Python批量下载哨兵1号精密轨道数据方法与技巧

在 Sentinel1 A/B,SAR影像预处理阶段需要用到精密轨道数据产品

一、单个下载

在影像数量不大时可以选择自己手动逐个下载,具体步骤是

1. 进入精密轨道文件下载网站地址:Index of /aux_poeorb/ (点击进入)

2. 进入页面后右键查看页面源代码,方便后续查找日期

注意:这里的文件名称中的日期依次是,精密轨道数据产品发布日期,成像前一天日期,成像后一天日期,比如这个S1A_OPER_AUX_POEORB_OPOD_20230315T080814_V20230222T225942_20230224T005942.EOF

文件名中,20230315是精密轨道数据产品发布日期,20230222是成像前一天的日期,20230224是成像后一天的日期,所以这个轨道文件就是20230223这天的精密轨道数据

3. 所以我如果想要查找20230223这天的精密轨道数据产品,即可 crtl + f  全局查找 V20230222,此时就可以匹配到,20230223这天的精轨数据 (注意查找时V后面跟的是影像前一天的日期)

4. 找到需要获取影像日期的精密轨道文件链接,点击进入,此时会提示用户登录 Earthdata 账号,输入自己注册的用户名和密码进行登录,登录成功后网页会自动跳转到精密轨道详细数据页面,点击浏览器返回上一步的按钮  ,回到刚查找到链接的位置处,右键点击链接,将链接另存为

一般下载的文件大小为 4.2MB ,如果下载完之后为几个KB,可能是因为登录失败的原因。

二、批量下载

时序数据处理通常需要用到近百景影像,逐个手动下载较为不便,因此可以使用python中的 requests库 进行数据批量下载,将自己所需要的精密轨道数据日期保存到 data.txt 文件中,将下面的 python 代码复制和  data.txt 放在同一文件夹目录 ,如自己在桌面新建一个 EOFDownloader 的文件夹,其中存放 data.txt 和 EOFDownloader.py 文件。由于每个人网速不同可能会遇到下载报错的情况,这时可以将已经下载好的日期从data.txt文件中删除,再继续下载。

运行前需要安装必要的python库 , pip install tqdm requests

运行前还需要查找到自己登录账号的cookie,否则也会下载失败,具体流程为

1. 进入数据详情页面,再进入开发者模式,可以按F12键直接进入,刷新网页,点击黄色框的文件,向下翻查找到 cookie ,再复制所有的cookie值,粘贴到下面的python代码的 headers 字典中,此时就可以点击运行了。

 data.txt  格式,里面存储的所需要获取精轨数据的日期。

from datetime import datetime, timedelta
import os
import requests
from requests.auth import HTTPBasicAuth
import re
from tqdm import tqdm

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0",
    "cookie": "COOKIE复制放到这个引号里"
}
index_url = "https://s1qc.asf.alaska.edu/aux_poeorb/"

index_text = requests.get(url=index_url, headers=headers).text


def get_pre_date(date_str):
    # 将字符串转换为datetime对象
    date_format = "%Y%m%d"
    date_obj = datetime.strptime(date_str, date_format)
    # 计算前一天和后一天的日期
    previous_day = date_obj - timedelta(days=1)
    # 将datetime对象格式化为字符串
    previous_day_str = previous_day.strftime(date_format)
    return previous_day_str

def get_next_date(date_str):
    # 将字符串转换为datetime对象
    date_format = "%Y%m%d"
    date_obj = datetime.strptime(date_str, date_format)
    # 计算前一天和后一天的日期
    next_day = date_obj + timedelta(days=1)
    # 将datetime对象格式化为字符串
    next_day_str = next_day.strftime(date_format)
    return next_day_str


with open('./data.txt', 'r', encoding='utf-8') as file:
    data_list = [line.strip() for line in file]
per_data_list = [get_pre_date(date) for date in data_list]
# satelliteConstellation = input('输入卫星星座([S1A]或[S1B]): ')
satelliteConstellation = 'S1A'

orbits_dir = './orbit/'
if not os.path.exists(orbits_dir):
    os.makedirs(orbits_dir)

lost_orbit = []
for pre_data in tqdm(per_data_list):
    orbit_restr = r'{}_OPER_AUX_POEORB_OPOD_\d{{8}}T\d{{6}}_V{}T\d{{6}}_\d{{8}}T\d{{6}}.EOF'.format(
        satelliteConstellation, pre_data)
    orbit_list = re.findall(orbit_restr, index_text)
    if len(orbit_list) > 0:
        orbit_name = orbit_list[0]
        orbit_url = "https://s1qc.asf.alaska.edu/aux_poeorb/" + orbit_name
        orbit_file = requests.get(url=orbit_url, headers=headers).text
        eof_name = orbits_dir + orbit_name
        with open(eof_name, 'w', newline='') as fp:
            fp.write(orbit_file)
    else:
        lost_day = get_next_date(pre_data)
        lost_orbit.append(pre_data)

print(f'{lost_orbit},轨道文件缺失!')

如果觉得查找 cookie 较为麻烦,可以直接使用下面的代码,这里只需要修改 EarthData 的用户名和密码即可,username = '''账号''' ,password = '''密码'''

from datetime import datetime, timedelta
import os
import requests
from requests.auth import HTTPBasicAuth
import re
from tqdm import tqdm

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}
index_url = "https://s1qc.asf.alaska.edu/aux_poeorb/"

index_text = requests.get(url=index_url, headers=headers).text


def get_pre_date(date_str):
    # 将字符串转换为datetime对象
    date_format = "%Y%m%d"
    date_obj = datetime.strptime(date_str, date_format)
    # 计算前一天和后一天的日期
    previous_day = date_obj - timedelta(days=1)
    # 将datetime对象格式化为字符串
    previous_day_str = previous_day.strftime(date_format)
    return previous_day_str

def get_next_date(date_str):
    # 将字符串转换为datetime对象
    date_format = "%Y%m%d"
    date_obj = datetime.strptime(date_str, date_format)
    # 计算前一天和后一天的日期
    next_day = date_obj + timedelta(days=1)
    # 将datetime对象格式化为字符串
    next_day_str = next_day.strftime(date_format)
    return next_day_str


with open('./data.txt', 'r', encoding='utf-8') as file:
    data_list = [line.strip() for line in file]
per_data_list = [get_pre_date(date) for date in data_list]
# satelliteConstellation = input('输入卫星星座([S1A]或[S1B]): ')
satelliteConstellation = 'S1A'

orbits_dir = './orbit/'
if not os.path.exists(orbits_dir):
    os.makedirs(orbits_dir)

# print('请输入earthdata官网账号和密码,如若没有请前往https://urs.earthdata.nasa.gov进行注册')

username = '''账号'''
password = '''密码'''

lost_orbit = []
for pre_data in tqdm(per_data_list):
    orbit_restr = r'{}_OPER_AUX_POEORB_OPOD_\d{{8}}T\d{{6}}_V{}T\d{{6}}_\d{{8}}T\d{{6}}.EOF'.format(
        satelliteConstellation, pre_data)
    orbit_list = re.findall(orbit_restr, index_text)
    if len(orbit_list) > 0:
        orbit_name = orbit_list[-1]
        orbit_url = "https://s1qc.asf.alaska.edu/aux_poeorb/" + orbit_name
        orbit_file = requests.get(url=orbit_url, headers=headers,auth=HTTPBasicAuth(username, password)).text
        eof_name = orbits_dir + orbit_name
        with open(eof_name, 'w', newline='') as fp:
            fp.write(orbit_file)
    else:
        lost_day = get_next_date(pre_data)
        lost_orbit.append(pre_data)

print(f'{lost_orbit},轨道文件缺失!')

三、其他批量下载方式

Github上有个项目可以实现批量下载精轨数据,这里把链接放在下面感兴趣的可以try一下

https://github.com/scottstanie/sentineleofhttps://github.com/scottstanie/sentineleof

最后,祝大家科研顺利!

作者:Flame Han

物联沃分享整理
物联沃-IOTWORD物联网 » Python批量下载哨兵1号精密轨道数据方法与技巧

发表回复