Examples of Pleiades and SPOT Data Import
The examples below include the examples of both Simple and Native search so that you can compare their interfaces even though both would usually not be used in the same workflow. Similar applies for the examples of Order products and of Order using query. To execute the requests you need to create an OAuth client as is explained here. It is named oauth
in these examples.
Pleiades and SPOT data import
Search
Simple Search
To search for Pleiades data, data.constellation
must be set to "PHR", and for SPOT data to "SPOT".
In both cases provider
must be set to "AIRBUS".
url = "https://services.sentinel-hub.com/api/v1/dataimport/search"query = {"provider": "AIRBUS","bounds": {"geometry": {"type": "Polygon","coordinates": [[[15.825815,46.714048],[15.813988,46.707248],[15.832682,46.703062],[15.839931,46.711694],[15.835353,46.716664],[15.825815,46.714048]]]}},"data": [{"constellation": "PHR","dataFilter": {"timeRange": {"from":"2017-09-13T10:00:00.00Z","to": "2017-09-13T11:00:00.00Z"}}}]}response = oauth.post(url, json=query)response.raise_for_status()results = response.json()
To get product ids:
item_ids = [feature["properties"]["id"] for feature in results["features"]]
Please note: Airbus search can return products that don't overlap with the given area of interest. However, orders that include such non-overlapping products are rejected by Airbus. Therefore, Sentinel Hub automatically filters out those products from simple search and when ordering products using a query. Native search, on the other hand, functions purely as a proxy search, thus we don't filter products nor modify responses in other ways.
Native Search
This native search is equivalent to the above simple search.
Note the added Airbus-specific field processingLevel
.
url = "https://services.sentinel-hub.com/api/v1/dataimport/nativesearch"payload = {"provider": "AIRBUS","geometry": {"type": "Polygon","coordinates": [[[15.825815,46.714048],[15.813988,46.707248],[15.832682,46.703062],[15.839931,46.711694],[15.835353,46.716664],[15.825815,46.714048]]]},"constellation": "PHR","acquisitionDate": "[2017-09-13T10:00:00.000Z,2017-09-13T11:00:00.000Z]","processingLevel" : "ALBUM,SENSOR"}response = oauth.post(url, json=payload)response.raise_for_status()results = response.json()
To get product ids:
item_ids = [feature["properties"]["id"] for feature in results["features"]]
To get info on how to use the native search, you can check this Airbus guide.
Thumbnail
After searching for data, you can check the thumbnail of each item by entering the item id into the url of the thumbnail request. The example below requests a thumbnail for Pleiades data. To request a thumbnail for SPOT data, replace the string AIRBUS_PLEIADES
in the url with AIRBUS_SPOT
.
item_id = '6701559b-e11e-43f9-b395-ac04f193a83b'# or get it from search results: item_id = item_ids[0]url = f"https://services.sentinel-hub.com/api/v1/dataimport/collections/AIRBUS_PLEIADES/products/{item_id}/thumbnail"response = oauth.get(url)
The thumbnail can be displayed in Python using:
import iofrom PIL import Imageimage_bytes = io.BytesIO(response.content)Image.open(image_bytes)
Order
To order Pleaides data, input.data.constellation
must be set to "PHR", and for SPOT data to "SPOT".
In both cases provider
must be set to "AIRBUS".
Order products
To order the import of the products, which we got as a result of search and are stored in the variable item_ids
:
url = "https://services.sentinel-hub.com/api/v1/dataimport/orders"payload = {"name": "airbus products",# collectionId is optional. Remove it to create a new collection."collectionId": "<your Pleiades/SPOT collectionId>","input": {"provider": "AIRBUS","bounds": {"geometry": {"type": "Polygon","coordinates": [[[15.825815,46.714048],[15.813988,46.707248],[15.832682,46.703062],[15.839931,46.711694],[15.835353,46.716664],[15.825815,46.714048]]]}},"data": [{"constellation": "PHR","products": [{"id": item_ids[0]}]}]}}response = oauth.post(url, json=payload)response.raise_for_status()results = response.json()
Order using query
Another way to order data is using search query, in this case using query
from above:
url = "https://services.sentinel-hub.com/api/v1/dataimport/orders"payload = {"name": "airbus query",# collectionId is optional. Remove it to create a new collection."collectionId": "<your Pleiades/SPOT collectionId>","input": query}response = oauth.post(url, json=payload)response.raise_for_status()order = response.json()
To extract the order id from the response:
order_id = order['id']
To extract the cost in square kilometers:
sqkm = order['sqkm']
Confirm the order
Confirming the order will subtract the ordered area in km2 from your quota.
To initiate import, confirm the order:
url = f"https://services.sentinel-hub.com/api/v1/dataimport/orders/{order_id}/confirm"response = oauth.post(url)response.raise_for_status()
Get order information
url = f"https://services.sentinel-hub.com/api/v1/dataimport/orders/{order_id}"response = oauth.get(url)response.raise_for_status()order = response.json()
To extract the order status:
status = order['status']
To extract the BYOC collection ID:
collection_id = order['collectionId']
List all your orders
url = "https://services.sentinel-hub.com/api/v1/dataimport/orders"response = oauth.get(url)response.raise_for_status()response.json()
Access Pleiades data in a BYOC collection and process a truecolor image
This is a normal Processing API request that uses a BYOC collectionId
that can be fetched from the get order information request.
response = oauth.post('https://services.sentinel-hub.com/api/v1/process',headers={"Authorization" : "Bearer <your_access_token>"},json={'input': {"bounds": {"properties": {"crs": "http://www.opengis.net/def/crs/EPSG/0/32633"},"bbox": [562218,5174019,564201,5172501]},"data": [{"type": "byoc-<collectionId>","dataFilter": {"timeRange": {"from": "2017-09-13T00:00:00Z","to": "2017-09-13T23:59:59Z"}}}]},"output": {"width": 512,"height": 512},"evalscript": """//VERSION=3function setup() {return {input: ["B0", "B1", "B2", "dataMask"],output: { bands: 4 }};}var f = 2000;function evaluatePixel(sample) {return [sample.B2/f, sample.B1/f, sample.B0/f, sample.dataMask];}"""})