mirror of
https://github.com/heyarne/earth-observation-for-journalism.git
synced 2026-05-06 19:13:40 +02:00
1147 lines
108 KiB
Text
1147 lines
108 KiB
Text
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Download Data from Copernicus Open Access Hub\n",
|
||
"\n",
|
||
"These notebooks contain information about accessing and using data from the Sentinel-2 mission run by the Copernicus program.\n",
|
||
"Data is retrieved from the Copernicus Open Access Hub.\n",
|
||
"Please create an account first:\n",
|
||
"\n",
|
||
"https://scihub.copernicus.eu/dhus/#/self-registration\n",
|
||
"\n",
|
||
"Note that there are other Copernicus Open Access Hubs with a compatible API, but the one linked above is the one used in these notebooks."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sentinelsat import SentinelAPI, read_geojson\n",
|
||
"import os"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"API access is set up using environment variables. Configure `SCIHUB_USERNAME` and `SCIHUB_PASSWORD` to contain the credentials of your account in order to gain access to the Copernicus Open Access Hub.\n",
|
||
"\n",
|
||
"This can be done by running the Docker container like this:\n",
|
||
"\n",
|
||
"``` bash\n",
|
||
"docker run -it --name=eratosthenes --net=host -v \"$(pwd)\":/home/jovyan -e SCIHUB_USERNAME=YOUR_USERNAME_HERE -e SCIHUB_PASSWORD=YOUR_PASSWORD_HERE eratosthenes:latest\n",
|
||
"```\n",
|
||
"\n",
|
||
"The environment variables are defined via the `-e` flags:\n",
|
||
"\n",
|
||
"``` bash\n",
|
||
"-e SCIHUB_USERNAME=YOUR_USERNAME_HERE -e SCIHUB_PASSWORD=YOUR_PASSWORD_HERE\n",
|
||
"```\n",
|
||
"\n",
|
||
"where the respective values need to be replaced with the credentials used for signing up."
|
||
]
|
||
},
|
||
{
|
||
"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": [
|
||
{
|
||
"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 '''\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": [
|
||
"from sentinel_helpers import search_osm\n",
|
||
"??search_osm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"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": 4,
|
||
"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 and of very different types.\n",
|
||
"We can use it to query outlines of parks or entire countries.\n",
|
||
"The [OpenStreetMap wiki](https://wiki.openstreetmap.org/wiki/Main_Page) contains exhaustive information about the architectural design of OpenStreetMap.\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.\n",
|
||
"We use the `type` to select the administrative boundaries."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<AxesSubplot:>"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"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": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"…and save this result for later:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"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 to us:\n",
|
||
"\n",
|
||
"- the time span for which to search for results\n",
|
||
"- the maximum cloud coverage an image is allowed to have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from datetime import date\n",
|
||
"import datetime"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"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 a simplified version of the geometry retrieved from OpenStreetMap - its convex hull - due to restrictions in URL lengths that don't allow us to query for arbitrarily detailed geometries:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/svg+xml": [
|
||
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"13.061432364 52.311332164 0.7266411720000008 0.39108917200000093\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,105.0137535)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.014532823440000016\" opacity=\"0.6\" d=\"M 13.6477328,52.3382448 L 13.6474433,52.338271 L 13.131305,52.3872254 L 13.1310825,52.3872512 L 13.1307559,52.3873763 L 13.1298482,52.3878739 L 13.1267317,52.3895836 L 13.0907635,52.4115602 L 13.090275,52.4122142 L 13.088345,52.4196325 L 13.1284297,52.5860175 L 13.1289619,52.5873048 L 13.2827678,52.6607411 L 13.4794873,52.6755087 L 13.4884252,52.6707899 L 13.523022,52.6450365 L 13.7564462,52.4461766 L 13.7611609,52.4377097 L 13.76095,52.4373221 L 13.7390343,52.4073353 L 13.7342706,52.4021367 L 13.7341193,52.4019835 L 13.6922028,52.3672074 L 13.6513711,52.3392255 L 13.6509462,52.3389451 L 13.6506935,52.3388565 L 13.6488471,52.3383381 L 13.6484243,52.3382725 L 13.6477328,52.3382448 z\" /></g></svg>"
|
||
],
|
||
"text/plain": [
|
||
"<shapely.geometry.polygon.Polygon at 0x7eff2c992f70>"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"footprint = berlin.iloc[0]['geometry'].convex_hull\n",
|
||
"footprint"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"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": 11,
|
||
"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",
|
||
"The first use case is to plot an image of Berlin, so want to make sure that as much of the city as possible is visible in the data we download.\n",
|
||
"\n",
|
||
"We convert the list of products to a `GeoDataFrame`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"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": 13,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sentinel_helpers import plot_all\n",
|
||
"import matplotlib.pyplot as plt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Text(0.5, 1.0, 'Area of interest, its convex hull and products returned from the API')"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"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'}])\n",
|
||
"plt.title('Area of interest, its convex hull and products returned from the API')"
|
||
]
|
||
},
|
||
{
|
||
"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 products are are large (roughly 1GB), we want to skip unnecessary downloads wherever possible.\n",
|
||
"We are selecting products based on two criteria:\n",
|
||
"\n",
|
||
"- How much of the area of interest is visible in the product (i.e. area of their intersection)\n",
|
||
"- How many clouds are in the image (as few as possible)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"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": 16,
|
||
"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": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import geopandas as gpd\n",
|
||
"\n",
|
||
"intersection = gpd.overlay(\n",
|
||
" products,\n",
|
||
" berlin,\n",
|
||
" how=\"intersection\"\n",
|
||
")\n",
|
||
"intersection['area'] = intersection['geometry'].area\n",
|
||
"max_area = max(*intersection['area'])\n",
|
||
"\n",
|
||
"largest_intersections = intersection[intersection['area'] == max_area]\n",
|
||
"largest_intersections"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"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": 17,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"largest_intersections[['title', 'cloudcoverpercentage']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"These files will all be downloaded to `input/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": 18,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pathlib import Path\n",
|
||
"from tqdm.notebook import tqdm\n",
|
||
"\n",
|
||
"dst_path = Path('input/true_color_image')\n",
|
||
"\n",
|
||
"# we make sure to create the directory at dst_path so the notebook can run\n",
|
||
"# without interruptions\n",
|
||
"dst_path.mkdir(exist_ok=True, parents=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "185edfc889314c75b4439ed206f841c2",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=854267363.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "6184e8ca8e9b497281772959aec36667",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=1176239030.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "89708f8829444d2a97f4027bdb2ef89e",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=854267363.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "d77e8bd4d7974b69b11308d281c1ea7c",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=862966648.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "bbca54e173524579be0f8eef722e7836",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=1176239030.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "690ede9f7e354594b1f2e4e9cb8125b7",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=1162711104.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "d43be7875cda424695d8213d71c8fbeb",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=862966648.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "aeac449b826c44d3864d180ad8b81858",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=1162711104.0), HTML(value='')))"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
"CPU times: user 39.4 s, sys: 18.8 s, total: 58.2 s\n",
|
||
"Wall time: 11min 51s\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'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/true_color_image/S2A_MSIL2A_20200617T101031_N0214_R022_T33UUU_20200617T161854.zip',\n",
|
||
" 'downloaded_bytes': 854267363},\n",
|
||
" '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/true_color_image/S2B_MSIL2A_20200615T101559_N0214_R065_T33UUU_20200615T141117.zip',\n",
|
||
" 'downloaded_bytes': 1176239030},\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/true_color_image/S2B_MSIL2A_20200602T100559_N0214_R022_T33UUU_20200602T135324.zip',\n",
|
||
" 'downloaded_bytes': 862966648},\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/true_color_image/S2A_MSIL2A_20200531T102031_N0214_R065_T33UUU_20200531T134031.zip',\n",
|
||
" 'downloaded_bytes': 1162711104}}"
|
||
]
|
||
},
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"%%time\n",
|
||
"api._tqdm = tqdm # ← monkey-patch for nicer progress bars\n",
|
||
"downloads, _, _ = api.download_all(largest_intersections['uuid'].values, dst_path)\n",
|
||
"downloads"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Downloaded 3.78GB\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
|
||
}
|