2019-01-16 19:40:08 +00:00
#!/usr/bin/env python3
import numpy as np
import requests
2021-05-04 05:06:54 +00:00
import re
2019-01-16 19:40:08 +00:00
import os
import argparse
import datetime
from html . parser import HTMLParser
2021-05-04 05:06:54 +00:00
server = ' https://scihub.copernicus.eu/gnss/ '
2019-01-16 19:40:08 +00:00
2021-05-04 05:06:54 +00:00
orbitMap = [ ( ' precise ' , ' AUX_POEORB ' ) ,
( ' restituted ' , ' AUX_RESORB ' ) ]
2019-01-16 19:40:08 +00:00
datefmt = " % Y % m %d T % H % M % S "
queryfmt = " % Y- % m- %d "
2021-03-09 19:43:13 +00:00
queryfmt2 = " % Y/ % m/ %d / "
2021-05-04 05:06:54 +00:00
#Generic credentials to query and download orbit files
credentials = ( ' gnssguest ' , ' gnssguest ' )
2019-01-16 19:40:08 +00:00
def cmdLineParse ( ) :
'''
Command line parser .
'''
parser = argparse . ArgumentParser ( description = ' Fetch orbits corresponding to given SAFE package ' )
parser . add_argument ( ' -i ' , ' --input ' , dest = ' input ' , type = str , required = True ,
2021-03-09 19:43:13 +00:00
help = ' Path to SAFE package of interest ' )
2019-01-16 19:40:08 +00:00
parser . add_argument ( ' -o ' , ' --output ' , dest = ' outdir ' , type = str , default = ' . ' ,
2021-03-09 19:43:13 +00:00
help = ' Path to output directory ' )
2019-01-16 19:40:08 +00:00
return parser . parse_args ( )
def FileToTimeStamp ( safename ) :
'''
Return timestamp from SAFE name .
'''
safename = os . path . basename ( safename )
fields = safename . split ( ' _ ' )
2020-05-15 03:31:45 +00:00
sstamp = [ ] # sstamp for getting SAFE file start time, not needed for orbit file timestamps
2019-01-16 19:40:08 +00:00
try :
tstamp = datetime . datetime . strptime ( fields [ - 4 ] , datefmt )
2020-05-15 03:31:45 +00:00
sstamp = datetime . datetime . strptime ( fields [ - 5 ] , datefmt )
2021-03-09 19:43:13 +00:00
except :
p = re . compile ( r ' (?<=_) \ d {8} ' )
dt2 = p . search ( safename ) . group ( )
2019-01-16 19:40:08 +00:00
tstamp = datetime . datetime . strptime ( dt2 , ' % Y % m %d ' )
satName = fields [ 0 ]
2020-05-15 03:31:45 +00:00
return tstamp , satName , sstamp
2019-01-16 19:40:08 +00:00
class MyHTMLParser ( HTMLParser ) :
2021-05-04 05:06:54 +00:00
def __init__ ( self , url ) :
2019-01-16 19:40:08 +00:00
HTMLParser . __init__ ( self )
self . fileList = [ ]
2021-03-09 19:43:13 +00:00
self . _url = url
2021-05-04 05:06:54 +00:00
2019-01-16 19:40:08 +00:00
def handle_starttag ( self , tag , attrs ) :
2021-05-04 05:06:54 +00:00
for name , val in attrs :
if name == ' href ' :
if val . startswith ( " https://scihub.copernicus.eu/gnss/odata " ) and val . endswith ( " )/ " ) :
pass
else :
downloadLink = val . strip ( )
downloadLink = downloadLink . split ( " /Products( ' Quicklook ' ) " )
downloadLink = downloadLink [ 0 ] + downloadLink [ - 1 ]
self . _url = downloadLink
2021-03-09 19:43:13 +00:00
def handle_data ( self , data ) :
2021-05-04 05:06:54 +00:00
if data . startswith ( " S1 " ) and data . endswith ( " .EOF " ) :
self . fileList . append ( ( self . _url , data . strip ( ) ) )
2019-01-16 19:40:08 +00:00
def download_file ( url , outdir = ' . ' , session = None ) :
'''
Download file to specified directory .
'''
if session is None :
session = requests . session ( )
2021-05-04 05:06:54 +00:00
path = outdir
2019-01-16 19:40:08 +00:00
print ( ' Downloading URL: ' , url )
2021-05-04 05:06:54 +00:00
request = session . get ( url , stream = True , verify = True , auth = credentials )
2019-01-16 19:40:08 +00:00
try :
val = request . raise_for_status ( )
success = True
except :
success = False
if success :
2021-03-09 19:43:13 +00:00
with open ( path , ' wb ' ) as f :
2019-01-16 19:40:08 +00:00
for chunk in request . iter_content ( chunk_size = 1024 ) :
if chunk :
f . write ( chunk )
f . flush ( )
return success
def fileToRange ( fname ) :
'''
Derive datetime range from orbit file name .
'''
fields = os . path . basename ( fname ) . split ( ' _ ' )
start = datetime . datetime . strptime ( fields [ - 2 ] [ 1 : 16 ] , datefmt )
stop = datetime . datetime . strptime ( fields [ - 1 ] [ : 15 ] , datefmt )
mission = fields [ 0 ]
return ( start , stop , mission )
if __name__ == ' __main__ ' :
'''
Main driver .
'''
inps = cmdLineParse ( )
2020-05-15 03:56:14 +00:00
fileTS , satName , fileTSStart = FileToTimeStamp ( inps . input )
2019-01-16 19:40:08 +00:00
print ( ' Reference time: ' , fileTS )
print ( ' Satellite name: ' , satName )
match = None
session = requests . Session ( )
2021-03-09 19:43:13 +00:00
2019-01-16 19:40:08 +00:00
for spec in orbitMap :
oType = spec [ 0 ]
2021-05-04 05:06:54 +00:00
delta = datetime . timedelta ( days = 1 )
timebef = ( fileTS - delta ) . strftime ( queryfmt )
timeaft = ( fileTS + delta ) . strftime ( queryfmt )
url = server + ' search?q=( beginPosition:[ {0} T00:00:00.000Z TO {1} T23:59:59.999Z] AND endPosition:[ {0} T00:00:00.000Z TO {1} T23:59:59.999Z] ) AND ( (platformname:Sentinel-1 AND filename: {2} _* AND producttype: {3} ))&start=0&rows=100 ' . format ( timebef , timeaft , satName , spec [ 1 ] )
2019-01-16 19:40:08 +00:00
success = False
match = None
2021-05-04 05:06:54 +00:00
2019-01-16 19:40:08 +00:00
try :
2021-05-04 05:06:54 +00:00
r = session . get ( url , verify = True , auth = credentials )
r . raise_for_status ( )
parser = MyHTMLParser ( url )
parser . feed ( r . text )
for resulturl , result in parser . fileList :
tbef , taft , mission = fileToRange ( os . path . basename ( result ) )
if ( tbef < = fileTSStart ) and ( taft > = fileTS ) :
matchFileName = result
2021-05-07 07:57:36 +00:00
match = resulturl
2021-03-17 13:20:52 +00:00
if match is not None :
success = True
2021-03-09 19:43:13 +00:00
except :
2019-01-16 19:40:08 +00:00
pass
2021-03-14 13:11:21 +00:00
2021-03-12 15:36:45 +00:00
if success :
break
2021-03-14 13:11:21 +00:00
2021-03-12 15:36:45 +00:00
if match is not None :
2021-05-04 05:06:54 +00:00
output = os . path . join ( inps . outdir , matchFileName )
res = download_file ( match , output , session )
2021-03-12 15:36:45 +00:00
if res is False :
print ( ' Failed to download URL: ' , match )
else :
print ( ' Failed to find {1} orbits for tref {0} ' . format ( fileTS , satName ) )