mirror of
https://github.com/heyarne/earth-observation-for-journalism.git
synced 2026-05-07 03:23:40 +02:00
953 lines
94 KiB
Text
953 lines
94 KiB
Text
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Download Data from Copernicus Open Access Hub\n",
|
||
"\n",
|
||
"The data source for Sentinel-2 data we use is the Copernicus Open Access Hub.\n",
|
||
"Please create an account first:\n",
|
||
"\n",
|
||
"https://scihub.copernicus.eu/dhus/#/self-registration"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt\n",
|
||
"import os"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"API access is set up using environment variables. Configure `SCIHUB_USERNAME` and `SCIHUB_PASSWORD` should contain the credentials of your account in order to gain access to the Copernicus Open Access Hub:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"api = SentinelAPI(os.getenv('SCIHUB_USERNAME'), os.getenv('SCIHUB_PASSWORD'))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Defining the Region of Interest\n",
|
||
"\n",
|
||
"The Copernicus Open Access Hub API expects a point or area that designates the region of interest.\n",
|
||
"We use the [OpenStreetMap Nominatim API](https://nominatim.org/) to query for the administrative boundaries of Berlin using the `search_osm` function defined in `sentinel_helpers.py`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sentinel_helpers import search_osm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"\u001b[0;31mSignature:\u001b[0m \u001b[0msearch_osm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplace\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;31mSource:\u001b[0m \n",
|
||
"\u001b[0;32mdef\u001b[0m \u001b[0msearch_osm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplace\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
|
||
"\u001b[0;34m\u001b[0m \u001b[0;34m'''\u001b[0m\n",
|
||
"\u001b[0;34m Returns a GeoDataFrame with results from OpenStreetMap Nominatim for the given search string.\u001b[0m\n",
|
||
"\u001b[0;34m This allows us to fetch detailed geometries for virtually any place on earth.\u001b[0m\n",
|
||
"\u001b[0;34m '''\u001b[0m\u001b[0;34m\u001b[0m\n",
|
||
"\u001b[0;34m\u001b[0m \u001b[0murlescaped_place\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0murllib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquote\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplace\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
|
||
"\u001b[0;34m\u001b[0m \u001b[0msearch_url\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'https://nominatim.openstreetmap.org/search/?q={}'\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\n",
|
||
"\u001b[0;34m\u001b[0m \u001b[0;34m'&format=geojson&polygon_geojson=1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murlescaped_place\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
|
||
"\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mgpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msearch_url\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;31mFile:\u001b[0m ~/true-color-image/sentinel_helpers.py\n",
|
||
"\u001b[0;31mType:\u001b[0m function\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"??search_osm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>place_id</th>\n",
|
||
" <th>osm_type</th>\n",
|
||
" <th>osm_id</th>\n",
|
||
" <th>display_name</th>\n",
|
||
" <th>place_rank</th>\n",
|
||
" <th>category</th>\n",
|
||
" <th>type</th>\n",
|
||
" <th>importance</th>\n",
|
||
" <th>icon</th>\n",
|
||
" <th>geometry</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>574401</td>\n",
|
||
" <td>node</td>\n",
|
||
" <td>240109189</td>\n",
|
||
" <td>Berlin, 10117, Deutschland</td>\n",
|
||
" <td>15</td>\n",
|
||
" <td>place</td>\n",
|
||
" <td>city</td>\n",
|
||
" <td>0.897539</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>POINT (13.38886 52.51704)</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>256375666</td>\n",
|
||
" <td>relation</td>\n",
|
||
" <td>62422</td>\n",
|
||
" <td>Berlin, Deutschland</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>boundary</td>\n",
|
||
" <td>administrative</td>\n",
|
||
" <td>0.897539</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>MULTIPOLYGON (((13.08835 52.41963, 13.09021 52...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1253688</td>\n",
|
||
" <td>node</td>\n",
|
||
" <td>313826576</td>\n",
|
||
" <td>Berlin, Tauentzienstraße, Charlottenburg, Char...</td>\n",
|
||
" <td>30</td>\n",
|
||
" <td>tourism</td>\n",
|
||
" <td>artwork</td>\n",
|
||
" <td>0.315372</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>POINT (13.33864 52.50340)</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>225671</td>\n",
|
||
" <td>node</td>\n",
|
||
" <td>50798110</td>\n",
|
||
" <td>Berlin, Seedorf, Trave-Land, Segeberg, Schlesw...</td>\n",
|
||
" <td>19</td>\n",
|
||
" <td>place</td>\n",
|
||
" <td>village</td>\n",
|
||
" <td>0.272651</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>POINT (10.44613 54.03636)</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>107621118</td>\n",
|
||
" <td>way</td>\n",
|
||
" <td>68276545</td>\n",
|
||
" <td>Berlin, Potsdam, Klein Bennebek, Kropp-Stapelh...</td>\n",
|
||
" <td>26</td>\n",
|
||
" <td>highway</td>\n",
|
||
" <td>unclassified</td>\n",
|
||
" <td>0.210000</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>LINESTRING (9.41929 54.40283, 9.42072 54.40343...</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" place_id osm_type osm_id \\\n",
|
||
"0 574401 node 240109189 \n",
|
||
"1 256375666 relation 62422 \n",
|
||
"2 1253688 node 313826576 \n",
|
||
"3 225671 node 50798110 \n",
|
||
"4 107621118 way 68276545 \n",
|
||
"\n",
|
||
" display_name place_rank category \\\n",
|
||
"0 Berlin, 10117, Deutschland 15 place \n",
|
||
"1 Berlin, Deutschland 8 boundary \n",
|
||
"2 Berlin, Tauentzienstraße, Charlottenburg, Char... 30 tourism \n",
|
||
"3 Berlin, Seedorf, Trave-Land, Segeberg, Schlesw... 19 place \n",
|
||
"4 Berlin, Potsdam, Klein Bennebek, Kropp-Stapelh... 26 highway \n",
|
||
"\n",
|
||
" type importance \\\n",
|
||
"0 city 0.897539 \n",
|
||
"1 administrative 0.897539 \n",
|
||
"2 artwork 0.315372 \n",
|
||
"3 village 0.272651 \n",
|
||
"4 unclassified 0.210000 \n",
|
||
"\n",
|
||
" icon \\\n",
|
||
"0 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"1 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"2 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"3 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"4 None \n",
|
||
"\n",
|
||
" geometry \n",
|
||
"0 POINT (13.38886 52.51704) \n",
|
||
"1 MULTIPOLYGON (((13.08835 52.41963, 13.09021 52... \n",
|
||
"2 POINT (13.33864 52.50340) \n",
|
||
"3 POINT (10.44613 54.03636) \n",
|
||
"4 LINESTRING (9.41929 54.40283, 9.42072 54.40343... "
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"results = search_osm('Berlin, Germany')\n",
|
||
"results.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"OpenStreetMap contains geoinformation at vastly different scales.\n",
|
||
"We can use it to query outlines of parks or entire countries.\n",
|
||
"Using the `search_osm` function we are very flexible in the type of query information we can retrieve.\n",
|
||
"\n",
|
||
"The first result is the city's centroid. We use the `type` to select the administrative boundaries."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<AxesSubplot:>"
|
||
]
|
||
},
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"berlin = results[results['type'] == 'administrative']\n",
|
||
"berlin.plot()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"berlin.to_file('./input/berlin.geojson', driver='GeoJSON')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Querying the API\n",
|
||
"\n",
|
||
"Other query parameters that are useful are the time span for which we would like to retrieve images and the maximum cloud coverage we want the imges to have:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from datetime import date\n",
|
||
"import datetime"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"start_date = date(2020, 5, 22)\n",
|
||
"end_date = date(2020, 6, 22)\n",
|
||
"cloud_coverage = (0,30) # between 0 and 30 percent"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The region of interest is given as the `footprint` parameter.\n",
|
||
"We use the bounding box of the geometry retrieved from OpenStreetMap due to restrictions in the URL length that don't allow us to query for arbitrarily detailed geometries:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from shapely.geometry import box\n",
|
||
"footprint = box(*berlin.iloc[0]['geometry'].bounds)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"products = api.query(footprint,\n",
|
||
" platformname='Sentinel-2',\n",
|
||
" processinglevel='Level-2A',\n",
|
||
" date=(start_date, end_date),\n",
|
||
" cloudcoverpercentage=cloud_coverage)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"How many results do we have?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Found 16 results\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(f'Found {len(products)} results')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Selecting Products from the Result Set\n",
|
||
"\n",
|
||
"The criteria for selecting a product depends on the specific use case.\n",
|
||
"Because our current use case is only to plot an image of Berlin, we want to make sure that the city is completely covered by the resulting product.\n",
|
||
"\n",
|
||
"We convert the list of products to a `GeoPandas` `GeoDataFrame`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/conda/lib/python3.8/site-packages/pyproj/crs/crs.py:53: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6\n",
|
||
" return _prepare_from_string(\" \".join(pjargs))\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"products = api.to_geodataframe(products)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The `plot_all` function is a helper that allows us to draw several geometries on top of each other in a single plot.\n",
|
||
"We can use it to get a quick visual impression of the result:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sentinel_helpers import plot_all\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"%matplotlib inline"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 1152x648 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_all([products, berlin, footprint],\n",
|
||
" [{'color': 'none', 'edgecolor': 'blue', 'alpha': 0.1, 'figsize': (16, 9)},\n",
|
||
" {'color': 'none', 'edgecolor': 'red'},\n",
|
||
" {'color': 'none', 'edgecolor': 'grey'}])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<div class=\"alert alert-primary\" role=\"alert\">\n",
|
||
" <b>Note:</b> The geometrical shape of the captured data a product depends on where a Sentinel-2 satellite was in orbit when it crossed the area of interest.\n",
|
||
" An in-depth analysis for this can be found in <code>01b Coverage Analysis.ipynb</code>.\n",
|
||
"</div>"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Because downloads are large, we skip unnecessary downloads wherever possible.\n",
|
||
"\n",
|
||
"- For this particular example we can select exactly one\n",
|
||
"- \n",
|
||
"\n",
|
||
"\n",
|
||
"- Select biggest intersection area\n",
|
||
"- Figure out which tiles are needed \n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# we are using a metric coordinate reference system for europe in order to\n",
|
||
"# safely compare areas \n",
|
||
"products = products.to_crs('EPSG:4839')\n",
|
||
"berlin = berlin.to_crs('EPSG:4839')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import geopandas as gpd"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"intersection = gpd.overlay(\n",
|
||
" products,\n",
|
||
" berlin,\n",
|
||
" how=\"intersection\"\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>title</th>\n",
|
||
" <th>link</th>\n",
|
||
" <th>link_alternative</th>\n",
|
||
" <th>link_icon</th>\n",
|
||
" <th>summary</th>\n",
|
||
" <th>ondemand</th>\n",
|
||
" <th>beginposition</th>\n",
|
||
" <th>endposition</th>\n",
|
||
" <th>ingestiondate</th>\n",
|
||
" <th>orbitnumber</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>osm_type</th>\n",
|
||
" <th>osm_id</th>\n",
|
||
" <th>display_name</th>\n",
|
||
" <th>place_rank</th>\n",
|
||
" <th>category</th>\n",
|
||
" <th>type</th>\n",
|
||
" <th>importance</th>\n",
|
||
" <th>icon</th>\n",
|
||
" <th>geometry</th>\n",
|
||
" <th>area</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_2...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>Date: 2020-06-17T10:10:31.024Z, Instrument: MS...</td>\n",
|
||
" <td>false</td>\n",
|
||
" <td>2020-06-17 10:10:31.024</td>\n",
|
||
" <td>2020-06-17 10:10:31.024</td>\n",
|
||
" <td>2020-06-17 21:35:56.836</td>\n",
|
||
" <td>26045</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>relation</td>\n",
|
||
" <td>62422</td>\n",
|
||
" <td>Berlin, Deutschland</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>boundary</td>\n",
|
||
" <td>administrative</td>\n",
|
||
" <td>0.897539</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>MULTIPOLYGON (((215331.937 168288.512, 216047....</td>\n",
|
||
" <td>8.535962e+08</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_2...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>Date: 2020-06-15T10:15:59.024Z, Instrument: MS...</td>\n",
|
||
" <td>false</td>\n",
|
||
" <td>2020-06-15 10:15:59.024</td>\n",
|
||
" <td>2020-06-15 10:15:59.024</td>\n",
|
||
" <td>2020-06-16 01:21:09.378</td>\n",
|
||
" <td>17108</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>relation</td>\n",
|
||
" <td>62422</td>\n",
|
||
" <td>Berlin, Deutschland</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>boundary</td>\n",
|
||
" <td>administrative</td>\n",
|
||
" <td>0.897539</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>MULTIPOLYGON (((215331.937 168288.512, 216047....</td>\n",
|
||
" <td>8.535962e+08</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>10</th>\n",
|
||
" <td>S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_2...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>Date: 2020-06-02T10:05:59.024Z, Instrument: MS...</td>\n",
|
||
" <td>false</td>\n",
|
||
" <td>2020-06-02 10:05:59.024</td>\n",
|
||
" <td>2020-06-02 10:05:59.024</td>\n",
|
||
" <td>2020-06-02 18:40:43.331</td>\n",
|
||
" <td>16922</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>relation</td>\n",
|
||
" <td>62422</td>\n",
|
||
" <td>Berlin, Deutschland</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>boundary</td>\n",
|
||
" <td>administrative</td>\n",
|
||
" <td>0.897539</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>MULTIPOLYGON (((215331.937 168288.512, 216047....</td>\n",
|
||
" <td>8.535962e+08</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11</th>\n",
|
||
" <td>S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_2...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>https://scihub.copernicus.eu/apihub/odata/v1/P...</td>\n",
|
||
" <td>Date: 2020-05-31T10:20:31.024Z, Instrument: MS...</td>\n",
|
||
" <td>false</td>\n",
|
||
" <td>2020-05-31 10:20:31.024</td>\n",
|
||
" <td>2020-05-31 10:20:31.024</td>\n",
|
||
" <td>2020-05-31 20:21:27.279</td>\n",
|
||
" <td>25802</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>relation</td>\n",
|
||
" <td>62422</td>\n",
|
||
" <td>Berlin, Deutschland</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>boundary</td>\n",
|
||
" <td>administrative</td>\n",
|
||
" <td>0.897539</td>\n",
|
||
" <td>https://nominatim.openstreetmap.org/ui/mapicon...</td>\n",
|
||
" <td>MULTIPOLYGON (((215331.937 168288.512, 216047....</td>\n",
|
||
" <td>8.535962e+08</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4 rows × 46 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" title \\\n",
|
||
"1 S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_2... \n",
|
||
"3 S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_2... \n",
|
||
"10 S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_2... \n",
|
||
"11 S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_2... \n",
|
||
"\n",
|
||
" link \\\n",
|
||
"1 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"3 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"10 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"11 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"\n",
|
||
" link_alternative \\\n",
|
||
"1 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"3 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"10 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"11 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"\n",
|
||
" link_icon \\\n",
|
||
"1 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"3 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"10 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"11 https://scihub.copernicus.eu/apihub/odata/v1/P... \n",
|
||
"\n",
|
||
" summary ondemand \\\n",
|
||
"1 Date: 2020-06-17T10:10:31.024Z, Instrument: MS... false \n",
|
||
"3 Date: 2020-06-15T10:15:59.024Z, Instrument: MS... false \n",
|
||
"10 Date: 2020-06-02T10:05:59.024Z, Instrument: MS... false \n",
|
||
"11 Date: 2020-05-31T10:20:31.024Z, Instrument: MS... false \n",
|
||
"\n",
|
||
" beginposition endposition ingestiondate \\\n",
|
||
"1 2020-06-17 10:10:31.024 2020-06-17 10:10:31.024 2020-06-17 21:35:56.836 \n",
|
||
"3 2020-06-15 10:15:59.024 2020-06-15 10:15:59.024 2020-06-16 01:21:09.378 \n",
|
||
"10 2020-06-02 10:05:59.024 2020-06-02 10:05:59.024 2020-06-02 18:40:43.331 \n",
|
||
"11 2020-05-31 10:20:31.024 2020-05-31 10:20:31.024 2020-05-31 20:21:27.279 \n",
|
||
"\n",
|
||
" orbitnumber ... osm_type osm_id display_name place_rank \\\n",
|
||
"1 26045 ... relation 62422 Berlin, Deutschland 8 \n",
|
||
"3 17108 ... relation 62422 Berlin, Deutschland 8 \n",
|
||
"10 16922 ... relation 62422 Berlin, Deutschland 8 \n",
|
||
"11 25802 ... relation 62422 Berlin, Deutschland 8 \n",
|
||
"\n",
|
||
" category type importance \\\n",
|
||
"1 boundary administrative 0.897539 \n",
|
||
"3 boundary administrative 0.897539 \n",
|
||
"10 boundary administrative 0.897539 \n",
|
||
"11 boundary administrative 0.897539 \n",
|
||
"\n",
|
||
" icon \\\n",
|
||
"1 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"3 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"10 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"11 https://nominatim.openstreetmap.org/ui/mapicon... \n",
|
||
"\n",
|
||
" geometry area \n",
|
||
"1 MULTIPOLYGON (((215331.937 168288.512, 216047.... 8.535962e+08 \n",
|
||
"3 MULTIPOLYGON (((215331.937 168288.512, 216047.... 8.535962e+08 \n",
|
||
"10 MULTIPOLYGON (((215331.937 168288.512, 216047.... 8.535962e+08 \n",
|
||
"11 MULTIPOLYGON (((215331.937 168288.512, 216047.... 8.535962e+08 \n",
|
||
"\n",
|
||
"[4 rows x 46 columns]"
|
||
]
|
||
},
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"intersection['area'] = intersection['geometry'].area\n",
|
||
"max_area = max(*intersection['area'])\n",
|
||
"largest_intersections = intersection[intersection['area'] == max_area]\n",
|
||
"largest_intersections"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>title</th>\n",
|
||
" <th>cloudcoverpercentage</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_2...</td>\n",
|
||
" <td>24.374344</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_2...</td>\n",
|
||
" <td>3.626466</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>10</th>\n",
|
||
" <td>S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_2...</td>\n",
|
||
" <td>0.345483</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11</th>\n",
|
||
" <td>S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_2...</td>\n",
|
||
" <td>16.512980</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" title cloudcoverpercentage\n",
|
||
"1 S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_2... 24.374344\n",
|
||
"3 S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_2... 3.626466\n",
|
||
"10 S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_2... 0.345483\n",
|
||
"11 S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_2... 16.512980"
|
||
]
|
||
},
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"largest_intersections[['title', 'cloudcoverpercentage']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's download all of these `input/raster/true_color_image`.\n",
|
||
"Repeated calls to `download` or `download_all` will skip the download process if a product has previously been downloaded."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pathlib import Path\n",
|
||
"dst_path = Path('input/raster/true_color_image')\n",
|
||
"\n",
|
||
"# create the path if it doesn't exist\n",
|
||
"! mkdir -p {dst_path}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"({'b64d4450-d999-41dc-9ecb-6d263f322dd3': {'id': 'b64d4450-d999-41dc-9ecb-6d263f322dd3',\n",
|
||
" 'title': 'S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_20200615T141117',\n",
|
||
" 'size': 1176239030,\n",
|
||
" 'md5': '86D9DB1D0C6C087D66AE28E4A106EF04',\n",
|
||
" 'date': datetime.datetime(2020, 6, 15, 10, 15, 59, 24000),\n",
|
||
" 'footprint': 'POLYGON((12.004760925069467 53.21197782662703,13.648341514492438 53.24196354764364,13.678544065009483 52.25515074878083,12.071595116334858 52.22621087043558,12.004760925069467 53.21197782662703))',\n",
|
||
" 'url': \"https://scihub.copernicus.eu/apihub/odata/v1/Products('b64d4450-d999-41dc-9ecb-6d263f322dd3')/$value\",\n",
|
||
" 'Online': True,\n",
|
||
" 'Creation Date': datetime.datetime(2020, 6, 16, 1, 22, 2, 573000),\n",
|
||
" 'Ingestion Date': datetime.datetime(2020, 6, 16, 1, 21, 9, 378000),\n",
|
||
" 'path': 'input/raster/true_color_image/S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_20200615T141117.zip',\n",
|
||
" 'downloaded_bytes': 0},\n",
|
||
" '958ef7fc-815e-47c6-b323-219de6a91339': {'id': '958ef7fc-815e-47c6-b323-219de6a91339',\n",
|
||
" 'title': 'S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_20200617T161854',\n",
|
||
" 'size': 854267363,\n",
|
||
" 'md5': 'E8E78FEEBF25D95E50A7E5E0C971C061',\n",
|
||
" 'date': datetime.datetime(2020, 6, 17, 10, 10, 31, 24000),\n",
|
||
" 'footprint': 'POLYGON((12.352510548540328 52.23126993496904,12.408603762795623 52.36271559980042,12.470993716931147 52.50836314366547,12.533637922787934 52.653880456978825,12.596456783078388 52.79937966494399,12.659608391506955 52.944876790325615,12.72334134983589 53.09033052896263,12.783072077326212 53.2261774473976,13.648341514492438 53.24196354764364,13.678544065009483 52.25515074878083,12.352510548540328 52.23126993496904))',\n",
|
||
" 'url': \"https://scihub.copernicus.eu/apihub/odata/v1/Products('958ef7fc-815e-47c6-b323-219de6a91339')/$value\",\n",
|
||
" 'Online': True,\n",
|
||
" 'Creation Date': datetime.datetime(2020, 6, 17, 21, 36, 46, 539000),\n",
|
||
" 'Ingestion Date': datetime.datetime(2020, 6, 17, 21, 35, 56, 836000),\n",
|
||
" 'path': 'input/raster/true_color_image/S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_20200617T161854.zip',\n",
|
||
" 'downloaded_bytes': 0},\n",
|
||
" '10190cf1-5690-48a3-b71e-861629703a3f': {'id': '10190cf1-5690-48a3-b71e-861629703a3f',\n",
|
||
" 'title': 'S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_20200602T135324',\n",
|
||
" 'size': 862966648,\n",
|
||
" 'md5': 'A93C8F7AA12C2396CF57CFD02ADF21A2',\n",
|
||
" 'date': datetime.datetime(2020, 6, 2, 10, 5, 59, 24000),\n",
|
||
" 'footprint': 'POLYGON((12.358321903656456 52.23137459287384,12.415699786858166 52.36633012201262,12.47808001229512 52.51194199175493,12.5407946185535 52.65754848189568,12.603698138951865 52.80313660845604,12.667166015291048 52.94869104851679,12.731188091140115 53.09422646557383,12.789415151489028 53.226293171356296,13.648341514492438 53.24196354764364,13.678544065009483 52.25515074878083,12.358321903656456 52.23137459287384))',\n",
|
||
" 'url': \"https://scihub.copernicus.eu/apihub/odata/v1/Products('10190cf1-5690-48a3-b71e-861629703a3f')/$value\",\n",
|
||
" 'Online': True,\n",
|
||
" 'Creation Date': datetime.datetime(2020, 6, 2, 18, 42, 4, 900000),\n",
|
||
" 'Ingestion Date': datetime.datetime(2020, 6, 2, 18, 40, 43, 331000),\n",
|
||
" 'path': 'input/raster/true_color_image/S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_20200602T135324.zip',\n",
|
||
" 'downloaded_bytes': 0},\n",
|
||
" 'e385d397-4d1b-4fa2-a1ce-917f420c86dd': {'id': 'e385d397-4d1b-4fa2-a1ce-917f420c86dd',\n",
|
||
" 'title': 'S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_20200531T134031',\n",
|
||
" 'size': 1162711104,\n",
|
||
" 'md5': '7E74A83DA5EA1176CFB68517E53A343D',\n",
|
||
" 'date': datetime.datetime(2020, 5, 31, 10, 20, 31, 24000),\n",
|
||
" 'footprint': 'POLYGON((12.004760925069467 53.21197782662703,13.648341514492438 53.24196354764364,13.678544065009483 52.25515074878083,12.071595116334858 52.22621087043558,12.004760925069467 53.21197782662703))',\n",
|
||
" 'url': \"https://scihub.copernicus.eu/apihub/odata/v1/Products('e385d397-4d1b-4fa2-a1ce-917f420c86dd')/$value\",\n",
|
||
" 'Online': True,\n",
|
||
" 'Creation Date': datetime.datetime(2020, 5, 31, 20, 22, 5, 475000),\n",
|
||
" 'Ingestion Date': datetime.datetime(2020, 5, 31, 20, 21, 27, 279000),\n",
|
||
" 'path': 'input/raster/true_color_image/S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_20200531T134031.zip',\n",
|
||
" 'downloaded_bytes': 0}},\n",
|
||
" {},\n",
|
||
" {})"
|
||
]
|
||
},
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"downloads, _, _ = api.download_all(largest_intersections['uuid'].values, dst_path)\n",
|
||
"downloads"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Downloaded 0.00GB\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"downloaded_bytes_total = sum(p['downloaded_bytes'] for p in downloads.values())\n",
|
||
"print(f'Downloaded {(downloaded_bytes_total / 1024 ** 3):.2f}GB')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.8.6"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|