Télécharger des produits sentinelles à l'aide de l'API?

11

Je souhaite pouvoir automatiser ou télécharger par lots les données Sentinel (en particulier S2).

J'essaie d'utiliser le protocole OData tel que décrit dans le guide de l'utilisateur de Sentinels Scientific Data Hub sur les API et les scripts par lots . Par exemple, j'essaie de télécharger un produit complet en utilisant wget:

wget --no-check-certificate --user=username --password=usrpass "https://scihub.copernicus.eu/apihub/odata/v1/Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/$value"

(Avec un nom d'utilisateur et un mot de passe enregistrés) mais je viens de recevoir le fichier index.html:

<?xml version='1.0' encoding='utf-8'?><entry xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="https://scihub.copernicus.eu/dhus/odata/v1/"><id>https://scihub.copernicus.eu/dhus/odata/v1/Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')</id><title type="text">S1A_IW_SLC__1SDV_20141023T172123_20141023T172150_002960_0035D1_9743</title><updated>2014-12-07T17:06:00.324Z</updated><category term="DHuS.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/><link href="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')" rel="edit" title="Product"/><link href="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/$value" rel="edit-media" type="application/octet-stream"/><link href="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/Products" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" title="Products" type="application/atom+xml;type=feed"/><link href="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/Nodes" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Nodes" title="Nodes" type="application/atom+xml;type=feed"/><link href="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/Attributes" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Attributes" title="Attributes" type="application/atom+xml;type=feed"/><link href="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/Class" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Class" title="Class" type="application/atom+xml;type=entry"/><content type="application/octet-stream" src="Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/$value"/><m:properties><d:Id>18f7993d-eae1-4f7f-9d81-d7cf19c18378</d:Id><d:Name>S1A_IW_SLC__1SDV_20141023T172123_20141023T172150_002960_0035D1_9743</d:Name><d:ContentType>application/octet-stream</d:ContentType><d:ContentLength>8544532822</d:ContentLength><d:ChildrenNumber>2</d:ChildrenNumber><d:Value m:null="true"/><d:CreationDate>2014-12-07T17:06:00.324</d:CreationDate><d:IngestionDate>2014-12-07T17:06:00.324</d:IngestionDate><d:EvictionDate m:null="true"/><d:ContentDate m:type="DHuS.TimeRange"><d:Start>2014-10-23T17:21:23.23</d:Start><d:End>2014-10-23T17:21:50.495</d:End></d:ContentDate><d:Checksum m:type="DHuS.Checksum"><d:Algorithm>MD5</d:Algorithm><d:Value>C4415763B3198B7A2874C2A60B2CDCDC</d:Value></d:Checksum><d:ContentGeometry>&lt;gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326" xmlns:gml="http://www.opengis.net/gml">
   &lt;gml:outerBoundaryIs>
      &lt;gml:LinearRing>
         &lt;gml:coordinates>41.289764,6.891860 41.685265,9.900283 40.048470,10.244140 39.652199,7.311233 41.289764,6.891860&lt;/gml:coordinates>
      &lt;/gml:LinearRing>
   &lt;/gml:outerBoundaryIs>
&lt;/gml:Polygon></d:ContentGeometry><d:Metalink>&lt;metalink xmlns="urn:ietf:params:xml:ns:metalink">&lt;file name ="S1A_IW_SLC__1SDV_20141023T172123_20141023T172150_002960_0035D1_9743.zip">&lt;url>https://scihub.copernicus.eu/dhus/odata/v1/Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/$value&lt;/url>&lt;/file>&lt;/metalink></d:Metalink></m:properties></entry>

Cependant, si je mets la requête URI https://scihub.copernicus.eu/dhus/odata/v1/Products%28'18f7993d-eae1-4f7f-9d81-d7cf19c18378'%29/$valuedirectement dans le navigateur, il télécharge le fichier zip du produit.

J'ai également essayé d'utiliser curl comme décrit dans une réponse à cette question

curl -u username:usrpass -JO "https://scihub.copernicus.eu/dhus/odata/v1/Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/$value"

mais je reçois l'erreur

Avertissement: le nom de fichier distant n'a pas de longueur!

Je ne peux pas encore accéder à l'APIhub, uniquement au hub scientifique, (bien qu'un collègue ayant accès à l'APIhub ait essayé cela aussi et ait eu le même problème). Je suis capable d'utiliser l'interface graphique du hub scientifique pour télécharger de manière interactive des données, mais j'aimerais pouvoir automatiser le processus. Il existe des scripts python et des scripts shell tiers, mais beaucoup utilisent le concentrateur d'API, et j'aimerais comprendre ce que je fais pour pouvoir développer des scripts spécifiques.

Colabean
la source
Avez-vous utilisé une version wget compilée avec le support SSL? Sinon, SSL ne fonctionnera pas.
Mat
Je ne suis pas sûr, je pense que c'est la valeur par défaut avec ubuntu 14. (wget -V GNU Wget 1.15 construit sur linux-gnu. + Digest + https + ipv6 + iri + gros fichier + nls + ntlm + opie + ssl / openssl ) (Compiler: gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC = "/ etc / wgetrc" -DLOCALEDIR = "/ usr / share / locale" -I. -I ../../ src -I ../ lib -I ../ ../lib -D_FORTIFY_SOURCE = 2 -I / usr / include -g -O2 -fstack-protector --param = ssp-buffer-size = 4 -Wformat -Werror = format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS = 64 -g - Mur)
Colabean
Ce n'est pas le problème alors que vous avez le + ssl / openssl.
Mat

Réponses:

7

J'ai reçu l'aide d'un développeur d'applications chez JNCC. Je posterai leur réponse ici pour aider les autres.

Mon problème était que j'avais besoin d'échapper au caractère $ auparavant value. donc la commande wget devrait lire (en utilisant l'apihub, que vous pouvez remplacer par dhus):

wget --no-check-certificate --user=username --password=usrpass "https://scihub.copernicus.eu/apihub/odata/v1/Products('18f7993d-eae1-4f7f-9d81-d7cf19c18378')/\$value"

Ou pour utiliser curl, sa commande suggérée était:

curl -u username:password -LkJO "https://scihub.copernicus.eu/dhus/odata/v1/Products('13e66985-7d1f-4a7c-be58-925e7ed7889d')/\$value"

Notez le $ échappé à la fin. Sans cela, l'URL envoyée est https://scihub.copernicus.eu/dhus/odata/v1/Products ('13e66985-7d1f-4a7c-be58-925e7ed7889d') / Si vous essayez cette URL dans un navigateur, vous obtiendrez un description html du produit.

Colabean
la source
La curlméthode fonctionne pour moi, mais j'obtiens une erreur d'authentification lors de l'utilisation wget.
philiporlando
7

Une bonne alternative au Scihub officiel est les données en miroir Sentinel-2 sur Amazon Web Services.

Sentinel-2 sur AWS

Cela a l'avantage d'une meilleure disponibilité et les produits sont déjà enregistrés dans leurs tuiles MGRS, ce qui rend le téléchargement beaucoup plus rapide.

Les données sont stockées dans un compartiment public avec le schéma tiles/[UTM code]/latitude band/square/[year]/[month]/[day]/[sequence]/DATA. Cela rend le téléchargement itératif et scripté de toutes les scènes disponibles sur une zone très facile.

Si vous êtes intéressé par la recherche par programme et le téléchargement de données depuis Scihub, vous pouvez également utiliser l'outil Python Sentinelsat .

Kersten
la source
3

Je suggérerais d'utiliser l'API sentinelsat Python pour cela. Surtout si votre objectif est le téléchargement par lots.

Veuillez voir ci-dessous un exemple de code pour le téléchargement de Sentinel-2 (code exécuté depuis Spyder)

#First, import this library (sentinelsat)
from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt
from datetime import date

api = SentinelAPI('user', 'password', 'https://scihub.copernicus.eu/dhus')

# search by polygon, time, and SciHub query keywords
footprint = geojson_to_wkt(read_geojson(r'/path/to/map.geojson'))
products = api.query(footprint,
                     date=('20151219', date(2015, 12, 29)),
                     platformname='Sentinel-2',
                     cloudcoverpercentage=(0, 30))

#Download all products 
api.download_all(products)

Pour info, si vous recherchez des données à l'échelle nationale, divisez l'AOI en fichiers de formes plus petits car j'ai eu ce problème où il ne retournait aucun résultat lorsque mon AOI était trop grand.

Lisez ceci pour plus d'informations: https://buildmedia.readthedocs.org/media/pdf/sentinelsat/master/sentinelsat.pdf

Il existe également des options pour le téléchargement par lots de Sentinel-1.

Rhodri_22
la source
Est-ce que cela a fonctionné pour vous?
Rhodri_22