Commit 911d2933d722733dba935f98898b88b9fef9c2b8

Authored by Hagolle
0 parents
Exists in master

initial project version

Showing 3 changed files with 234 additions and 0 deletions   Show diff stats
download_landsat_scene.py 0 → 100644
  1 +++ a/download_landsat_scene.py
... ... @@ -0,0 +1,231 @@
  1 +#! /usr/bin/env python
  2 +# -*- coding: iso-8859-1 -*-
  3 +import os,sys,math,urllib2,urllib
  4 +import optparse
  5 +###########################################################################
  6 +class OptionParser (optparse.OptionParser):
  7 +
  8 + def check_required (self, opt):
  9 + option = self.get_option(opt)
  10 +
  11 + # Assumes the option's 'default' is set to None!
  12 + if getattr(self.values, option.dest) is None:
  13 + self.error("%s option not supplied" % option)
  14 +
  15 +#############################"Connection à Earth explorer sans proxy
  16 +
  17 +def connect_earthexplorer_proxy(usgs,proxy):
  18 +
  19 + proxy_info = {
  20 + 'user' : proxy['account'],
  21 + 'pass' : proxy['passwd'],
  22 + 'host' : 'proxy.myproxy.int',
  23 + 'port' : 8050
  24 + }
  25 + # contruction d'un "opener" qui utilise une connexion proxy avec autorisation
  26 + proxy_support = urllib2.ProxyHandler({"http" : "http://%(user)s:%(pass)s@%(host)s:%(port)d" % proxy_info,
  27 + "https" : "http://%(user)s:%(pass)s@%(host)s:%(port)d" % proxy_info})
  28 + opener = urllib2.build_opener(proxy_support, urllib2.HTTPCookieProcessor)
  29 +
  30 + # installation
  31 + urllib2.install_opener(opener)
  32 +
  33 + # parametres de connection
  34 + params = urllib.urlencode(dict(username=usgs['account'], password=usgs['passwd']))
  35 +
  36 + # utilisation
  37 + f = opener.open('https://earthexplorer.usgs.gov/login', params)
  38 + data = f.read()
  39 + f.close()
  40 +
  41 + return
  42 +
  43 +#############################"Connection à Earth explorer sans proxy
  44 +
  45 +def connect_earthexplorer_no_proxy(usgs):
  46 + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
  47 + urllib2.install_opener(opener)
  48 + params = urllib.urlencode(dict(username=usgs['account'],password= usgs['passwd']))
  49 + f = opener.open("https://earthexplorer.usgs.gov/login/", params)
  50 + data = f.read()
  51 + f.close()
  52 + if data.find('You must sign in as a registered user to download data or place orders for USGS EROS products')>0 :
  53 + print "Authentification failed"
  54 + sys.exit(-1)
  55 + return
  56 +
  57 +#############################"pour des gros fichiers
  58 +
  59 +def downloadChunks(url,rep,nom_fic):
  60 + """Telecharge de gros fichiers par morceaux
  61 + inspire de http://josh.gourneau.com
  62 + """
  63 +
  64 + try:
  65 + req = urllib2.urlopen(url)
  66 + #taille du fichier
  67 + if (req.info().gettype()=='text/html'):
  68 + print "erreur : le fichier est au format html"
  69 + lignes=req.read()
  70 + if lignes.find('Download Not Found')>0 :
  71 + raise TypeError
  72 + else:
  73 + print lignes
  74 + print sys.exit(-1)
  75 + total_size = int(req.info().getheader('Content-Length').strip())
  76 + if (total_size<50000):
  77 + print "erreur : le fichier est trop petit pour etre une image landsat"
  78 + print url
  79 + sys.exit(-1)
  80 + print nom_fic,total_size
  81 + downloaded = 0
  82 + CHUNK = 1024 * 1024 *8
  83 + with open(rep+'/'+nom_fic, 'wb') as fp:
  84 + while True:
  85 + chunk = req.read(CHUNK)
  86 + downloaded += len(chunk)
  87 + sys.stdout.write(str(math.floor((float(downloaded) / total_size) * 100 )) +'%')
  88 + sys.stdout.flush()
  89 + if not chunk: break
  90 + fp.write(chunk)
  91 + print 'fini'
  92 + except urllib2.HTTPError, e:
  93 + print "HTTP Error:",e.code , url
  94 + return False
  95 + except urllib2.URLError, e:
  96 + print "URL Error:",e.reason , url
  97 + return False
  98 +
  99 + return rep,nom_fic
  100 +
  101 +######################################################################################
  102 +###############""main
  103 +#################################################################################
  104 +
  105 +################Lecture des arguments
  106 +if len(sys.argv) == 1:
  107 + prog = os.path.basename(sys.argv[0])
  108 + print ' '+sys.argv[0]+' [options]'
  109 + print " Aide : ", prog, " --help"
  110 + print " ou : ", prog, " -h"
  111 + print "example (scene): python %s -o scene -a 2013 -d 360 -f 365 -s 199030 -u usgs.txt"%sys.argv[0]
  112 + print "example (liste): python %s -o date -l /home/hagolle/DOCS/TAKE5/liste_landsat8_site.txt -u usgs.txt"%sys.argv[0]
  113 + sys.exit(-1)
  114 +else:
  115 + usage = "usage: %prog [options] "
  116 + parser = OptionParser(usage=usage)
  117 + parser.add_option("-o", "--option", dest="option", action="store", type="choice", \
  118 + help="scene ou liste", choices=['scene','liste'],default=None)
  119 + parser.add_option("-l", "--liste", dest="fic_liste", action="store", type="string", \
  120 + help="nom du fichier liste",default=None)
  121 + parser.add_option("-s", "--scene", dest="scene", action="store", type="string", \
  122 + help="coordonnees WRS2 de la scene (ex 198030)", default=None)
  123 + parser.add_option("-a", "--annee", dest="annee", action="store", type="int", \
  124 + help="annee")
  125 + parser.add_option("-d", "--doy_deb", dest="doy_deb", action="store", type="int", \
  126 + help="premier jour dans l'annee")
  127 + parser.add_option("-f","--doy_fin", dest="doy_fin", action="store", type="int", \
  128 + help="dernier jour dans l'annee")
  129 + parser.add_option("-u","--usgs_passwd", dest="usgs", action="store", type="string", \
  130 + help="USGS earthexplorer account and password file")
  131 + parser.add_option("-p","--proxy_passwd", dest="proxy", action="store", type="string", \
  132 + help="Proxy account and password file")
  133 +
  134 + (options, args) = parser.parse_args()
  135 + parser.check_required("-o")
  136 + if options.option=='scene':
  137 + parser.check_required("-d")
  138 + parser.check_required("-a")
  139 + parser.check_required("-f")
  140 + parser.check_required("-s")
  141 + parser.check_required("-u")
  142 + elif options.option=='liste' :
  143 + parser.check_required("-l")
  144 + parser.check_required("-u")
  145 +
  146 +
  147 +rep='/tmp/LANDSAT'
  148 +if not os.path.exists(rep):
  149 + os.mkdir(rep)
  150 +
  151 +############Telechargement des produits par scene
  152 +if options.option=='scene':
  153 + produit='LC8'
  154 + station='LGN'
  155 + path=options.scene[0:3]
  156 + row=options.scene[3:6]
  157 +
  158 + # read password files
  159 + try:
  160 + f=file(options.usgs)
  161 + (account,passwd)=f.readline().split(' ')
  162 + print account,passwd
  163 + if passwd.endswith('\n'):
  164 + passwd=passwd[:-1]
  165 + usgs={'account':account,'passwd':passwd}
  166 + print usgs
  167 + f.close()
  168 + except :
  169 + print "error with usgs password file"
  170 + sys.exit(-2)
  171 +
  172 + if options.proxy != None :
  173 + try:
  174 + f=file(options.proxy)
  175 + (account,passwd)=f.readline().split(' ')
  176 + if passwd.endswith('\n'):
  177 + passwd=passwd[:-1]
  178 + proxy={'account':account,'passwd':passwd}
  179 + f.close()
  180 + except :
  181 + print "error with proxy password file"
  182 + sys.exit(-3)
  183 +
  184 + rep_scene="%s/SCENES/%s_%s/GZ"%(rep,path,row)
  185 + print rep_scene
  186 + if not(os.path.exists(rep_scene)):
  187 + os.makedirs(rep_scene)
  188 + if produit.startswith('LC8'):repert='4923'
  189 + if produit.startswith('LE7'):repert='3373'
  190 +
  191 + doy=options.doy_deb
  192 +
  193 + while (doy < options.doy_fin) and (doy < 366) :
  194 + date_asc="%04d%03d"%(options.annee,doy)
  195 + doy+=16
  196 + for version in ['00','01']:
  197 + nom_prod=produit+options.scene+date_asc+station+version
  198 + url="http://earthexplorer.usgs.gov/download/%s/%s/STANDARD/EE"%(repert,nom_prod)
  199 + print url
  200 + if not(os.path.exists(rep_scene+'/'+nom_prod+'.tgz')):
  201 + try:
  202 + if options.proxy!=None :
  203 + connect_earthexplorer_proxy(proxy,usgs)
  204 + else:
  205 + connect_earthexplorer_no_proxy(usgs)
  206 + downloadChunks(url,"%s"%rep_scene,nom_prod+'.tgz')
  207 + except TypeError:
  208 + print ' produit %s non trouve'%nom_prod
  209 + else :
  210 + print ' produit %s deja telecharge'%nom_prod
  211 + break
  212 +
  213 +############Telechargement par liste
  214 +if options.option=='liste':
  215 + with file(options.fic_liste) as f:
  216 + lignes=f.readlines()
  217 + for ligne in lignes:
  218 + (site,nom_prod)=ligne.split(' ')
  219 + nom_prod=nom_prod.strip()
  220 + if nom_prod.startswith('LC8'):repert='4923'
  221 + if nom_prod.startswith('LE7'):repert='3373'
  222 +
  223 + if not os.path.exists(rep+'/'+site):
  224 + os.mkdir(rep+'/SITES/'+site)
  225 + url="http://earthexplorer.usgs.gov/download/%s/%s/STANDARD/EE"%(repert,nom_prod)
  226 + try:
  227 + connect_earthexplorer_no_proxy()
  228 + #connect_earthexplorer_proxy()
  229 + downloadChunks(url,rep+'/'+site,nom_prod+'.tgz')
  230 + except TypeError:
  231 + print 'produit %s non trouve'%nom_prod
... ...
proxy.txt 0 → 100644
  1 +++ a/proxy.txt
... ... @@ -0,0 +1,2 @@
  1 +Me Secret
  2 +http://aaa.bb.cc
... ...
usgs.txt 0 → 100644
  1 +++ a/usgs.txt
... ... @@ -0,0 +1 @@
  1 +Me Secret
... ...