diff --git a/README.rst b/README.rst index 51ffd95..a634c3a 100644 --- a/README.rst +++ b/README.rst @@ -195,12 +195,11 @@ Composite the results of a Landsat-8 search, export to Earth Engine asset, and d geedim search -c l8-c2-l2 -s 2019-02-01 -e 2019-03-01 --bbox 23 -33 23.2 -33.2 composite -cm q-mosaic export --type asset --folder --scale 30 --crs EPSG:3857 download -Search for Sentinel-2 SR images with a cloudless portion of at least 60%, using the ``qa`` mask-method to identify -clouds: +Search for Sentinel-2 SR images with a cloudless portion of at least 60%, using the ``cloud-score`` mask-method to identify clouds: .. code:: shell - geedim config --mask-method qa search -c s2-sr --cloudless-portion 60 -s 2022-01-01 -e 2022-01-14 --bbox 24 -34 24.5 -33.5 + geedim config --mask-method cloud-score search -c s2-sr-hm --cloudless-portion 60 -s 2022-01-01 -e 2022-01-14 --bbox 24 -34 24.5 -33.5 .. cli_end @@ -223,18 +222,18 @@ Example } # make collection and search, reporting cloudless portions - coll = gd.MaskedCollection.from_name('COPERNICUS/S2_SR') + coll = gd.MaskedCollection.from_name('COPERNICUS/S2_SR_HARMONIZED') coll = coll.search('2019-01-10', '2019-01-21', region, cloudless_portion=0) print(coll.schema_table) print(coll.properties_table) # create and download an image - im = gd.MaskedImage.from_id('COPERNICUS/S2_SR/20190115T080251_20190115T082230_T35HKC') + im = gd.MaskedImage.from_id('COPERNICUS/S2_SR_HARMONIZED/20190115T080251_20190115T082230_T35HKC') im.download('s2_image.tif', region=region) # composite search results and download comp_im = coll.composite() - comp_im.download('s2_comp_image.tif', region=region, crs='EPSG:32735', scale=30) + comp_im.download('s2_comp_image.tif', region=region, crs='EPSG:32735', scale=10) License ------- diff --git a/docs/api.rst b/docs/api.rst index ccb1ee1..dfffc19 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -20,10 +20,7 @@ Initialisation Searching image collections ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -`Any Earth Engine image collection `_ can be searched with -:class:`~geedim.collection.MaskedCollection`. Here, we search for -`Landsat-8 surface reflectance `_ -images over Stellenbosch, South Africa. +`Any Earth Engine image collection `_ can be searched with :class:`~geedim.collection.MaskedCollection`. Here, we search for `Landsat-8 surface reflectance `_ images over Stellenbosch, South Africa. .. literalinclude:: examples/api_getting_started.py :language: python @@ -58,8 +55,7 @@ The output: Image creation and download ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Images can be created, masked and downloaded with the :class:`~geedim.mask.MaskedImage` class. Typically, one would -pass the Earth Engine image ID to :meth:`.MaskedImage.from_id` to create the image. +Images can be created, masked and downloaded with the :class:`~geedim.mask.MaskedImage` class. Typically, one would pass the Earth Engine image ID to :meth:`.MaskedImage.from_id` to create the image. .. literalinclude:: examples/api_getting_started.py :language: python @@ -69,13 +65,10 @@ pass the Earth Engine image ID to :meth:`.MaskedImage.from_id` to create the ima Compositing ^^^^^^^^^^^ -Let's form a cloud/shadow-free composite of the search result images, using the *q-mosaic* method, then download -the result. By specifying the ``region`` parameter to :meth:`.MaskedCollection.composite`, we prioritise selection -of pixels from the least cloudy images when forming the composite. +Let's form a cloud/shadow-free composite of the search result images, using the *q-mosaic* method, then download the result. By specifying the ``region`` parameter to :meth:`.MaskedCollection.composite`, we prioritise selection of pixels from the least cloudy images when forming the composite. .. note:: - When downloading composite images, the ``region``, ``crs`` and ``scale`` parameters must be specified, as the image - has no fixed (known) projection. + When downloading composite images, the ``region``, ``crs`` and ``scale`` parameters must be specified, as the image has no fixed (known) projection. .. literalinclude:: examples/api_getting_started.py :language: python @@ -92,7 +85,7 @@ take optional cloud/shadow masking ``**kwargs``. See :meth:`.MaskedImage.__init parameters. Here, we create and download a cloud/shadow masked -`Sentinel-2 image `_, specifying a cloud probability threshold of 30%. +`Sentinel-2 image `_, specifying a cloud score threshold of 0.7. .. literalinclude:: examples/api_getting_started.py :language: python diff --git a/docs/examples/api_getting_started.py b/docs/examples/api_getting_started.py index f5cc4e1..c6cc3ee 100644 --- a/docs/examples/api_getting_started.py +++ b/docs/examples/api_getting_started.py @@ -1,14 +1,14 @@ # [initialise-start] import geedim as gd + gd.Initialize() # [initialise-end] # [search-start] # geojson search polygon region = { - 'type': 'Polygon', 'coordinates': [[ - (19, -34), (19, -33.8), (18.8, -33.8), (18.8, -34), (19., -34) - ]] + 'type': 'Polygon', + 'coordinates': [[(19, -34), (19, -33.8), (18.8, -33.8), (18.8, -34), (19.0, -34)]], } # create & search a landsat-8 collection, reporting cloudless portions @@ -22,13 +22,11 @@ # [image-download-start] # create a landsat-8 image from its ID -im = gd.MaskedImage.from_id( - 'LANDSAT/LC08/C02/T1_L2/LC08_175083_20190117', mask=False) +im = gd.MaskedImage.from_id('LANDSAT/LC08/C02/T1_L2/LC08_175083_20190117', mask=False) # download a region of the image with 'average' resampling to 60m pixels, and # data type conversion to 16 bit unsigned int -im.download('landsat_8_image.tif', region=region, resampling='average', - scale=60, dtype='uint16') +im.download('landsat_8_image.tif', region=region, resampling='average', scale=60, dtype='uint16') # [image-download-end] # [composite-start] @@ -36,21 +34,22 @@ # the least cloudy image by specifying `region` comp_im = filt_coll.composite(method='q-mosaic', region=region) # download the composite, specifying crs, region, and scale -comp_im.download('landsat_8_comp_image.tif', region=region, crs='EPSG:32634', - scale=30) +comp_im.download('landsat_8_comp_image.tif', region=region, crs='EPSG:32634', scale=30) # [composite-end] # [mask-start] # create a cloud/shadow masked Sentinel-2 image, specifying a cloud -# probability threshold of 30% +# score threshold of 0.7 im = gd.MaskedImage.from_id( - 'COPERNICUS/S2_SR/20190101T082331_20190101T084846_T34HCH', mask=True, prob=30) + 'COPERNICUS/S2_SR_HARMONIZED/20190101T082331_20190101T084846_T34HCH', mask=True, score=0.7 +) # download a region of the masked image, downsampling to 20m pixels -im.download('s2_sr_image.tif', region=region, scale=20, resampling='average') +im.download('s2_sr_hm_image.tif', region=region, scale=20, resampling='average') # [mask-end] # [metadata-start] import rasterio as rio + with rio.open('s2_sr_image.tif', 'r') as ds: print('Image properties:\n', ds.tags()) print('Band names:\n', ds.descriptions) @@ -59,8 +58,9 @@ # [max_tile_size-start] import ee + # create a computed ee.Image -ee_im = ee.Image('COPERNICUS/S2_SR/20190101T082331_20190101T084846_T34HCH') +ee_im = ee.Image('COPERNICUS/S2_SR_HARMONIZED/20190101T082331_20190101T084846_T34HCH') comp_im = ee_im.select('B3').entropy(ee.Kernel.square(5)) # encapsulate in MaskedImage, and download with max_tile_size=8 diff --git a/docs/examples/l7_composite.ipynb b/docs/examples/l7_composite.ipynb index d031329..7df209a 100644 --- a/docs/examples/l7_composite.ipynb +++ b/docs/examples/l7_composite.ipynb @@ -8,6 +8,8 @@ "\n", "This example aims to create a Landsat-7 cloud/shadow free composite on, or as close as possible to 22-23 November 2016. The area of interest covers a range of natural, agricultural and urban areas around Stellenbosch, South Africa.\n", "\n", + "CLI commands equivalent to the API code snippets are given in the comments where possible.\n", + "\n", "### Setup\n", "\n", "`geemap` is required to run the notebook. You can uncomment the cell below to install it, if it isn't installed already." @@ -40,7 +42,7 @@ "import geemap.foliumap as geemap\n", "\n", "# initialise earth engine with the high-volume endpoint\n", - "gd.Initialize()\n" + "gd.Initialize()" ] }, { @@ -55,6 +57,40 @@ "execution_count": 3, "metadata": {}, "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", @@ -84,21 +120,27 @@ "source": [ "# geojson search polygon\n", "region = {\n", - " 'type': 'Polygon', 'coordinates': [[\n", - " (19.075, -34.115), (19.075, -33.731), (18.723, -33.731),\n", - " (18.723, -34.115), (19.075, -34.115)\n", - " ]]\n", + " 'type': 'Polygon',\n", + " 'coordinates': [\n", + " [\n", + " (19.075, -34.115),\n", + " (19.075, -33.731),\n", + " (18.723, -33.731),\n", + " (18.723, -34.115),\n", + " (19.075, -34.115),\n", + " ]\n", + " ],\n", "}\n", "\n", "# create and search the Landsat-7 collection\n", "coll = gd.MaskedCollection.from_name('LANDSAT/LE07/C02/T1_L2')\n", - "filt_coll = coll.search(\n", - " '2016-11-01', '2016-12-19', region, cloudless_portion=40\n", - ")\n", + "filt_coll = coll.search('2016-11-01', '2016-12-19', region, cloudless_portion=40)\n", "\n", "# print the search results\n", "print(filt_coll.schema_table, end='\\n\\n')\n", - "print(filt_coll.properties_table)\n" + "print(filt_coll.properties_table)\n", + "\n", + "# !geedim search -c l7-c2-l2 -s 2016-11-01 -e 2016-12-19 --bbox 18.723 -34.115 19.075 -33.731 -cp 40" ] }, { @@ -124,14 +166,45 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "mosaic_im = filt_coll.composite(\n", - " method=gd.CompositeMethod.mosaic, date='2016-11-22'\n", - ")\n", - "q_mosaic_im = filt_coll.composite(\n", - " method=gd.CompositeMethod.q_mosaic, date='2016-11-22'\n", - ")" + "mosaic_im = filt_coll.composite(method=gd.CompositeMethod.mosaic, date='2016-11-22')\n", + "q_mosaic_im = filt_coll.composite(method=gd.CompositeMethod.q_mosaic, date='2016-11-22')" ] }, { @@ -159,8 +232,44 @@ { "data": { "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + "</script>\n", + "</html>\" width=\"100%\" height=\"600\"style=\"border:none !important;\" \"allowfullscreen\" \"webkitallowfullscreen\" \"mozallowfullscreen\">" ], "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -387,8 +536,7 @@ } ], "source": [ - "l7_vis_params = dict(min=7300, max=13000, bands=[\n", - " 'SR_B3', 'SR_B2', 'SR_B1'], gamma=1.5)\n", + "l7_vis_params = dict(min=7300, max=13000, bands=['SR_B3', 'SR_B2', 'SR_B1'], gamma=1.5)\n", "map = geemap.Map()\n", "\n", "map.centerObject(ee.Geometry(region), 11)\n", @@ -396,19 +544,13 @@ " im = gd.MaskedImage.from_id(im_id, mask=False)\n", " map.addLayer(im.ee_image.clip(region), l7_vis_params, im_id[-20:])\n", "\n", - "map.addLayer(\n", - " mosaic_im.ee_image.clip(region), l7_vis_params, 'Mosaic composite'\n", - ")\n", - "map.addLayer(\n", - " q_mosaic_im.ee_image.clip(region), l7_vis_params, 'Q-mosaic composite'\n", - ")\n", + "map.addLayer(mosaic_im.ee_image.clip(region), l7_vis_params, 'Mosaic composite')\n", + "map.addLayer(q_mosaic_im.ee_image.clip(region), l7_vis_params, 'Q-mosaic composite')\n", "\n", - "region_im = ee.Image().byte().paint(\n", - " featureCollection=ee.Geometry(region), width=2, color=1\n", - ")\n", + "region_im = ee.Image().byte().paint(featureCollection=ee.Geometry(region), width=2, color=1)\n", "map.addLayer(region_im, dict(palette=['FF0000']), 'Region')\n", "\n", - "map\n" + "map" ] }, { @@ -417,8 +559,8 @@ "source": [ "#### Visualisation notes\n", "\n", - "* The *mosaic* method image contains some artefacts due to remnant cloud in the masked input images.\n", - "* By prioritising pixels with the highest distance to cloud, the *q-mosaic* method is robust to imperfect cloud/shadow masking, and produces a composite free of cloud artefacts.\n", + "* The *mosaic* method composite contains some artefacts due to remnant cloud in the masked component images.\n", + "* The *q-mosaic* method prioritises pixels with the highest distance to cloud and is more robust to imperfect cloud/shadow masking. It produces a composite free of cloud artefacts.\n", "\n", "### Download\n", "\n", @@ -430,15 +572,49 @@ "execution_count": 6, "metadata": {}, "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d1577db2495041da8f7738f082334fdd", + "model_id": "9ac9462df1ae4fd19814b5faa3effaf6", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "l7_q_mosaic_im.tif: | | 0.00/108M (raw) [ 0.0%] in 00:00 (et…" + "l7_q_mosaic_im.tif: | | 0.00/10…" ] }, "metadata": {}, @@ -449,9 +625,10 @@ "# download the q_mosaic composite image, specifying crs, scale and region as\n", "# it has no fixed projection\n", "q_mosaic_im.download(\n", - " 'l7_q_mosaic_im.tif', crs='EPSG:3857', scale=30, region=region, \n", - " dtype='uint16', overwrite=True\n", - ")" + " 'l7_q_mosaic_im.tif', crs='EPSG:3857', scale=30, region=region, dtype='uint16', overwrite=True\n", + ")\n", + "\n", + "# !geedim search -c l7-c2-l2 -s 2016-11-01 -e 2016-12-19 --bbox 18.723 -34.115 19.075 -33.731 -cp 40 composite -cm q-mosaic download --crs EPSG:3857 --scale 30 --dtype uint16 -o" ] } ], @@ -471,689 +648,99 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" - }, - "vscode": { - "interpreter": { - "hash": "b7216931d97521c91b544a1209421b2f6a258136195028116bcf8a7f85a6a480" - } + "version": "3.11.10" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { - "00de23a0a6de44ea89ea7a96635cc3d5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Mnhn_Conservatoires", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.MNHN.CONSERVATOIRES&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "01b033a1154a4aedae0391ded1f3c7d5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Ocsge_Visu_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.VISU.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "01c7cc88412343b29a11feec1ac7e9c6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Earthstar Geographics", - "max_zoom": 24, - "name": "Esri.ArcticImagery", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Imagery/MapServer/tile/{z}/{y}/{x}" - } - }, - "01d34839277e4d97b0d10d32e08b644e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Forestareas", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.FORESTAREAS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "02987771a7c14fa99947635c467155a4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "029c1e0adf3447df91b9c7eb142b988c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Hedge_Hedge", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=hedge.hedge&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "02b60153a83b4be18a588d375d56ddac": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "02d4326aa8c0463ca1423b2954308e19": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_1_Personne_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.MENAGES.1.PERSONNE.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "02fa59fc9e7a478789a2930acda295ea": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by NOAA National Centers for Environmental Information (NCEI); International Bathymetric Chart of the Southern Ocean (IBCSO); General Bathymetric Chart of the Oceans (GEBCO).", - "max_zoom": 9, - "name": "Esri.AntarcticBasemap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.arcgis.com/tiles/C8EMgrsFcRFL6LrL/arcgis/rest/services/Antarctic_Basemap/MapServer/tile/{z}/{y}/{x}" - } - }, - "041a7390650c433c8c505614e6474512": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Ortho-sat-rapideye-2010_pyr-jpeg_wld_wm_20160801", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHO-SAT-RAPIDEYE-2010_PYR-JPEG_WLD_WM_20160801&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "049d331dfad74011a1bf6d9a24df2ba7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Individus_40_54_Ans_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.INDIVIDUS.40.54.ANS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "051d7d51c34a41f9b777f6a0fb4e8981": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Zps", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.ZPS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "0522083a5053423887d17f845ae59330": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_Te72", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=RESEAU ROUTIER TE72&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.TE72&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "068e8f1c94bc492e872caccbd31e411c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Constructions", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.CONSTRUCTIONS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "07221f7ce471467b96b782ac310ccc2b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.DarkMatterNoLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png" - } - }, - "07331d57cdc94e368514b88e4d7e9525": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) OpenRailwayMap (CC-BY-SA)", - "max_zoom": 19, - "name": "OpenRailwayMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png" - } - }, - "0825071e448e4c7a95125c74c50b7e2a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Imd_Clc15", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - taux d'imperméabilisation des sols&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.IMD.CLC15&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "09183413c33f44618feab0d82ab96256": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "16576baf9e6c47919d284d9b3c12ef2c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Geographicalgridsystems_Terrier_v1", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEMS.TERRIER_V1&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" + "bar_style": "success", + "layout": "IPY_MODEL_817ff1431d1c4ef88f8bcbe1df2e5974", + "max": 107780448, + "style": "IPY_MODEL_5334614dd6db48bd8c7b54c7545dcb2a", + "value": 107780448 } }, - "099d653a36f94724a57fc923b253d84e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "30248870024145e29cf67cc6d37292f0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "© swisstopo", - "name": "SwissFederalGeoportal.JourneyThroughTime", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.zeitreihen/default/18641231/3857/{z}/{x}/{y}.png" + "display": "inline-flex", + "flex_flow": "row wrap", + "width": "100%" } }, - "09d14e88c0ff42c9a81896f0a3ca698b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "449491d385a742a9a86f197adc6916be": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Gra_Clc15", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - prairies&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.GRA.CLC15&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" + "description_width": "", + "font_size": null, + "text_color": null } }, - "0bc5ac15a94441688192db1dd1be1d9a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "5334614dd6db48bd8c7b54c7545dcb2a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors", - "max_zoom": 19, - "name": "OpenStreetMap.Mapnik", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png" + "description_width": "" } }, - "0c51256c484d4aa3a660a1d98248c658": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "817ff1431d1c4ef88f8bcbe1df2e5974": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2017", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2017&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" + "flex": "2" } }, - "0cec5522da18426693db7de82cb3ba11": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "9ac9462df1ae4fd19814b5faa3effaf6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Dlt_Clc15", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" + "children": [ + "IPY_MODEL_c2a2f5b91e0f4fe9ab580a6b8f9c329e", + "IPY_MODEL_16576baf9e6c47919d284d9b3c12ef2c", + "IPY_MODEL_eef68294242a43d9807ad90ac85a56c6" ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - type de forêts&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.DLT.CLC15&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" + "layout": "IPY_MODEL_30248870024145e29cf67cc6d37292f0" } }, - "0d078818f2264d309eb89693a11f21c0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } + "a300698157d7421191e2907712cf3b27": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} }, - "0d192ec146414af6849e88a16b73c9b4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "bc689c0e95a64a1a91afe6f0b57d0fc3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 19, - "name": "BasemapAT.terrain", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/bmapgelaende/grau/google3857/{z}/{y}/{x}.jpeg" + "description_width": "", + "font_size": null, + "text_color": null } }, - "0d90d7e10cb84ca7a73de3dcd237aad7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "c2a2f5b91e0f4fe9ab580a6b8f9c329e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", - "max_zoom": 24, - "name": "Esri.ArcticOceanReference", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Ocean_Reference/MapServer/tile/{z}/{y}/{x}" + "layout": "IPY_MODEL_a300698157d7421191e2907712cf3b27", + "style": "IPY_MODEL_bc689c0e95a64a1a91afe6f0b57d0fc3", + "value": "l7_q_mosaic_im.tif: " } }, - "0dc89f07ba034bb3b004c5eb107acce6": { + "e7319b103b8e4c8992704dfe9bf16107": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", @@ -1161,10160 +748,20 @@ "width": "500px" } }, - "0e3a08d26ef34d6ebb2f53694f4250b5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2000_2005", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2000-2005&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } + "ee64c1dbb0dc425ca8109c422ccd627f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} }, - "0ea212476e574ab384b03b3ba3d525fe": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", + "eef68294242a43d9807ad90ac85a56c6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Geographicalgridsystems_Maps_Bduni_J1", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEMS.MAPS.BDUNI.J1&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "0edc17a204324f809b037f7ce0472f2b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 12, - "name": "GeoportailFrance.Landcover_Grid_Clc00_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC00_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "0f0eed9ad9664e71b110b20f856fb900": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "USGS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "USGSNAIPImagery:FalseColorComposite", - "name": "USGS NAIP Imagery False Color", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://imagery.nationalmap.gov/arcgis/services/USGSNAIPImagery/ImageServer/WMSServer?" - } - }, - "11a4bef230e5402cab42d3df33494f30": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "11f743f766894111a1ab3f0dcdc5627d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "12dc90e3df6040448b17497f4b03e4cf": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Rapideye_2010", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.RAPIDEYE.2010&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "12dd25af40d54c83ac1d4cbe277a7e34": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", - "name": "WaymarkedTrails.cycling", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.waymarkedtrails.org/cycling/{z}/{x}/{y}.png" - } - }, - "139ce42eb376427783979237a47729fc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Rb", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.RB&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "13eb7d1e6ada44b0ab6d821a7bf7996f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "© swisstopo", - "name": "SwissFederalGeoportal.NationalMapColor", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-farbe/default/current/3857/{z}/{x}/{y}.jpeg" - } - }, - "1426de7e72ba424a9f5568c84d4f5951": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc06r_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC06R_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1444c1e74ded4d208a401a8bbe58cac6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TopOSMRelief", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toposm-color-relief/{z}/{x}/{y}.jpg" - } - }, - "14fbcfb5f0e64992a88423de84cb7977": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Source: USGS, Esri, TANA, DeLorme, and NPS", - "max_zoom": 13, - "name": "Esri.WorldTerrain", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}" - } - }, - "1529e3dfcbfa482eaa0337b82cb00d9d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 12, - "name": "GeoportailFrance.Landcover_Grid_Clc00_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC00_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "16be15fa3fcc47478ce13bbb691cb31c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "17177268178c43d291b55cb6ba553b43": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Rapideye_2011", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.RAPIDEYE.2011&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1741c4879503445a91b325a765bdbc20": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "174c3ce5d202400a9ff3f68f24dbd0e7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "National Library of Scotland Historic Maps", - "name": "NLS", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://nls-0.tileserver.com/nls/{z}/{x}/{y}.jpg" - } - }, - "176b7226927c4890a83f5a593cd71fc3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 8, - "name": "NASAGIBS.BlueMarble", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_NextGeneration/default/EPSG3857_500m/{z}/{y}/{x}.jpeg" - } - }, - "176fb72ee0ff43c4997a4206d6cf0099": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2013", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2013&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "184a6ffeacbb41f691ef9a60267df561": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "189605f318914b549172c7867a372c08": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2017", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2017&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "189633018be748fca6bd19744258442c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Logements_Surface_Moyenne_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.LOGEMENTS.SURFACE.MOYENNE.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "198055bd64d745c59defdfeaeac12de2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France", - "max_zoom": 19, - "name": "OpenStreetMap.HOT", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png" - } - }, - "1a14b0d061724efd8aa844faccee885a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ilesdunord", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ILESDUNORD&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1a27114765f54377a1f8756fe928536c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TonerHybrid", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner-hybrid/{z}/{x}/{y}.png" - } - }, - "1a71b687e50944f4bfbba7f1cd4837a0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "ESA", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "WORLDCOVER_2020_MAP", - "name": "ESA Worldcover 2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://services.terrascope.be/wms/v2" - } - }, - "1a771ba316b84e45bd6a5e89e8e50692": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Sociaux_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.LOGEMENTS.SOCIAUX.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1acc1d044a194f37ba5761a6f8c0008e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2015", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2015&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1b37080be233439993f81330f8008887": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha12_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA12_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1c2f1be7d7a74c18984b67627e2aadf0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) OpenFireMap (CC-BY-SA)", - "max_zoom": 19, - "name": "OpenFireMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://openfiremap.org/hytiles/{z}/{x}/{y}.png" - } - }, - "1d08bb6c260045f6bdd7ae9bc125f462": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1e01389b4b09460d9d7dcc6d92f1371b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors & USGS", - "max_zoom": 22, - "name": "MtbMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://tile.mtbmap.cz/mtbmap_tiles/{z}/{x}/{y}.png" - } - }, - "1edec3ed0e494773a399a56581ad76e0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Ramsar", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.RAMSAR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1f0b61293af745a6945104b91e36b868": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2022", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2022&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1f77b8f7195f4564b6fe0ac55daadd7b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Usage", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.USAGE&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1fbad10940464372bad8f4862e695dc5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Geographicalgridsystems_Slopes_Mountain", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEMS.SLOPES.MOUNTAIN&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "1fbdad8cd0304323bfae36acdfe8df7b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc18_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC18_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "224d87783b74477a816d955293f3f705": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2006_2010", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2006-2010&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2252f25521984e0d8bf83df7d0afece4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Areamanagement_Zfu", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=AREAMANAGEMENT.ZFU&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2280d35e87b14e44962c555024e91347": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 19, - "name": "BasemapAT.grau", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/bmapgrau/normal/google3857/{z}/{y}/{x}.png" - } - }, - "237852be64494d4f934d66b2efd9aa87": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_Te94", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=RESEAU ROUTIER TE94&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.TE94&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "23983af145df463eacf1cd56bab920f0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Familles_Monoparentales_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.FAMILLES.MONOPARENTALES.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "239a3d35c3c947879f12418ca1251302": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", - "name": "OneMapSG.Grey", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps-a.onemap.sg/v3/Grey/{z}/{x}/{y}.png" - } - }, - "24cb3981714346fb8813621d3ceeff2d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2001", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2001&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "254fab5d91fd41338d17c64ffe7e0800": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Dreal_Zonage_pinel", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=DREAL.ZONAGE_PINEL&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "270b14ec39ad440f990e9385487ad160": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "292d8c2bd1a8457883c9d18f2a88b2b9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.VoyagerOnlyLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/rastertiles/voyager_only_labels/{z}/{x}/{y}.png" - } - }, - "29b81c59009040caaa1f8ce469f04fa3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Avant_1945_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.LOGEMENTS.AVANT.1945.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "29e1153630514c98946844902c6a6b46": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Hydrography_Bcae_2022", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=HYDROGRAPHY.BCAE.2022&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2a56e0d14ae84437949e207ea2ab4d4f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TonerLite", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png" - } - }, - "2affe6c5e3ee4f9ebbab81dbc0df1803": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha18_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA18_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2b224366e6c64d5a9f3ea7963f08b928": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.black", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/black/{z}/{x}/{y}.png" - } - }, - "2c0db9f2b48942858528aaa6c47acb3b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 8, - "name": "GeoportailFrance.Geographicalgridsystems_Maps_Overview", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.MAPS.OVERVIEW&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2d63b4c1624b4993b111ce84f64c5dce": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2021", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2021&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2d9ad3479043489fb2b2e1c0e4184d3d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Forestinventory_V2", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.FORESTINVENTORY.V2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2da96f610ac645ac9946c3f2c7439ae2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Hydrography_Bcae_Latest", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=HYDROGRAPHY.BCAE.LATEST&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2dacf4e9db5a4e4eb18ba46ca50ee896": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha06_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA06_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2de32208e7684e6189bed38ad3214573": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Google", - "max_zoom": 22, - "name": "Google Maps", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}" - } - }, - "2ecf97fe657a40e3aed74f18b2b4227b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Areamanagement_Zus", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=AREAMANAGEMENT.ZUS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "2f0acb1268ff4fa38374222226879b4a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.Voyager", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png" - } - }, - "2fdb1767645b445f91611c70ebe64edf": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Hr_Orthoimagery_Orthophotos", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=HR.ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "30bd36112b2d43878a025bbb65729b20": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 12, - "name": "NASAGIBS.ASTER_GDEM_Greyscale_Shaded_Relief", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/ASTER_GDEM_Greyscale_Shaded_Relief/default/GoogleMapsCompatible_Level12/{z}/{y}/{x}.jpg" - } - }, - "325156bcc92c43cd915f578254465739": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_Te120", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=RESEAU ROUTIER TE120&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.TE120&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "349008540cc94ca6845ba34d42dd6764": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2008", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2008&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "362a89586d0440e2981f0005c1d63c20": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Enfants_0_17_Ans_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.ENFANTS.0.17.ANS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "36d5e30c43954d3b962dd30878c3ee01": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Aphn", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.APHN&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "374eea89191f42178726aff5a69b82d3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 6, - "name": "NASAGIBS.ModisTerraAOD", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_Aerosol/default//GoogleMapsCompatible_Level6/{z}/{y}/{x}.png" - } - }, - "37d365630865465c85566a614c2b92d8": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Transports_Drones_Restrictions", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=TRANSPORTS.DRONES.RESTRICTIONS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3856675d89e341a9aed7017d2cd04bf3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2013", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2013&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3882be3f76d34ec4a537b5f3b2bc09ab": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.PositronNoLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png" - } - }, - "38b77d3e64114feeafc22a7bb29c9774": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Utilityandgovernmentalservices_All", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=UTILITYANDGOVERNMENTALSERVICES.ALL&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "392b0981cbc74e639376391bbd3b0ed4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Usage_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.USAGE.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "39a0468216e7402f848e6e63d71b235e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Collectifs_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.LOGEMENTS.COLLECTIFS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "39d1662469da40c193c5d0f576cc27d6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Usage_2002", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.USAGE.2002&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3a4e71f711834bd1b4d1e76978355957": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Pn", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.PN&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3adf2bc2b8c6445583d184ccde6bbd2d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.VoyagerNoLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png" - } - }, - "3ae3a8da10c949e58404e0c76370fb32": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2015", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2015&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3c3ad5a48eeb461bb94c68494dcd3e4b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles courtesy of the U.S. Geological Survey", - "max_zoom": 20, - "name": "USGS.USTopo", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}" - } - }, - "3d01d78a27eb45f08852550b4f3e27af": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2002", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2002&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3d0e84dd9cd54a2a90e039c4d6d334e6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.hispanic", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/hispanic/{z}/{x}/{y}.png" - } - }, - "3d8c842745084cbb8d814a10278421d0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", - "name": "OneMapSG.Original", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps-a.onemap.sg/v3/Original/{z}/{x}/{y}.png" - } - }, - "3e67dda4e80f45eab706d89b3ef5e8b5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_Pn", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=FRANCHISSEMENTS PASSAGE A NIVEAU&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.PN&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "3e69391c5d654a14baed5d4c1480237e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "© swisstopo", - "name": "SwissFederalGeoportal.NationalMapGrey", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-grau/default/current/3857/{z}/{x}/{y}.jpeg" - } - }, - "3f878393ab16499b8c7d49557b269871": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "400fefac67e043e89c13eb3a8527a812": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_1te", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=RESEAU ROUTIER 1TE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.1TE&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "40565afe31814dd38c58e7446154176f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "© Gaode.com", - "max_zoom": 19, - "name": "Gaode.Satellite", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}" - } - }, - "417136f11c15498e945c180997f15ad4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.plan", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/essentiels/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "41b947490fad4a73bd6b76b56d0e62bb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Ortho-sat-rapideye-2011_pyr-jpeg_wld_wm_2011", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHO-SAT-RAPIDEYE-2011_PYR-JPEG_WLD_WM_2011&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "426172e88ab142c3abe33c8214ee04a8": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Bios", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.BIOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "434cfdd6c172492d9325eaf3545a2802": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, - "4390a46abaa24171b291e2f6aa5ab01d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Sylvoecoregions", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.SYLVOECOREGIONS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "44a69000ca1e4130b6749eda6c504409": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "44f2d0ad677442fea844e84b08aabf00": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles courtesy of the U.S. Geological Survey", - "max_zoom": 20, - "name": "USGS.USImageryTopo", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}" - } - }, - "466d4a99e0f948168dfe135dac6815cf": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 16, - "name": "Stamen.Watercolor", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg" - } - }, - "4746610b265c49eb99deeb3a2535344f": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "flex": "2" - } - }, - "4a0806c2b3c1411484f465f3f002d8c1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Grid_Clc00", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC00&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "4a37198333754adca5f5412394120203": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc18", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC18&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "4a79a053acad4a57bb8c358ed629fee4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2011", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2011&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "4b15d647ab3d476694abc16ac2e1ac68": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Coast2000", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.COAST2000&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "4d6ff4c6d4184c05bf5206f084dabb57": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TopOSMFeatures", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toposm-features/{z}/{x}/{y}.png" - } - }, - "4d7b006bc9ed4b3aadcfe22e252cf7d3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 21, - "name": "GeoportailFrance.orthos", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "4e9ea1efb0a5463289ec19cb0d464e4f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stadia.Outdoors", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.stadiamaps.com/tiles/outdoors/{z}/{x}/{y}.png" - } - }, - "4ebef834ad5840dd9a3e7dd7a8cbaafd": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "509bb15bc89e4ae287c5562631adcb09": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "ESA", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "WORLDCOVER_2020_S2_TCC", - "name": "ESA Worldcover 2020 S2 TCC", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://services.terrascope.be/wms/v2" - } - }, - "50cf10c0d62c4072bca313ece253a95c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Pnr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.PNR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "533abcd7456b4fffac48131d7793b92e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Communes_Prioritydisctrict", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=COMMUNES.PRIORITYDISCTRICT&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5549f7a4403141058b8d1b90e724c28d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_Proprietaires_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.MENAGES.PROPRIETAIRES.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "55bd98340d444bac96244c63deb77049": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Sic", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.SIC&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "562c393e796f40009caa1f9b210335f3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 9, - "name": "NASAGIBS.ModisTerraTrueColorCR", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_CorrectedReflectance_TrueColor/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" - } - }, - "568f977f25b34d7799a79a0fddce3111": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5742a0633dff42189b7f2f09f17edc6a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 9, - "name": "NASAGIBS.ViirsTrueColorCR", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_TrueColor/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" - } - }, - "57ac173a8e9949daa38b56daa449d325": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Bdcarto_etat_major_Niveau3", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/sol/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=BDCARTO_ETAT-MAJOR.NIVEAU3&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5805e32483e84ffd9ba4759f691c21c0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors, visualization CC-By-SA 2.0 Freemap.sk", - "max_zoom": 16, - "name": "FreeMapSK", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.freemap.sk/T/{z}/{x}/{y}.jpeg" - } - }, - "596d7bf8a751416895ad2d4d95ee8f35": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5ae68bd3833444e3942eff5704d958a8": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Forets_Publiques", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=FORETS PUBLIQUES ONF&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=FORETS.PUBLIQUES&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5bb1a10cfe164cd89cc2e50b2734100b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc06r_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC06R_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5c8d4e593621415a919c2338479a6591": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", - "name": "OneMapSG.Default", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps-a.onemap.sg/v3/Default/{z}/{x}/{y}.png" - } - }, - "5d76bbf54dab452e84e5925c38f15fe9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_Pauvres_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.MENAGES.PAUVRES.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5d820c256a8e4e69bafdcf7272aba06f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stadia.OSMBright", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.stadiamaps.com/tiles/osm_bright/{z}/{x}/{y}.png" - } - }, - "5d9bfbb4d1ac4828a4cb57f963cc830d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5e2e524bf71c4cbbbe437cfaeefb1f11": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5e46300833174735af9ede642d27102f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Elevation_Elevationgridcoverage_Shadow", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=estompage_grayscale&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "5fe7e0e8ba214fc5ba6d9baea02f3abc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Geographicalgridsystems_Etatmajor40", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR40&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "60334a8ee22740d0af497961bbfaf1b1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2021", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2021&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "60b9da4079ac4d57bbd9c114d0a0a68a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Znieff1_Sea", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.ZNIEFF1.SEA&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "620a9957068a4eb395b319d9b4e5c888": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "627df44e88774222b6fd1ec2fd85115e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Usage_2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.USAGE.2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "62bd67b1737b44a29b421cf884e97adb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.parcels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/essentiels/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=CADASTRALPARCELS.PARCELLAIRE_EXPRESS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "635a5fdcd4be4bcaa3a731546b236307": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_Maison_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.MENAGES.MAISON.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6425560f7ea74aa3999a3d76ef9978d0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Copyright: (C)2012 DeLorme", - "max_zoom": 11, - "name": "Esri.DeLorme", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/Specialty/DeLorme_World_Base_Map/MapServer/tile/{z}/{y}/{x}" - } - }, - "645c2bbaebb54b1d8c7b9f30842b68a2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 9, - "name": "NASAGIBS.ModisTerraBands721CR", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands721/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" - } - }, - "647f08bc3f3944de97ba662b457006d3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2001_Land_Cover_L48", - "name": "NLCD 2001 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2001_Land_Cover_L48/wms?" - } - }, - "6523b3bc722a4ab9906ab6c802a29f34": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Znieff1", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.ZNIEFF1&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "65f6dc2f6b0042dd9a00e3df44a2aa37": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Esri, DeLorme, NAVTEQ", - "max_zoom": 16, - "name": "Esri.WorldGrayCanvas", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}" - } - }, - "6707898119e545faba6017938f4d290f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri", - "max_zoom": 13, - "name": "Esri.OceanBasemap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}" - } - }, - "685806cb62e44477841d5e59ede902cb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", - "max_zoom": 24, - "name": "Esri.ArcticOceanBase", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Ocean_Base/MapServer/tile/{z}/{y}/{x}" - } - }, - "69c0dbb112fb45e1bf677d7dd87c9f15": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, - "6ad5ef29f47b45f09ba7e01c8d4fe72c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Grid_Clc90_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC90_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6b32386c69064e7285514dcb1ab0906f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors, Tiles courtesy of Breton OpenStreetMap Team", - "max_zoom": 19, - "name": "OpenStreetMap.BZH", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.openstreetmap.bzh/br/{z}/{x}/{y}.png" - } - }, - "6b481e34f2244cd6ba4be1294f25546f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Kaartgegevens (C) Kadaster", - "max_zoom": 19, - "name": "nlmaps.standaard", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/standaard/EPSG:3857/{z}/{x}/{y}.png" - } - }, - "6bfa071f78f94ff687e11ad52cf82946": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Constructions_2002", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.CONSTRUCTIONS.2002&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6d261c4e01e544468096ed9a1db4eec0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Rnc", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.RNC&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6d39e070b951449ea6beec27475b23e3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Ocsge_Visu_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.VISU.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6db28222e76740d5a0a4802ac327f8a5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc00r_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC00R_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6df07f007a69464a90f0f3bba508f227": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Google", - "max_zoom": 22, - "name": "Google Satellite", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}" - } - }, - "6e0cbd75c28b4653ae975ceb9e291704": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 7, - "name": "NASAGIBS.ModisTerraLSTDay", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_Land_Surface_Temp_Day/default//GoogleMapsCompatible_Level7/{z}/{y}/{x}.png" - } - }, - "6eba43af2ff74cc09a2a467c5f8c11b6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Mnhn_Cdl_Perimeter", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.MNHN.CDL.PERIMETER&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6ed89fbd84eb4a18aa8aae53fbca924f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Couverture", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.COUVERTURE&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "6f0249454a694401af3f90e96ace6d5e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Limites_administratives_express_Latest", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/administratif/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LIMITES_ADMINISTRATIVES_EXPRESS.LATEST&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "701256ce217243a29d90c1548db29b0f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha18_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA18_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "71129ffbaf744c0eba675519f07c6591": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2013", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2013&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7124694693114bfeb648dcfeb8f00b8b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "openAIP Data (CC-BY-NC-SA)", - "max_zoom": 14, - "name": "OpenAIP", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png" - } - }, - "7127bab7b5dd45c8b19397f15be6ec31": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map memomaps.de CC-BY-SA, map data (C) OpenStreetMap contributors", - "name": "OPNVKarte", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png" - } - }, - "71bfa97af49a40a2b33349b4fba8c5e9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2021", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2021&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "720b9e4e783649f3853ddfab46c4b195": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 9, - "name": "NASAGIBS.ModisTerraBands367CR", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_CorrectedReflectance_Bands367/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" - } - }, - "737c0d2094614664b86958bb443d6292": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2017", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2017&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "73ace310a92a489ba370bfc94b74a465": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Strava 2021", - "max_zoom": 15, - "name": "Strava.Ride", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://heatmap-external-a.strava.com/tiles/ride/hot/{z}/{x}/{y}.png" - } - }, - "73bd2f12e9724531980d719b3f838641": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.white", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/white/{z}/{x}/{y}.png" - } - }, - "740e3c2b263c4e84a3cda009cecc38b4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Earthstar Geographics", - "max_zoom": 24, - "name": "Esri.AntarcticImagery", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Antarctic_Imagery/MapServer/tile/{z}/{y}/{x}" - } - }, - "749101587d6f4488912fbefe5ca654c7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2003", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2003&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "756bc4bc41c642f0ba7c865298487a64": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc06_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC06_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7603f63d6cd048a6aa558655e7354cc7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "FWS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "0", - "name": "FWS NWI Wetlands Raster", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.fws.gov/wetlands/arcgis/services/Wetlands_Raster/ImageServer/WMSServer?" - } - }, - "7638dc8ae5eb40acb7eb09e854dce02d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2017", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2017&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "765a56318fa2453582483594d369320f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2015", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2015&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "76f266babb6c47d78499f8fdb4527ad7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.income", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/income/{z}/{x}/{y}.png" - } - }, - "7752ddaf0b9c41738067458dbf71f542": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.VoyagerLabelsUnder", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png" - } - }, - "77c0177947c84d788ceef8fb3dcc583a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TonerBackground", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner-background/{z}/{x}/{y}.png" - } - }, - "782b6527e8ed487eab4ddbc3dc9a418b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Pnm", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.PNM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7996ea3708574cf6b1d37a1b0e50f162": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2016_Land_Cover_L48", - "name": "NLCD 2016 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2016_Land_Cover_L48/wms?" - } - }, - "7bb280b5b8db45a1848ec1eead344b79": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "name": "Stamen.TerrainLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/terrain-labels/{z}/{x}/{y}.png" - } - }, - "7bb5d1385eb04685a9ef627debd02c53": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Dlt_Clc12", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - type de forêts&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.DLT.CLC12&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7bc4cb64f88046998d9fa4f6d5241618": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Geographicalgridsystems_Etatmajor10", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR10&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7c74c576e12940be8ea75fa32b4f07cb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors", - "max_zoom": 19, - "name": "HikeBike.HikeBike", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.wmflabs.org/hikebike/{z}/{x}/{y}.png" - } - }, - "7d117cce1ee9403e86c611b643075bf6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Individus_25_39_Ans_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.INDIVIDUS.25.39.ANS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7e04be5bdb1d44328fdec03d60688e5e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Population", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.POPULATION&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7e1ddfbbb0544172bc75371c22886cf0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", - "name": "WaymarkedTrails.mtb", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.waymarkedtrails.org/mtb/{z}/{x}/{y}.png" - } - }, - "7e936f70cbc54a928bad8dd01da58eef": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Apb", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.APB&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "7f1f4989f6dc482c882d053c5cc2ab56": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 8, - "name": "NASAGIBS.ModisTerraSnowCover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_NDSI_Snow_Cover/default//GoogleMapsCompatible_Level8/{z}/{y}/{x}.png" - } - }, - "800f5834cc4642239bc770916d765665": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2007", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2007&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "801fad10a6ae4e19a152217545d0d9e5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Elevation_Elevationgridcoverage_Threshold", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=ELEVATION.ELEVATIONGRIDCOVERAGE.THRESHOLD&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ELEVATION.ELEVATIONGRIDCOVERAGE.THRESHOLD&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "80f257d5a58644938e65f5f11ad1b246": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Strava 2021", - "max_zoom": 15, - "name": "Strava.All", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://heatmap-external-a.strava.com/tiles/all/hot/{z}/{x}/{y}.png" - } - }, - "810f1ccccaa1488082d341dfe71730a6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2005", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2005&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8180103667fc4e1ea9a79c39dee79df4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2017", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2017&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "818d7335d872471788721301a497bd61": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Inpg", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.INPG&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "81f519af096645e9bc8f8c0a1eb89098": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors, SRTM | Map style: (C) OpenTopoMap (CC-BY-SA)", - "max_zoom": 17, - "name": "OpenTopoMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.tile.opentopomap.org/{z}/{x}/{y}.png" - } - }, - "83050b78b1cc4bb2bf72cf46feb6e1c9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors", - "name": "OpenStreetMap.DE", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.tile.openstreetmap.de/{z}/{x}/{y}.png" - } - }, - "831e7097de4943c4b6062b6d2398fa49": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Couverture_2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.COUVERTURE.2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8484428620d849498e5d86a0d4a16d0f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2004_Land_Cover_L48", - "name": "NLCD 2004 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2004_Land_Cover_L48/wms?" - } - }, - "84b37e633b3b46f39281353b45d2b8d1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.PositronOnlyLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png" - } - }, - "855d92531955475687f7e536daf72743": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Google", - "max_zoom": 22, - "name": "Google Terrain", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z}" - } - }, - "8561dd9d5a8d41d498302125bb20af42": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 20, - "name": "BasemapAT.orthofoto", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{z}/{y}/{x}.jpeg" - } - }, - "8591b33d51a54275a6f57d38366c8afc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc12r_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC12R_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "861bf27bf8f744a19b544f64f3d634f0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Gp", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.GP&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8691c48bb1dd48f5bf1ebdaca2a244ee": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Google", - "max_zoom": 22, - "name": "Google Satellite", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}" - } - }, - "883f4f76cd734c7a89860ae9d53bd43f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Strava 2021", - "max_zoom": 15, - "name": "Strava.Winter", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://heatmap-external-a.strava.com/tiles/winter/hot/{z}/{x}/{y}.png" - } - }, - "892a380c2ef943a7a7c16f5109559e39": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenSeaMap contributors", - "max_zoom": 22, - "name": "OpenSeaMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.openseamap.org/seamark/{z}/{x}/{y}.png" - } - }, - "8a5718e4374a46a09d0ec029fdaa0d1c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_5_Personnes_Ouplus_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.MENAGES.5.PERSONNES.OUPLUS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8b3769e0915c4d1fa738d39cc10b1f21": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_f49fa757b4244a59a372380efa9078e0", - "style": "IPY_MODEL_99e53fff223e4c94ad39b1d0f0365007", - "value": " 108M/108M (raw) [100.0%] in 00:23 (eta: 00:00)" - } - }, - "8b6b033f1be34ac2a4831daadb250ba1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2011_Land_Cover_L48", - "name": "NLCD 2011 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2011_Land_Cover_L48/wms?" - } - }, - "8be8e4616b1543d0b70374f293b0ebf6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Strava 2021", - "max_zoom": 15, - "name": "Strava.Water", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://heatmap-external-a.strava.com/tiles/water/blue/{z}/{x}/{y}.png" - } - }, - "8c4ad14664ea49fabdb5d5a44eae99f5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012", - "max_zoom": 22, - "name": "Esri.WorldStreetMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}" - } - }, - "8c75aa29fabb4d09a1591a3c169f23b6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_Pnd", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=FRANCHISSEMENTS PASSAGE A NIVEAU DIFFICILE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.PND&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8c96ba5d157d486181b40efb0e01a973": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2006_Land_Cover_L48", - "name": "NLCD 2006 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2006_Land_Cover_L48/wms?" - } - }, - "8d5fa5217c434f45ad7d9e4fa83d24f0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Socle_asp_2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.SOCLE-ASP.2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8d9ca26717d44036aeb2e4edb5737470": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2007", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2007&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8df6a2e75949425a9f10616a4339bade": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 12, - "name": "GeoportailFrance.Landcover_Grid_Clc06_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC06_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8e9034ae891043d8bb0bf8255b77454f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8ed6498afd5d4082b808e753ca6dd153": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha12_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA12_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8f3556ec3d094e30bf4818ba5ed71aba": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8f66de71cb5947c98061e7a0844a80b9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 5, - "name": "NASAGIBS.BlueMarble3413", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/BlueMarble_NextGeneration/default/EPSG3413_500m/{z}/{y}/{x}.jpeg" - } - }, - "8f71e63ccc7d4b02b77518866f666c00": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedsites_Mnhn_Reserves_regionales", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDSITES.MNHN.RESERVES-REGIONALES&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "8fdfc45e07a7441f972b9d9de91b37a3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.Toner", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner/{z}/{x}/{y}.png" - } - }, - "8fe71bb44c304da8899ae60f876d4fb0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_All", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=TOUS LES FRANCHISSEMENTS&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.ALL&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "901170c9c7a04fb38a57af3311ba9460": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "© swisstopo", - "max_zoom": 19, - "name": "SwissFederalGeoportal.SWISSIMAGE", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.swissimage/default/current/3857/{z}/{x}/{y}.jpeg" - } - }, - "917f36793a0a4f27be5387222cac6cca": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Rncf", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.RNCF&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "919797af46154e6787fd7c3923306094": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Couverture_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.COUVERTURE.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "932f275d41fe494b85bcf57df09899e8": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Apres_1990_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.LOGEMENTS.APRES.1990.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "93a6feac64614711954b2a6e9f3a084d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2015", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2015&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "93b67cd7318441de96063ddec738e9d4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "USGS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "USGSNAIPImagery:NDVI_Color", - "name": "USGS NAIP Imagery NDVI", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://imagery.nationalmap.gov/arcgis/services/USGSNAIPImagery/ImageServer/WMSServer?" - } - }, - "9609afe013384c8baf97bcdf7dd39246": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.Positron", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png" - } - }, - "968ae9af08eb451287b73ec78376aac1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc00_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC00_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "976bc783105b4aa9b42376b46f046bc8": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 19, - "name": "BasemapAT.overlay", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/bmapoverlay/normal/google3857/{z}/{y}/{x}.png" - } - }, - "9799ce4acd774d42b8aeee3db999e5b2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Usage_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.USAGE.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "98fbbab7839d409493c18ab27ae2e1bc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2009", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2009&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "99b67a0f61c947b2a3565d87979fe914": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 20, - "name": "BasemapAT.basemap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/geolandbasemap/normal/google3857/{z}/{y}/{x}.png" - } - }, - "99badff3dc2642b9ac2067a7b7d638f3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Strava 2021", - "max_zoom": 15, - "name": "Strava.Run", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://heatmap-external-a.strava.com/tiles/run/bluered/{z}/{x}/{y}.png" - } - }, - "99da69bf80564f6abf05f063f5bcb8b2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.americanIndian", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/indian/{z}/{x}/{y}.png" - } - }, - "99e53fff223e4c94ad39b1d0f0365007": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, - "9a068fea5507436cbb4798fb98607405": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", - "name": "WaymarkedTrails.riding", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.waymarkedtrails.org/riding/{z}/{x}/{y}.png" - } - }, - "9a6c7f5a0d8548a8bf5f16d0fc974fb0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Construits_1945_1970_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.LOGEMENTS.CONSTRUITS.1945.1970.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9ada44974a864baf85b7b0b3c7c070a1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Couverture_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.COUVERTURE.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9afd2f898fe748afa704f4c31606166a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Transportnetworks_Roads", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=TRANSPORTNETWORKS.ROADS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9c32f7c91b1e4414863e3ce6a16bd3d1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc18_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC18_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9c65f107fd2f4222893104b12d495e32": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 21, - "name": "GeoportailFrance.Thr_Orthoimagery_Orthophotos", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=THR.ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9c9478b4eeb144ed962cecaca604955c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.plurality", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/plural/{z}/{x}/{y}.png" - } - }, - "9cfc3a0a565245a88533ea882329163b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Rn", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.RN&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9d4c68f6e2cb46d18a7bb1af8e47ec82": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2015", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2015&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9dc8337a8a8c436f862d64f70dd916dd": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "USGS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "USGSNAIPImagery:NaturalColor", - "name": "USGS NAIP Imagery", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://imagery.nationalmap.gov/arcgis/services/USGSNAIPImagery/ImageServer/WMSServer?" - } - }, - "9dda5565436c4d0db6346553c6f2aee2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2022", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2022&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9f7d40ec429149299e73652c123f93d1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Plus_65_Ans_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.PLUS.65.ANS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9f803fa6bbe242d28e283297aa1aca66": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Znieff2_Sea", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.ZNIEFF2.SEA&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "9fda588c434e4880972ff6636c5ce3fb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a04b62fb490f4043868a034d76bc08e2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2022", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2022&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a0d84cc1997c42ee996383778775936f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2000", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2000&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a0dfc43f091443999f593d51cd48f74f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2012", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2012&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a15a0383942f4626a784b7efc7ce9589": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Protectedareas_Prsf", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=POINT RENCONTRE SECOURS FORET&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.PRSF&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a1650305f00a48b7bd4ff9c4a7f26111": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", - "name": "OneMapSG.LandLot", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps-a.onemap.sg/v3/LandLot/{z}/{x}/{y}.png" - } - }, - "a172c3b066a94f5db64244950f757620": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Mnhn_Cdl_Parcels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.MNHN.CDL.PARCELS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a1ca0382c8a64e5da942968f68a582c2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TonerLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}.png" - } - }, - "a35d3e0f1889481a86171ac3d805521a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Grid_Clc06", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC06&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a369281b847147d58073c65cccec7702": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Buildings_Buildings", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=BUILDINGS.BUILDINGS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a371561af06a4c89b479541352c62b32": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2011_2015", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2011-2015&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a39f4af3b76e46079b4c80c6395a7e35": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors", - "name": "OpenStreetMap.BlackAndWhite", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://a.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png" - } - }, - "a4135c2536144e398ad6fe61bab2146f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Constructions_2014", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.CONSTRUCTIONS.2014&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a41d8db9b36c4a8eaa778bc54607770c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", - "name": "OneMapSG.Night", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps-a.onemap.sg/v3/Night/{z}/{x}/{y}.png" - } - }, - "a52b476d903644a2a20899fca64630eb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 21, - "name": "GeoportailFrance.Pcrs_Lamb93", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=LAMB93_5cm&FORMAT=image/jpeg&LAYER=PCRS.LAMB93&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a5e74919eb254363a763d5059b05bed6": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "display": "inline-flex", - "flex_flow": "row wrap", - "width": "100%" - } - }, - "a60887a767584a26a17d07296126d7fa": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Adminexpress_cog_Latest", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/administratif/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ADMINEXPRESS-COG.LATEST&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a73b598ae20a4d5d9394402be02b356e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2011", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2011&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a7e35bb8b9de47fc9eef9bbc63c609a1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Transportnetworks_Roads_Direction", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=TRANSPORTNETWORKS.ROADS.DIRECTION&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a8a97ed9752d4e6fa002b355d0cd23b6": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_69c0dbb112fb45e1bf677d7dd87c9f15", - "style": "IPY_MODEL_434cfdd6c172492d9325eaf3545a2802", - "value": "l7_q_mosaic_im.tif: " - } - }, - "a8cffd8a3eef42c8b527a632cbd1dc6a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stadia.AlidadeSmooth", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}.png" - } - }, - "a9217193b69f4af28ea92c036279a763": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc00_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC00_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "a97e0274437347cdb76d9d86d3a111d2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ab54fdcff27f479f962ebcab02e9b00c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.DarkMatter", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png" - } - }, - "ab9a5f3904a54ef69d61504e69e2ba1b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc12_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC12_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ababaf5b466b48d3abdf155447980d46": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Transportnetwork_Commontransportelements_Markerpost", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=TRANSPORTNETWORK.COMMONTRANSPORTELEMENTS.MARKERPOST&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "abf83e989150470f8b06145cf9857449": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Kaartgegevens (C) Kadaster", - "max_zoom": 19, - "name": "nlmaps.luchtfoto", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg" - } - }, - "acb9869a482a4e4c9496683c2e814705": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Hydrography_Hydrography", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=HYDROGRAPHY.HYDROGRAPHY&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ad0a97c4e7b64c92a0b8282dbcf06946": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Couverture_2002", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.COUVERTURE.2002&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "adb381edc57745ad8e9ac6df57d7a3a0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Tcd_Clc12", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - taux de couvert arboré&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.TCD.CLC12&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ae654ac47a254ed4b47e942286c1a72a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2021", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2021&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "afce434396a04f7dbc3ba5b0c2732325": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Construits_1970_1990_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.LOGEMENTS.CONSTRUITS.1970.1990.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b1e22df0f08b4ea7a80675e1e4bf2296": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_1980_1995", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.1980-1995&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b26a05a03e4548aabfa47a8ddcaf9ea6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors", - "name": "OpenStreetMap.CH", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.osm.ch/switzerland/{z}/{x}/{y}.png" - } - }, - "b27c479b3b784e3498e74796111d9ed7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Imd_Clc12", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - taux d'imperméabilisation des sols&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.IMD.CLC12&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b40b74fd035a48339042b4151e85ea7b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b5ce87a543504d2ea36e6d79ba068ddc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_2te48", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=RESEAU ROUTIER 2TE48&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.2TE48&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b5dc7bb95545443082b019f5fbad3f35": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2004", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2004&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b6cf368f3ede408d8db4540316348727": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc12_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC12_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b782bed83d4846b9be57d2bfcb1acf76": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2010", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2010&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "b93a5817afae4fc79f61e5ae714424cf": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors", - "max_zoom": 15, - "name": "HikeBike.HillShading", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.wmflabs.org/hillshading/{z}/{x}/{y}.png" - } - }, - "b9ef5828ca0540c0a97634bb6d731384": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Znieff2", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.ZNIEFF2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "bc6ba16488e64fd5bc9aa7057dcf3319": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Grid_Clc06r", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC06R&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "bc79d605b932425292a80315090717d3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 12, - "name": "GeoportailFrance.Landcover_Grid_Clc06_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC06_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "bd360ed188d045da814e37e854dc0794": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Sylvoecoregions_Alluvium", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.SYLVOECOREGIONS.ALLUVIUM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "be36776e688e4893b2a63caaa746b36a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) SafeCast (CC-BY-SA)", - "max_zoom": 16, - "name": "SafeCast", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://s3.amazonaws.com/te512.safecast.org/{z}/{x}/{y}.png" - } - }, - "bf9f8982fd354061920fd8b7d345b02d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Geographicalnames_Names", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALNAMES.NAMES&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c0a848fc6dbf4aaab12eef86deb47900": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c13f7f230dc44eccb0fe9ff5af516bc0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 9, - "name": "NASAGIBS.ModisAquaBands721CR", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_Bands721/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" - } - }, - "c18a99edf9874d79acca92fe01472b8c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Grid_Clc12", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC12&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c19622e0c45c4ae4b708f8d472db0d9e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.multi", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/multi/{z}/{x}/{y}.png" - } - }, - "c2d374a53ee04dee80926093741d0249": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", - "max_zoom": 22, - "name": "Esri.WorldTopoMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}" - } - }, - "c32735175dcb42e58432b137488d3714": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha00_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA00_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c4802d957db04cbe8bb6fb535f9b5519": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "FloatProgressModel", - "state": { - "bar_style": "success", - "layout": "IPY_MODEL_4746610b265c49eb99deeb3a2535344f", - "max": 107780448, - "style": "IPY_MODEL_ee01c99dc6ce405b87c40e568f7ff6fd", - "value": 107780448 - } - }, - "c488ea510e764aaaa88814ad95de99d0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "ESA", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "WORLDCOVER_2020_S2_FCC", - "name": "ESA Worldcover 2020 S2 FCC", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://services.terrascope.be/wms/v2" - } - }, - "c55d96fa477c4ca0aaf8a8e528b90dac": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Niveau_De_Vie_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.NIVEAU.DE.VIE.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c589b0d954744653bd7388c8879b0aa9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Geographicalgridsystems_Terrier_v2", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEMS.TERRIER_V2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c5f74409830e438e9754300f134defef": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", - "name": "WaymarkedTrails.slopes", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.waymarkedtrails.org/slopes/{z}/{x}/{y}.png" - } - }, - "c64e3144d27448f98d5eda04906ccae6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Orthoimagery_Orthophos_Restrictedareas", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHOPHOS.RESTRICTEDAREAS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c688aa6807d74cc386260e4cf7cc8eb2": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 14, - "name": "GeoportailFrance.Elevation_Slopes", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ELEVATION.SLOPES&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c69ddd7a77274fa39f3f0a932b03e022": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Ripn", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.RIPN&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c6a748ea834241fe8446268c5e10d619": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 19, - "name": "BasemapAT.surface", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/bmapoberflaeche/grau/google3857/{z}/{y}/{x}.jpeg" - } - }, - "c6e983f29539452788b05fe25f0a5669": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Grid_Clc00r_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC00R_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "c958eef5ffe947efb5e78de0b715558e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 9, - "name": "NASAGIBS.ModisAquaTrueColorCR", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_TrueColor/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" - } - }, - "ca2c9540025d45159af427cb0f5f0c78": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Kaartgegevens (C) Kadaster", - "max_zoom": 19, - "name": "nlmaps.pastel", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/pastel/EPSG:3857/{z}/{x}/{y}.png" - } - }, - "ca4fd836a42d400793051eec678c480d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Source: US National Park Service", - "max_zoom": 8, - "name": "Esri.WorldPhysical", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}" - } - }, - "ca7f08c5380b4809850ae0cb8fdaf323": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Adminexpress_cog_carto_Latest", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/administratif/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ADMINEXPRESS-COG-CARTO.LATEST&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "cab4fb1db6b343239f9baa1e17971e46": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Elevation_Contour_Line", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ELEVATION.CONTOUR.LINE&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "cb2f6fd4192c4ffd881917161de360d9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2009", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2009&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "cb869f26b447492ba914df8f6e97dc45": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2008_Land_Cover_L48", - "name": "NLCD 2008 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2008_Land_Cover_L48/wms?" - } - }, - "cbfebcfba20949279a2b5d798c458669": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stamen.TonerLines", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner-lines/{z}/{x}/{y}.png" - } - }, - "cc862734ae924bb18309308fe65663bb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2010", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2010&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "cd394adeb7594304a898a05dc66fa1d7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc12r_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC12R_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "cd3cd731f18e4628ad8713b1dceeccbf": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Transportnetworks_Railways", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=TRANSPORTNETWORKS.RAILWAYS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d00357a84ab94c6686d7fb1fd42b86f9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles courtesy of the U.S. Geological Survey", - "max_zoom": 20, - "name": "USGS.USImagery", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}" - } - }, - "d00508d5d2ef4474ae811d5847f01284": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Elevationgridcoverage_Highres_Quality", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=Graphe de source du RGE Alti&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ELEVATIONGRIDCOVERAGE.HIGHRES.QUALITY&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d0b0354c9fd44c9b89b1dd7d96abb9a3": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Geographicalgridsystems_1900typemaps", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.1900TYPEMAPS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d1470e04abc34f4f9e0788fc7bd7e4e6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap France | (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "OpenStreetMap.France", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png" - } - }, - "d1577db2495041da8f7738f082334fdd": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HBoxModel", - "state": { - "children": [ - "IPY_MODEL_a8a97ed9752d4e6fa002b355d0cd23b6", - "IPY_MODEL_c4802d957db04cbe8bb6fb535f9b5519", - "IPY_MODEL_8b3769e0915c4d1fa738d39cc10b1f21" - ], - "layout": "IPY_MODEL_a5e74919eb254363a763d5059b05bed6" - } - }, - "d1af8e2fa54f4ef79225d153478c90d1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2013_Land_Cover_L48", - "name": "NLCD 2013 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2013_Land_Cover_L48/wms?" - } - }, - "d343069a93a948d9b9a87a1b856b16db": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Geographicalgridsystems_Maps_Scan50_1950", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=SCAN50_1950&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN50.1950&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d3be25b251e643fdba82999df915ae1a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.nonWhite", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/nonwhite/{z}/{x}/{y}.png" - } - }, - "d3c34fbdd9df4c9ca222f3de462efc6d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Bdcarto_etat_major_Niveau4", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/sol/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=BDCARTO_ETAT-MAJOR.NIVEAU4&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d3ebbd7e38b34f7b96221055c91cf55b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc12", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC12&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d41aca0d975c4ea3b981ff8fc64eebc4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2022", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2022&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d4317df52b2149aeb7d8846dafab5932": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Kaartgegevens (C) Kadaster", - "max_zoom": 19, - "name": "nlmaps.grijs", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/grijs/EPSG:3857/{z}/{x}/{y}.png" - } - }, - "d43d82654e0d4736aced0962907793dc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 20, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Urgence_Alex", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.URGENCE.ALEX&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d5351414882144b0ac82510e41b1a57d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "Stadia.AlidadeSmoothDark", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}.png" - } - }, - "d5cfdc4f6f1e481fafc02cab36c5c8ac": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2012", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2012&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d624274914f147aab645d878d82312b0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Justice Map", - "max_zoom": 22, - "name": "JusticeMap.asian", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://www.justicemap.org/tile/county/asian/{z}/{x}/{y}.png" - } - }, - "d651067234d3498cb5d701d2e02325b1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Tcd_Clc15", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - taux de couvert arboré&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.TCD.CLC15&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d66fbc5d06a84ca49b1c6eb6ea2971c1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Mnhn_Rn_Perimeter", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.MNHN.RN.PERIMETER&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d709c314696c4c719acfe20267b36ab5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Bdortho", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d716f870662242f5a5bde1c33469da4f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "MRLC", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "NLCD_2019_Land_Cover_L48", - "name": "NLCD 2019 CONUS Land Cover", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2019_Land_Cover_L48/wms?" - } - }, - "d7b8184bf9a644e986fe2a42d87a26e5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2008", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2008&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d811689d16bb433b87dd02241955451a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Constructions_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.CONSTRUCTIONS.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "d86437b33ee14c3687df151c009edd0f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha06_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA06_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "da16d38c306a4b21adbcfe4a86f74046": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", - "name": "WaymarkedTrails.hiking", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.waymarkedtrails.org/hiking/{z}/{x}/{y}.png" - } - }, - "dac60b04389d413aa3928167a415c712": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "OpenStreetMap", - "max_zoom": 22, - "name": "OpenStreetMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ] - } - }, - "db2ccfc5272e444b8165516dc96cf409": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Datenquelle: basemap.at", - "max_zoom": 19, - "name": "BasemapAT.highdpi", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://maps.wien.gv.at/basemap/bmaphidpi/normal/google3857/{z}/{y}/{x}.jpeg" - } - }, - "db554fb39ddc423d84d63e73e9e666e0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Kaartgegevens (C) Kadaster", - "max_zoom": 19, - "name": "nlmaps.water", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/water/EPSG:3857/{z}/{x}/{y}.png" - } - }, - "dcb0fc749d284d93be6e5140a68638c4": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2013", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2013&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ddb8a2999f9f465a94af905e01bfd7e1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community", - "max_zoom": 22, - "name": "Esri.WorldImagery", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}" - } - }, - "dde6c6210d3048828677b54b6a3e289f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Securoute_Te_Oa", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/transports/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=AUTRES FRANCHISSEMENTS&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=SECUROUTE.TE.OA&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "de245b0bbb5740ffb9bbfb6bdbea00c6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2012", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2012&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "df2c4506f4664d97a5821fba78ee37ae": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "df8dab0cb2714fc7a8f6e05fe2b835c6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Transportnetworks_Runways", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/topographie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=TRANSPORTNETWORKS.RUNWAYS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e171dd403d9347a8a9d0088576e131ea": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 12, - "name": "GeoportailFrance.Landcover_Grid_Clc06r_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC06R_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e1c7b3cf6e004bbb94a8d081c67275df": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Insee_Filosofi_Part_Individus_55_64_Ans_Secret", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/economie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=INSEE&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=INSEE.FILOSOFI.PART.INDIVIDUS.55.64.ANS.SECRET&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e27f65067c62469dbd2f2a33018ce0fa": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "CyclOSM | Map data: (C) OpenStreetMap contributors", - "max_zoom": 20, - "name": "CyclOSM", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png" - } - }, - "e2ea97a4d30f41de9d666bf7e0dc8424": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 8, - "name": "NASAGIBS.ViirsEarthAtNight2012", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/VIIRS_CityLights_2012/default//GoogleMapsCompatible_Level8/{z}/{y}/{x}.jpg" - } - }, - "e301684483724477a22fdde7f79c00ac": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e3be6687c37846b9a54d5a4edaf1ca0f": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e524d1ddee74443c9943d03604731cfe": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2018", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2018&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e58eca160d07441391eee9c77ade4d3a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "FWS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "1", - "name": "FWS NWI Wetlands", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://www.fws.gov/wetlands/arcgis/services/Wetlands/MapServer/WMSServer?" - } - }, - "e594b9cb3e144236b5f2c02bde9b178a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc12r", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC12R&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e5ba78fe6fdf485284bfccfca873c5ca": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC", - "max_zoom": 16, - "name": "Esri.NatGeoWorldMap", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}" - } - }, - "e63c94aa774042b89f0d72d2d1fe95fb": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 15, - "name": "GeoportailFrance.Geographicalgridsystems_Slopes_Pac", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEMS.SLOPES.PAC&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e751bb707b214107833049345d71ea9d": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 20, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2021", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ortho/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2021&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e886e752f1294bb5a0df181fc72796e9": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 13, - "name": "GeoportailFrance.Landcover_Hr_Waw_Clc15", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - HR - zones humides et surfaces en eaux permanentes&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.HR.WAW.CLC15&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e89cf076c98e43ee84867240a9d8b98e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Tiles (C) Esri -- Source: Esri", - "max_zoom": 13, - "name": "Esri.WorldShadedRelief", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}" - } - }, - "e98ac781d4b04cbfbf3a1e51489bcd54": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc90_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC90_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "e9ccaaff82e04b2c87fca72b5bb821bc": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 17, - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHO-SAT.SPOT.2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ea4cac54d70849dba236fb362c65d441": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Geographicalgridsystem_Dfci", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=GEOGRAPHICALGRIDSYSTEM.DFCI&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ead5cb8c3f61450caec7087865852556": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Clc06_fr", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - France métropolitaine&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CLC06_FR&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "eb49e38b3578429bb14d3af920c95076": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Ocsge_Constructions_2019", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/ocsge/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=nolegend&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=OCSGE.CONSTRUCTIONS.2019&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ed45af65aed44b0bbeeea0bb3ab3621a": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landuse_Agriculture2020", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/agriculture/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDUSE.AGRICULTURE2020&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "ee01c99dc6ce405b87c40e568f7ff6fd": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "ProgressStyleModel", - "state": { - "description_width": "" - } - }, - "ee9470269e194fd29a190c3868b22ac0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 10, - "name": "GeoportailFrance.Geographicalgridsystems_Bonne", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/cartes/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=GEOGRAPHICALGRIDSYSTEMS.BONNE&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "eff91f8b953f41b2b6776d4abab9212e": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos_1950_1965", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.1950-1965&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "effe0325024e414499d6bfc201a197ff": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "USGS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "0", - "name": "USGS Hydrography", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://basemap.nationalmap.gov/arcgis/services/USGSHydroCached/MapServer/WMSServer?" - } - }, - "f04ece628fda47bf990b3c96cdac6cc1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Cha18", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.CHA18&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "f08b25e418e64c16a00093c8a08b8170": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", - "name": "WaymarkedTrails.skating", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tile.waymarkedtrails.org/skating/{z}/{x}/{y}.png" - } - }, - "f0f8f0bbac8d4fe89ce7a6f99034eedf": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Protectedareas_Apg", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=PROTECTEDAREAS.APG&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "f3bc84b3d1094e6eac01c1bc27df1bd1": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Orthophotos2006", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS2006&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "f41de80c52664803906e998258a9967b": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Elevation_Level0", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/altimetrie/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ELEVATION.LEVEL0&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "f49fa757b4244a59a372380efa9078e0": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, - "f4ff5ad5c6a94a3bb61d1cbc98376d73": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "name": "Stamen.Terrain", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/terrain/{z}/{x}/{y}.png" - } - }, - "f57f6413c270464e81f09c80213128a6": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2017", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2017&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "f59659058e5c480795896261aa1061c7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "(C) OpenStreetMap contributors (C) CARTO", - "max_zoom": 20, - "name": "CartoDB.DarkMatterOnlyLabels", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://a.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}.png" - } - }, - "f84ef768a4824a5c89364799a8dda355": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map data: (C) OpenStreetMap contributors & ODbL, (C) www.opensnowmap.org CC-BY-SA", - "name": "OpenSnowMap.pistes", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://tiles.opensnowmap.org/pistes/{z}/{x}/{y}.png" - } - }, - "f9de3913d6334521b29369609abf2786": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletWMSLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "USGS", - "crs": { - "custom": false, - "name": "EPSG3857" - }, - "format": "image/png", - "layers": "33DEPElevation:Hillshade Elevation Tinted", - "name": "USGS 3DEP Elevation", - "options": [ - "attribution", - "bounds", - "detect_retina", - "format", - "layers", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "styles", - "tile_size", - "tms", - "transparent", - "uppercase", - "zoom_offset" - ], - "transparent": true, - "url": "https://elevation.nationalmap.gov/arcgis/services/3DEPElevation/ImageServer/WMSServer?" - } - }, - "f9e13995117b4c1ca9ae0268320c3664": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "© Gaode.com", - "max_zoom": 19, - "name": "Gaode.Normal", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}" - } - }, - "f9f6ef80922c42ccb8d0e27ad346d6ad": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/satellite/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "fa18aae5fc16495eb738a07abb22a941": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 12, - "name": "GeoportailFrance.Landcover_Grid_Clc06r_dom", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/clc/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=CORINE Land Cover - DOM&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.GRID.CLC06R_DOM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "facb04f66e844827bf6f6bd87d36b677": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", - "name": "Stamen.TerrainBackground", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://stamen-tiles-a.a.ssl.fastly.net/terrain-background/{z}/{x}/{y}.png" - } - }, - "fd5bc2aea7934042984ed74be2057af7": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 5, - "name": "NASAGIBS.BlueMarble3031", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/BlueMarble_NextGeneration/default/EPSG3031_500m/{z}/{y}/{x}.jpeg" - } - }, - "fd78ef55b899400196800007f296258c": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", - "max_zoom": 7, - "name": "NASAGIBS.ModisTerraChlorophyll", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_Chlorophyll_A/default//GoogleMapsCompatible_Level7/{z}/{y}/{x}.png" - } - }, - "fdfa827aacac48b581fab124e2c825bd": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 16, - "name": "GeoportailFrance.Landcover_Forestinventory_V1", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/environnement/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=LANDCOVER.FORESTINVENTORY.V1&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "fdfc38d419f4454bac354cc605653fa5": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2013", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2013&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" - } - }, - "fee2ec2f711341ef8691fcf3c18a21b0": { - "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", - "model_name": "LeafletTileLayerModel", - "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", - "attribution": "Geoportail France", - "max_zoom": 19, - "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2016", - "options": [ - "attribution", - "bounds", - "detect_retina", - "max_native_zoom", - "max_zoom", - "min_native_zoom", - "min_zoom", - "no_wrap", - "tile_size", - "tms", - "zoom_offset" - ], - "url": "https://wxs.ign.fr/orthohisto/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/jpeg&LAYER=ORTHOIMAGERY.ORTHOPHOTOS.IRC.2016&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" + "layout": "IPY_MODEL_ee64c1dbb0dc425ca8109c422ccd627f", + "style": "IPY_MODEL_449491d385a742a9a86f197adc6916be", + "value": " 108M/108M (raw) [100.0%] in 00:16 (eta: 00:00)" } } }, diff --git a/docs/examples/s2_composite.ipynb b/docs/examples/s2_composite.ipynb index 1288a18..2d30f99 100644 --- a/docs/examples/s2_composite.ipynb +++ b/docs/examples/s2_composite.ipynb @@ -54,11 +54,11 @@ "\n", "In this step we search for images to composite, over the area and time period of interest. \n", "\n", - "Searching and compositing Sentinel-2 collections over large areas or time spans can be time-consuming. This is in part due to the resolution of the imagery, but also due to the computational burden of `geedim` cloud/shadow detection algorithms, where those are used. To reduce the number of images requiring cloud/shadow detection in the search, we specify a `custom_filter` that places an upper limit on the already existing `CLOUDY_PIXEL_PERCENTAGE` [image granule property](https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED#image-properties). This `custom_filter` is fast to apply and helps speed up the search. \n", + "Searching and compositing Sentinel-2 collections over large areas or time spans can be time-consuming due to the computational burden of cloud/shadow masking, when it is used. To reduce the number of images requiring cloud/shadow masks in the search, we specify a `custom_filter` that places an upper limit on the already existing `CLOUDY_PIXEL_PERCENTAGE` [image granule property](https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED#image-properties). This `custom_filter` is fast to apply. \n", "\n", "While the `custom_filter` applies to properties of the image granule, the `fill_portion` and `cloudless_portion` filters apply to `geedim` calculated portions of the search region. Here they are used to limit the search results to relatively large and cloud/shadow-free image portions. \n", "\n", - "For consitency with the [composite creation](#Create-composite-image), we specify a [cloud probability threshold](../api.rst#MaskedImage) of 40% (`prob=40`), and a [cloud/shadow dilation distance](../api.rst#MaskedImage) of 100m (`buffer=100`). " + "By default, the [`cloud-score`](../api.rst#CloudMaskMethod) method is used for Sentinel-2 cloud/shadow masking. We specify a [cloud score threshold](../api.rst#MaskedImage) of 0.7 (`score=0.7`) for the search." ] }, { @@ -66,11 +66,45 @@ "execution_count": 3, "metadata": {}, "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", "text": [ - "Found 26 images.\n", + "Found 31 images.\n", "Image property descriptions:\n", "\n", "ABBREV NAME DESCRIPTION\n", @@ -91,49 +125,58 @@ "\n", "ID DATE FILL CLOUDLESS RADQ GEOMQ SAA SZA VAA VZA\n", "------------------------------------------------------------------ ---------------- ----- --------- ------ ------ ------ ----- ------ -----\n", - "COPERNICUS/S2_SR_HARMONIZED/20190109T101409_20190109T102253_T30NYM 2019-01-09 10:29 41.15 85.23 PASSED PASSED 139.50 37.20 110.79 11.21\n", - "COPERNICUS/S2_SR_HARMONIZED/20190122T102329_20190122T103839_T30NZM 2019-01-22 10:39 35.83 98.36 PASSED PASSED 139.22 33.99 291.77 11.04\n", - "COPERNICUS/S2_SR_HARMONIZED/20190122T102329_20190122T103839_T30NYM 2019-01-22 10:39 44.84 96.52 PASSED PASSED 138.15 34.57 284.86 7.01\n", - "COPERNICUS/S2_SR_HARMONIZED/20190129T101259_20190129T102648_T30NZM 2019-01-29 10:29 78.98 94.86 PASSED PASSED 133.66 34.76 103.87 7.45\n", - "COPERNICUS/S2_SR_HARMONIZED/20190129T101259_20190129T102648_T30NYM 2019-01-29 10:29 40.75 86.70 PASSED PASSED 132.71 35.41 110.77 11.22\n", - "COPERNICUS/S2_SR_HARMONIZED/20190203T101221_20190203T102328_T30NZM 2019-02-03 10:29 78.98 98.36 PASSED PASSED 131.54 34.00 102.95 7.46\n", - "COPERNICUS/S2_SR_HARMONIZED/20190203T101221_20190203T102328_T30NYM 2019-02-03 10:29 40.12 97.48 PASSED PASSED 130.60 34.67 110.22 11.22\n", - "COPERNICUS/S2_SR_HARMONIZED/20190211T102149_20190211T103444_T30NZM 2019-02-11 10:39 36.62 90.95 PASSED PASSED 130.61 30.63 291.60 11.03\n", - "COPERNICUS/S2_SR_HARMONIZED/20190211T102149_20190211T103444_T30NYM 2019-02-11 10:39 44.84 95.34 PASSED PASSED 129.57 31.32 284.89 7.01\n", - "COPERNICUS/S2_SR_HARMONIZED/20190221T102039_20190221T103744_T30NZM 2019-02-21 10:39 37.43 96.71 PASSED PASSED 125.14 28.46 291.63 11.03\n", - "COPERNICUS/S2_SR_HARMONIZED/20190221T102039_20190221T103744_T30NYM 2019-02-21 10:39 44.84 99.21 PASSED PASSED 124.14 29.19 284.91 6.97\n", - "COPERNICUS/S2_SR_HARMONIZED/20190226T102021_20190226T102750_T30NZM 2019-02-26 10:39 37.51 99.97 PASSED PASSED 122.02 27.33 292.19 11.05\n", - "COPERNICUS/S2_SR_HARMONIZED/20190226T102021_20190226T102750_T30NYM 2019-02-26 10:39 44.84 99.98 PASSED PASSED 121.05 28.09 285.84 6.97\n", - "COPERNICUS/S2_SR_HARMONIZED/20190303T102019_20190303T103501_T30NZM 2019-03-03 10:39 38.43 94.30 PASSED PASSED 118.64 26.18 291.45 11.01\n", - "COPERNICUS/S2_SR_HARMONIZED/20190305T101021_20190305T101942_T30NZM 2019-03-05 10:29 78.98 97.65 PASSED PASSED 114.79 27.96 102.84 7.49\n", - "COPERNICUS/S2_SR_HARMONIZED/20190305T101021_20190305T101942_T30NYM 2019-03-05 10:29 38.75 91.50 PASSED PASSED 114.03 28.77 110.18 11.24\n", - "COPERNICUS/S2_SR_HARMONIZED/20190422T102029_20190422T102825_T30NZM 2019-04-22 10:39 34.57 84.97 PASSED PASSED 70.43 20.33 291.93 11.07\n", - "COPERNICUS/S2_SR_HARMONIZED/20190422T102029_20190422T102825_T30NYM 2019-04-22 10:39 44.82 82.72 PASSED PASSED 71.12 21.16 284.90 7.05\n", - "COPERNICUS/S2_SR_HARMONIZED/20190502T102029_20190502T103323_T30NYM 2019-05-02 10:39 44.84 92.48 PASSED PASSED 62.60 21.88 285.00 7.07\n", - "COPERNICUS/S2_SR_HARMONIZED/20191029T102039_20191029T103707_T30NZM 2019-10-29 10:39 37.60 92.46 PASSED PASSED 140.78 24.88 291.61 11.05\n", - "COPERNICUS/S2_SR_HARMONIZED/20191029T102039_20191029T103707_T30NYM 2019-10-29 10:39 44.84 94.07 PASSED PASSED 139.25 25.45 284.87 6.98\n", - "COPERNICUS/S2_SR_HARMONIZED/20191203T102401_20191203T103859_T30NZM 2019-12-03 10:39 36.76 87.69 PASSED PASSED 149.20 32.68 292.18 11.04\n", - "COPERNICUS/S2_SR_HARMONIZED/20191203T102401_20191203T103859_T30NYM 2019-12-03 10:39 44.84 85.52 PASSED PASSED 147.94 33.15 285.92 6.99\n", - "COPERNICUS/S2_SR_HARMONIZED/20191223T102431_20191223T103653_T30NYM 2019-12-23 10:39 44.84 76.97 PASSED PASSED 146.26 35.50 285.85 6.93\n", - "COPERNICUS/S2_SR_HARMONIZED/20191225T101329_20191225T102600_T30NZM 2019-12-25 10:29 78.98 99.93 PASSED PASSED 143.96 36.51 103.79 7.49\n", - "COPERNICUS/S2_SR_HARMONIZED/20191225T101329_20191225T102600_T30NYM 2019-12-25 10:29 39.09 99.83 PASSED PASSED 142.92 37.05 110.76 11.25\n" + "COPERNICUS/S2_SR_HARMONIZED/20190109T101409_20190109T102253_T30NYM 2019-01-09 10:29 41.15 48.29 PASSED PASSED 139.50 37.20 110.79 11.21\n", + "COPERNICUS/S2_SR_HARMONIZED/20190122T102329_20190122T103839_T30NZM 2019-01-22 10:39 35.83 78.59 PASSED PASSED 139.22 33.99 291.77 11.04\n", + "COPERNICUS/S2_SR_HARMONIZED/20190122T102329_20190122T103839_T30NYM 2019-01-22 10:39 44.84 55.71 PASSED PASSED 138.15 34.57 284.86 7.01\n", + "COPERNICUS/S2_SR_HARMONIZED/20190129T101259_20190129T102648_T30NZM 2019-01-29 10:29 78.98 77.88 PASSED PASSED 133.66 34.76 103.87 7.45\n", + "COPERNICUS/S2_SR_HARMONIZED/20190129T101259_20190129T102648_T30NYM 2019-01-29 10:29 40.75 63.10 PASSED PASSED 132.71 35.41 110.77 11.22\n", + "COPERNICUS/S2_SR_HARMONIZED/20190203T101221_20190203T102328_T30NZM 2019-02-03 10:29 78.98 75.00 PASSED PASSED 131.54 34.00 102.95 7.46\n", + "COPERNICUS/S2_SR_HARMONIZED/20190203T101221_20190203T102328_T30NYM 2019-02-03 10:29 40.12 91.65 PASSED PASSED 130.60 34.67 110.22 11.22\n", + "COPERNICUS/S2_SR_HARMONIZED/20190211T102149_20190211T103444_T30NZM 2019-02-11 10:39 36.62 41.50 PASSED PASSED 130.61 30.63 291.60 11.03\n", + "COPERNICUS/S2_SR_HARMONIZED/20190211T102149_20190211T103444_T30NYM 2019-02-11 10:39 44.84 66.67 PASSED PASSED 129.57 31.32 284.89 7.01\n", + "COPERNICUS/S2_SR_HARMONIZED/20190221T102039_20190221T103744_T30NZM 2019-02-21 10:39 37.43 93.97 PASSED PASSED 125.14 28.46 291.63 11.03\n", + "COPERNICUS/S2_SR_HARMONIZED/20190221T102039_20190221T103744_T30NYM 2019-02-21 10:39 44.84 95.99 PASSED PASSED 124.14 29.19 284.91 6.97\n", + "COPERNICUS/S2_SR_HARMONIZED/20190226T102021_20190226T102750_T30NZM 2019-02-26 10:39 37.51 96.09 PASSED PASSED 122.02 27.33 292.19 11.05\n", + "COPERNICUS/S2_SR_HARMONIZED/20190226T102021_20190226T102750_T30NYM 2019-02-26 10:39 44.84 98.52 PASSED PASSED 121.05 28.09 285.84 6.97\n", + "COPERNICUS/S2_SR_HARMONIZED/20190303T102019_20190303T103501_T30NZM 2019-03-03 10:39 38.43 66.90 PASSED PASSED 118.64 26.18 291.45 11.01\n", + "COPERNICUS/S2_SR_HARMONIZED/20190303T102019_20190303T103501_T30NYM 2019-03-03 10:39 44.84 52.81 PASSED PASSED 117.72 26.96 284.74 6.95\n", + "COPERNICUS/S2_SR_HARMONIZED/20190305T101021_20190305T101942_T30NZM 2019-03-05 10:29 78.98 76.62 PASSED PASSED 114.79 27.96 102.84 7.49\n", + "COPERNICUS/S2_SR_HARMONIZED/20190305T101021_20190305T101942_T30NYM 2019-03-05 10:29 38.75 76.96 PASSED PASSED 114.03 28.77 110.18 11.24\n", + "COPERNICUS/S2_SR_HARMONIZED/20190323T102029_20190323T103130_T30NZM 2019-03-23 10:39 37.31 83.77 PASSED PASSED 101.81 22.10 291.62 11.02\n", + "COPERNICUS/S2_SR_HARMONIZED/20190402T102029_20190402T103141_T30NZM 2019-04-02 10:39 36.39 78.84 PASSED PASSED 91.53 20.78 291.59 11.04\n", + "COPERNICUS/S2_SR_HARMONIZED/20190402T102029_20190402T103141_T30NYM 2019-04-02 10:39 44.84 75.66 PASSED PASSED 91.40 21.67 284.90 7.01\n", + "COPERNICUS/S2_SR_HARMONIZED/20190404T101031_20190404T102921_T30NZM 2019-04-04 10:29 78.98 54.53 PASSED PASSED 89.21 23.09 104.17 7.42\n", + "COPERNICUS/S2_SR_HARMONIZED/20190409T101029_20190409T102251_T30NZM 2019-04-09 10:29 78.98 77.99 PASSED PASSED 84.36 22.75 104.06 7.43\n", + "COPERNICUS/S2_SR_HARMONIZED/20190502T102029_20190502T103323_T30NYM 2019-05-02 10:39 44.84 86.70 PASSED PASSED 62.60 21.88 285.00 7.07\n", + "COPERNICUS/S2_SR_HARMONIZED/20190916T101029_20190916T102121_T30NZM 2019-09-16 10:29 78.98 44.71 PASSED PASSED 97.62 21.35 103.78 7.49\n", + "COPERNICUS/S2_SR_HARMONIZED/20191029T102039_20191029T103707_T30NZM 2019-10-29 10:39 37.60 70.22 PASSED PASSED 140.78 24.88 291.61 11.05\n", + "COPERNICUS/S2_SR_HARMONIZED/20191029T102039_20191029T103707_T30NYM 2019-10-29 10:39 44.84 82.21 PASSED PASSED 139.25 25.45 284.87 6.98\n", + "COPERNICUS/S2_SR_HARMONIZED/20191115T101209_20191115T101753_T30NZM 2019-11-15 10:29 77.31 44.48 PASSED PASSED 143.38 30.41 103.78 7.48\n", + "COPERNICUS/S2_SR_HARMONIZED/20191203T102401_20191203T103859_T30NZM 2019-12-03 10:39 36.76 76.96 PASSED PASSED 149.20 32.68 292.18 11.04\n", + "COPERNICUS/S2_SR_HARMONIZED/20191203T102401_20191203T103859_T30NYM 2019-12-03 10:39 44.84 68.91 PASSED PASSED 147.94 33.15 285.92 6.99\n", + "COPERNICUS/S2_SR_HARMONIZED/20191225T101329_20191225T102600_T30NZM 2019-12-25 10:29 78.98 99.95 PASSED PASSED 143.96 36.51 103.79 7.49\n", + "COPERNICUS/S2_SR_HARMONIZED/20191225T101329_20191225T102600_T30NYM 2019-12-25 10:29 39.09 99.99 PASSED PASSED 142.92 37.05 110.76 11.25\n" ] } ], "source": [ "# geojson search polygon\n", "region = {\n", - " 'type': 'Polygon', 'coordinates': [[\n", - " [-0.37, 5.75], [-0.37, 5.5], [0.0, 5.5], [0.0, 5.75], [-0.37, 5.75]\n", - " ]],\n", + " 'type': 'Polygon',\n", + " 'coordinates': [[[-0.37, 5.75], [-0.37, 5.5], [0.0, 5.5], [0.0, 5.75], [-0.37, 5.75]]],\n", "}\n", "\n", "# create and search the Sentinel-2 TOA collection\n", + "score = 0.7\n", "coll = gd.MaskedCollection.from_name('COPERNICUS/S2_SR_HARMONIZED')\n", "filt_coll = coll.search(\n", - " start_date='2019-01-01', end_date='2020-01-01', region=region, \n", - " cloudless_portion=75, fill_portion=30, \n", - " custom_filter='CLOUDY_PIXEL_PERCENTAGE<25', prob=40, buffer=100,\n", + " start_date='2019-01-01',\n", + " end_date='2020-01-01',\n", + " region=region,\n", + " cloudless_portion=40,\n", + " fill_portion=30,\n", + " custom_filter='CLOUDY_PIXEL_PERCENTAGE<40',\n", + " score=score,\n", ")\n", "\n", "# print the search results\n", @@ -141,7 +184,7 @@ "print(f'Image property descriptions:\\n\\n{filt_coll.schema_table}\\n')\n", "print(f'Search Results:\\n\\n{filt_coll.properties_table}')\n", "\n", - "# !geedim config --prob 40 --buffer 100 search -c s2-sr-hm -s 2019-01-01 -e 2020-01-01 --bbox -0.37 5.5 -0.0 5.75 -cf \"CLOUDY_PIXEL_PERCENTAGE<25\" -cp 75 -fp 30" + "# !geedim config --score 0.7 search -c s2-sr-hm -s 2019-01-01 -e 2020-01-01 --bbox -0.37 5.5 -0.0 5.75 -cf \"CLOUDY_PIXEL_PERCENTAGE<40\" -cp 40 -fp 30" ] }, { @@ -150,18 +193,53 @@ "source": [ "#### Create composite image\n", "\n", - "Next we create a [medoid](../api.rst#compositemethod) composite image from the search result images. Again we specify a [cloud probability threshold](../api.rst#MaskedImage) of 40% (`prob=40`), and a [cloud/shadow dilation distance](../api.rst#MaskedImage) of 100m (`buffer=100`), to aggressively mask cloudy pixels. These parameters result in some masking of valid pixels (false positives), but with numerous component images, there are enough unmasked pixels to produce a full coverage composite.\n", + "Next we create a [medoid](../api.rst#compositemethod) composite image from the search result images. Again we specify a [cloud score threshold](../api.rst#MaskedImage) of 0.7.\n", "\n", - "Of the [available compositing algorithms](../api.rst#compositemethod), the *medoid* method is the most memory and computation intensive. Computation scales roughly quadratically with the number of component images, so it is important to keep those to a necessary minimum. The number of images returned by the search (i.e. 26) is low enough to produce a reasonably fast composite in this case. Limiting the components to mostly cloud/shadow-free images, and aggressively masking these, helps improve the composite quality. " + "Of the [available compositing algorithms](../api.rst#compositemethod), the *medoid* method is the most memory and computation intensive. Computation scales roughly quadratically with the number of component images, so it is important to keep those to a necessary minimum. The number of images returned by the search (i.e. 31) is low enough to produce a reasonably fast composite in this case. Limiting the components to relatively cloud/shadow-free images, and aggressively masking these with a high cloud score threshold, helps improve the composite quality. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "medoid_im = filt_coll.composite('medoid', prob=40, buffer=100)" + "medoid_im = filt_coll.composite('medoid', score=score)" ] }, { @@ -189,8 +267,44 @@ { "data": { "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + "</script>\n", + "</html>\" width=\"100%\" height=\"600\"style=\"border:none !important;\" \"allowfullscreen\" \"webkitallowfullscreen\" \"mozallowfullscreen\">" ], "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -434,23 +591,19 @@ "# iterate over the first 4 component image ID's\n", "for im_id in list(filt_coll.properties.keys())[:4]:\n", " # create image and mask, and add to map\n", - " im = gd.MaskedImage.from_id(im_id, prob=40, buffer=100)\n", + " im = gd.MaskedImage.from_id(im_id, score=score)\n", " vis_image = im.ee_image.clip(region)\n", " cloudless_mask = vis_image.select('CLOUDLESS_MASK')\n", - " \n", + "\n", " map.addLayer(vis_image, s2_vis_params, f'Image {im_id[-38:]}')\n", " map.addLayer(cloudless_mask, mask_vis_params, f'Cl mask {im_id[-38:]}')\n", "\n", - "# add the composite to the map\n", - "map.addLayer(\n", - " medoid_im.ee_image.clip(region), s2_vis_params, 'Medoid composite', \n", - " # shown=False\n", - ")\n", - "\n", - "region_im = ee.Image().byte().paint(\n", - " featureCollection=ee.Geometry(region), width=2, color=1\n", + "# add the composite & region outline\n", + "map.addLayer(medoid_im.ee_image.clip(region), s2_vis_params, 'Medoid composite')\n", + "region_im = ee.FeatureCollection(ee.Geometry(region)).style(\n", + " color='red', width=2, lineType='solid', fillColor='00000000'\n", ")\n", - "map.addLayer(region_im, dict(palette=['FF0000']), 'Region')\n", + "map.addLayer(region_im, {}, 'Region')\n", "\n", "map" ] @@ -469,15 +622,49 @@ "execution_count": 6, "metadata": {}, "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "79c65c71f5144182834b7b71a34c2ece", + "model_id": "bdb4a2ebe5614259887662a90121aa16", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "s2_medoid_im.tif: | | 0.00/919M (raw…" + "s2_medoid_im.tif: | | 0.00/95…" ] }, "metadata": {}, @@ -486,11 +673,16 @@ ], "source": [ "medoid_im.download(\n", - " 's2_medoid_im.tif', region=region, crs='EPSG:32735', scale=10, \n", - " dtype='uint16', max_tile_size=16, overwrite=True,\n", + " 's2_medoid_im.tif',\n", + " region=region,\n", + " crs='EPSG:32735',\n", + " scale=10,\n", + " dtype='uint16',\n", + " max_tile_size=16,\n", + " overwrite=True,\n", ")\n", "\n", - "# !geedim config --prob 40 --buffer 100 search -c s2-sr-hm -s 2019-01-01 -e 2020-01-01 --bbox -0.37 5.5 -0.0 5.75 -cf \"CLOUDY_PIXEL_PERCENTAGE<25\" -cp 75 -fp 30 composite -cm medoid download --crs EPSG:32735 --scale 10 --dtype uint16 --max-tile-size 16 -o" + "# !geedim config --score 0.7 search -c s2-sr-hm -s 2019-01-01 -e 2020-01-01 --bbox -0.37 5.5 -0.0 5.75 -cf \"CLOUDY_PIXEL_PERCENTAGE<40\" -cp 40 -fp 30 composite -cm medoid download --crs EPSG:32735 --scale 10 --dtype uint16 --max-tile-size 16 -o" ] }, { @@ -504,9 +696,43 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stderr", "output_type": "stream", @@ -517,7 +743,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b7ca150eac5e4a73a61d79f11f9a35c5", + "model_id": "d1475bca1d334047bb219db903069ef3", "version_major": 2, "version_minor": 0 }, @@ -531,12 +757,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "52d671568a134fbe9c3122b57b0ba5e2", + "model_id": "f4e01a76ac9949cf8b4527f63de188b2", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "s2_medoid_im.tif: | | 0.00/919M (raw…" + "s2_medoid_im.tif: | | 0.00/95…" ] }, "metadata": {}, @@ -551,13 +777,18 @@ } ], "source": [ - "# 'geedim' is the name of a valid Earth Engine asset project\n", + "# 'geedim' is the name of a valid Earth Engine cloud project\n", "medoid_asset_id = f'projects/geedim/assets/s2_medoid_im'\n", "\n", "# export to earth engine asset\n", "medoid_task = medoid_im.export(\n", - " medoid_asset_id, type='asset', region=region, crs='EPSG:32735', \n", - " scale=10, dtype='uint16', wait=True,\n", + " medoid_asset_id,\n", + " type='asset',\n", + " region=region,\n", + " crs='EPSG:32735',\n", + " scale=10,\n", + " dtype='uint16',\n", + " wait=True,\n", ")\n", "\n", "# create a MaskedImage from the earth engine asset\n", @@ -565,7 +796,7 @@ "# download asset image\n", "medoid_asset_im.download('s2_medoid_im.tif', overwrite=True)\n", "\n", - "# !geedim config --prob 40 --buffer 100 search -c s2-sr-hm -s 2019-01-01 -e 2020-01-01 --bbox -0.37 5.5 -0.0 5.75 -cf \"CLOUDY_PIXEL_PERCENTAGE<25\" -cp 75 -fp 30 composite -cm medoid export -t asset -f geedim --crs EPSG:32735 --scale 10 --dtype uint16 download -o" + "# !geedim config --score 0.7 search -c s2-sr-hm -s 2019-01-01 -e 2020-01-01 --bbox -0.37 5.5 -0.0 5.75 -cf \"CLOUDY_PIXEL_PERCENTAGE<40\" -cp 40 -fp 30 composite -cm medoid export -t asset -f geedim --crs EPSG:32735 --scale 10 --dtype uint16 download -o" ] }, { @@ -577,9 +808,6 @@ } ], "metadata": { - "interpreter": { - "hash": "a5cb0e16c618ce62d5962a2f34302e2d299d083ff8e8afee2c1c64a34662e4b4" - }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", @@ -595,19 +823,30 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15" + "version": "3.11.10" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { + "0046d915033c4a348423b6830ea40858": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_b4f77d8a066a420ea239b42487ad67a8", + "style": "IPY_MODEL_ed97a2cfa08b44cc9cd2c61701ec5dcf", + "value": " 952M/952M (raw) [100.0%] in 01:38 (eta: 00:00)" + } + }, "0125bb61daa04b65a614cbb76148f9c7": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "WaymarkedTrails.hiking", "options": [ "attribution", @@ -625,37 +864,16 @@ "url": "https://tile.waymarkedtrails.org/hiking/{z}/{x}/{y}.png" } }, - "01739747fcf940f08e89728f30c13f04": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "FloatProgressModel", - "state": { - "bar_style": "success", - "layout": "IPY_MODEL_071987e7c00a450181f9f554f8293288", - "max": 919483860, - "style": "IPY_MODEL_88c090c36fcd4372a280f748a3be9051", - "value": 919483860 - } - }, - "02fb6046a8994f10ae9d64a99eb476f5": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_a9af591fddc94edea20560ba384bb890", - "style": "IPY_MODEL_b9b56ba6f94841a18366daa5a7ff03d3", - "value": " 919M/919M (raw) [100.0%] in 01:07 (eta: 00:00)" - } - }, "032b31fd483f4d9b95e329748d708205": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TonerBackground", "options": [ "attribution", @@ -675,12 +893,13 @@ }, "061206b834df45c5b146ce5a7e80ee4b": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "WaymarkedTrails.skating", "options": [ "attribution", @@ -700,13 +919,14 @@ }, "067668949d514fc2b95a3e02d8e3301d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stadia.AlidadeSmooth", "options": [ "attribution", @@ -724,33 +944,16 @@ "url": "https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}.png" } }, - "06b7e688e76545ac809500ea9896ad1d": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_6075b40926c84f2497380cd400d1bfc1", - "style": "IPY_MODEL_b64e2ea9db874ed693f0ddd32a4c42bc", - "value": " [100.0%] in 1:18:12 (eta: 00:00)" - } - }, - "071987e7c00a450181f9f554f8293288": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "flex": "2" - } - }, "08326bff62ff411c9c83a13dbc45542f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Kaartgegevens (C) Kadaster", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "nlmaps.water", "options": [ "attribution", @@ -770,13 +973,14 @@ }, "084069970cc346ba865f69c554cae447": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.terrain", "options": [ "attribution", @@ -796,13 +1000,14 @@ }, "08efc6359f174fa1b4cc50eb48e91970": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Strava 2021", + "error": {}, "max_zoom": 15, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Strava.Run", "options": [ "attribution", @@ -822,13 +1027,14 @@ }, "095f355b0c804ce39d1a54c2f802f510": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.HOT", "options": [ "attribution", @@ -848,12 +1054,13 @@ }, "09dede16c43048c98bf650c7a87a23db": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors & ODbL, (C) www.opensnowmap.org CC-BY-SA", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenSnowMap.pistes", "options": [ "attribution", @@ -873,13 +1080,14 @@ }, "0acecc0e85bb4c03af0718c811b31d62": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors, SRTM | Map style: (C) OpenTopoMap (CC-BY-SA)", + "error": {}, "max_zoom": 17, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenTopoMap", "options": [ "attribution", @@ -899,13 +1107,14 @@ }, "0c914b22f64b4de1ba392c09cbd4d6fc": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Source: Esri", + "error": {}, "max_zoom": 13, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldShadedRelief", "options": [ "attribution", @@ -925,13 +1134,14 @@ }, "0cf19a46865145a69b7f7f06e4a847d3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 12, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ASTER_GDEM_Greyscale_Shaded_Relief", "options": [ "attribution", @@ -951,18 +1161,19 @@ }, "12c3a674a2e94340b8e1ff99bf28794e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "USGS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "33DEPElevation:Hillshade Elevation Tinted", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "USGS 3DEP Elevation", "options": [ "attribution", @@ -988,13 +1199,14 @@ }, "1c7ab1e47c3545ccb789886835bcbdb4": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Google", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Google Satellite", "options": [ "attribution", @@ -1014,13 +1226,14 @@ }, "1df0fea9c4664a428c21b5f02c39b04f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.orthofoto", "options": [ "attribution", @@ -1040,13 +1253,14 @@ }, "1df6a11c2c92426e9e6eff752885db76": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.DarkMatterNoLabels", "options": [ "attribution", @@ -1066,13 +1280,14 @@ }, "1ffa225d3fec49188ff4cf9aea4aca99": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors, Tiles courtesy of Breton OpenStreetMap Team", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.BZH", "options": [ "attribution", @@ -1090,21 +1305,16 @@ "url": "https://tile.openstreetmap.bzh/br/{z}/{x}/{y}.png" } }, - "217aa61f806e4469a709f8818f2ea336": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, "21e9e222954f445fbd5cde429355473e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "error": {}, "max_zoom": 24, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.ArcticOceanBase", "options": [ "attribution", @@ -1122,25 +1332,26 @@ "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Ocean_Base/MapServer/tile/{z}/{y}/{x}" } }, - "2386f757ab5b48c9b58d4c15f7e6ac85": { + "224ab96e68964f69b1a6ce9a5f372728": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", - "model_name": "HTMLModel", + "model_name": "HTMLStyleModel", "state": { - "layout": "IPY_MODEL_3e604d738294421790869d0ade5c62a9", - "style": "IPY_MODEL_cdd9b298703c478cbe73b515c5f908cc", - "value": " 919M/919M (raw) [100.0%] in 12:23 (eta: 00:00)" + "description_width": "", + "font_size": null, + "text_color": null } }, "26a3fc6957c3423894695768cb83610a": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors", + "error": {}, "max_zoom": 15, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "HikeBike.HillShading", "options": [ "attribution", @@ -1160,13 +1371,14 @@ }, "2787f3827cac43e3b2a41f4627c7e4f2": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.PositronOnlyLabels", "options": [ "attribution", @@ -1184,20 +1396,29 @@ "url": "https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png" } }, + "282691769ce14824b63a2f315ba81619": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "flex": "2" + } + }, "2874964f834a4bca9d20ea2bd48e68f1": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2008_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2008 CONUS Land Cover", "options": [ "attribution", @@ -1223,13 +1444,14 @@ }, "28fe9665227b4550b6c767ec8cb0bcbc": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Google", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Google Satellite", "options": [ "attribution", @@ -1249,18 +1471,19 @@ }, "290e3fc6d6dc444ea468bf850dec0023": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "USGS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "USGSNAIPImagery:NaturalColor", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "USGS NAIP Imagery", "options": [ "attribution", @@ -1284,15 +1507,26 @@ "url": "https://imagery.nationalmap.gov/arcgis/services/USGSNAIPImagery/ImageServer/WMSServer?" } }, + "294c0807169c4e28b8b7df90c9ba2b06": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, "2b3574dada094ef284be9b66fff7eee6": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles courtesy of the U.S. Geological Survey", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "USGS.USImageryTopo", "options": [ "attribution", @@ -1310,15 +1544,26 @@ "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}" } }, + "2bdef64ac25f43b0857a96a1a3a86eaf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, "2e476ebf29d945ff99f908e0f8855eb2": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.white", "options": [ "attribution", @@ -1336,14 +1581,21 @@ "url": "https://www.justicemap.org/tile/county/white/{z}/{x}/{y}.png" } }, + "2f1f0479d85847e78fa6ff403c348daf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, "32e0b97891b3498b9da04c6119a2cba3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map memomaps.de CC-BY-SA, map data (C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OPNVKarte", "options": [ "attribution", @@ -1363,13 +1615,14 @@ }, "35aab816bc7f4b40b9e644c544169831": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TonerHybrid", "options": [ "attribution", @@ -1389,12 +1642,13 @@ }, "36dc0fc31e054e75ae74612975599432": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "© swisstopo", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "SwissFederalGeoportal.NationalMapGrey", "options": [ "attribution", @@ -1414,18 +1668,19 @@ }, "38bcc130170243d4bbbd5a098ae37edd": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2019_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2019 CONUS Land Cover", "options": [ "attribution", @@ -1451,12 +1706,13 @@ }, "3b82404c6478484a9a3649640e8e6aa9": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OneMapSG.Default", "options": [ "attribution", @@ -1474,25 +1730,16 @@ "url": "https://maps-a.onemap.sg/v3/Default/{z}/{x}/{y}.png" } }, - "3bcd7a717d074520876adb3983d8f813": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "display": "inline-flex", - "flex_flow": "row wrap", - "width": "100%" - } - }, "3ce24f92bc964207a94334cb1d54c0b5": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Strava 2021", + "error": {}, "max_zoom": 15, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Strava.All", "options": [ "attribution", @@ -1510,21 +1757,16 @@ "url": "https://heatmap-external-a.strava.com/tiles/all/hot/{z}/{x}/{y}.png" } }, - "3e604d738294421790869d0ade5c62a9": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, "4056fb73d5d0431b9b10676f86088753": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.hispanic", "options": [ "attribution", @@ -1544,13 +1786,14 @@ }, "418f388800094c9399e9b7947704d2f6": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "HikeBike.HikeBike", "options": [ "attribution", @@ -1570,13 +1813,14 @@ }, "446f03cdf1e2417e8a4a4c89a2aa268f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Kaartgegevens (C) Kadaster", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "nlmaps.luchtfoto", "options": [ "attribution", @@ -1594,23 +1838,16 @@ "url": "https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg" } }, - "448e85d294b34d459fbfa308410eb4d8": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "flex": "2" - } - }, "452fc79cd6814111a7a51420d91daf98": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.surface", "options": [ "attribution", @@ -1630,18 +1867,19 @@ }, "46ddb700127d46cb913c11081238a20b": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "ESA", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "WORLDCOVER_2020_S2_TCC", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "ESA Worldcover 2020 S2 TCC", "options": [ "attribution", @@ -1667,13 +1905,14 @@ }, "4839ed894ec54c83b892c254083c29ea": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 5, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.BlueMarble3413", "options": [ "attribution", @@ -1691,15 +1930,22 @@ "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/BlueMarble_NextGeneration/default/EPSG3413_500m/{z}/{y}/{x}.jpeg" } }, + "4d1d69aba4ff4392a0280303cede128c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, "4d5e1d20643c4d2b905a80dd514d7f98": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap France | (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.France", "options": [ "attribution", @@ -1719,12 +1965,13 @@ }, "4db0c982b9664d938afe0987e22d1f2d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "© swisstopo", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "SwissFederalGeoportal.NationalMapColor", "options": [ "attribution", @@ -1742,23 +1989,16 @@ "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-farbe/default/current/3857/{z}/{x}/{y}.jpeg" } }, - "4e80260b9bb8493aa009987650ebe127": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "flex": "2" - } - }, "51a10f78b62b4b7095d70850641d2a0d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TonerLines", "options": [ "attribution", @@ -1776,28 +2016,16 @@ "url": "https://stamen-tiles-a.a.ssl.fastly.net/toner-lines/{z}/{x}/{y}.png" } }, - "52d671568a134fbe9c3122b57b0ba5e2": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HBoxModel", - "state": { - "children": [ - "IPY_MODEL_69aaeed1e5b249f1a9d9c78065e6e6aa", - "IPY_MODEL_7fc48c6c891e403596fa4d6c47f63b1c", - "IPY_MODEL_02fb6046a8994f10ae9d64a99eb476f5" - ], - "layout": "IPY_MODEL_89148b7fa3da444f816989ef9184c474" - } - }, "53a8023e29fc436987892b9f8048e237": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC", + "error": {}, "max_zoom": 16, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.NatGeoWorldMap", "options": [ "attribution", @@ -1815,14 +2043,23 @@ "url": "https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}" } }, + "5533b4a4b7fb4f8fa11aeff65bfa2a13": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "flex": "2" + } + }, "5f71c27b5113446da777d1a6232d3a9f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "WaymarkedTrails.riding", "options": [ "attribution", @@ -1842,18 +2079,19 @@ }, "5f739070e9e44349a00062eb6ee70076": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "ESA", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "WORLDCOVER_2020_MAP", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "ESA Worldcover 2020", "options": [ "attribution", @@ -1877,21 +2115,24 @@ "url": "https://services.terrascope.be/wms/v2" } }, - "6075b40926c84f2497380cd400d1bfc1": { + "607979b068a84a60815b6c1300f44bcb": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", - "state": {} + "state": { + "width": "500px" + } }, "629ce9d0f238431593663d4367617f6c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.Toner", "options": [ "attribution", @@ -1911,13 +2152,14 @@ }, "63a72a3c250f4272b10ecec2d1266a6d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TopOSMRelief", "options": [ "attribution", @@ -1937,12 +2179,13 @@ }, "66552ea7b1a64ab9afd05f45e084447f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.Terrain", "options": [ "attribution", @@ -1962,13 +2205,14 @@ }, "66635eb0980d4e3290c7599b79b8b881": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) SafeCast (CC-BY-SA)", + "error": {}, "max_zoom": 16, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "SafeCast", "options": [ "attribution", @@ -1988,18 +2232,19 @@ }, "676d2c8d301e42a2873c4fa597d1e52c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2004_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2004 CONUS Land Cover", "options": [ "attribution", @@ -2023,25 +2268,16 @@ "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2004_Land_Cover_L48/wms?" } }, - "69aaeed1e5b249f1a9d9c78065e6e6aa": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_b890a51478c242a3bc27b16ce39b3778", - "style": "IPY_MODEL_db2ccbfb8f4b484ba9787f42fcf0a169", - "value": "s2_medoid_im.tif: " - } - }, "6a0e86c2083d47a0a1271527e58e3b13": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.grau", "options": [ "attribution", @@ -2059,14 +2295,27 @@ "url": "https://maps.wien.gv.at/basemap/bmapgrau/normal/google3857/{z}/{y}/{x}.png" } }, + "6a93b9d2ac5745d9a1503abdd0097976": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "bar_style": "success", + "layout": "IPY_MODEL_282691769ce14824b63a2f315ba81619", + "max": 951960960, + "style": "IPY_MODEL_8c90c2880d7546b1809089f8ebbf5e18", + "value": 951960960 + } + }, "6acf7883b1004efdb5571c4e4d346d0f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OneMapSG.Grey", "options": [ "attribution", @@ -2086,13 +2335,14 @@ }, "6c4082bc4fa94bfd82126324b1775520": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.americanIndian", "options": [ "attribution", @@ -2110,33 +2360,16 @@ "url": "https://www.justicemap.org/tile/county/indian/{z}/{x}/{y}.png" } }, - "6c9c206e37d146feb29b79e565162427": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_217aa61f806e4469a709f8818f2ea336", - "style": "IPY_MODEL_f6c8928d26884767bec25775a52636bd", - "value": "Exporting projects-geedim-assets-s2_medoid_im: " - } - }, - "6cbf0f42cb484fadbf3e4f3cf1406fa2": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "width": "500px" - } - }, "6d1321d7252346978c04e6bd5187778e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.black", "options": [ "attribution", @@ -2154,15 +2387,26 @@ "url": "https://www.justicemap.org/tile/county/black/{z}/{x}/{y}.png" } }, + "6d59087c069740149fd4f70d469901a0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_f17410c4e4d2455495bf04af0de8f33a", + "style": "IPY_MODEL_2bdef64ac25f43b0857a96a1a3a86eaf", + "value": "s2_medoid_im.tif: " + } + }, "6f6c0502bb8743b08097e8c0ca394db8": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraTrueColorCR", "options": [ "attribution", @@ -2180,15 +2424,26 @@ "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_CorrectedReflectance_TrueColor/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" } }, + "6f731e5e27444366b95528938448ab21": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "display": "inline-flex", + "flex_flow": "row wrap", + "width": "100%" + } + }, "7279c07dfcb54395854fae8ef55994d2": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraBands367CR", "options": [ "attribution", @@ -2208,12 +2463,13 @@ }, "729c85c7b6e5494c9913ac4c7f690e9d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "National Library of Scotland Historic Maps", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NLS", "options": [ "attribution", @@ -2233,13 +2489,14 @@ }, "76138e9ea3954cc6b1609a89b7ff44cb": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.Mapnik", "options": [ "attribution", @@ -2257,15 +2514,17 @@ "url": "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" } }, - "7658f97a48734da0a87ee263ace8a210": { + "7687cbfc04b24918b564223f8929102d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", - "model_name": "ProgressStyleModel", + "model_name": "HTMLModel", "state": { - "description_width": "" + "layout": "IPY_MODEL_2f1f0479d85847e78fa6ff403c348daf", + "style": "IPY_MODEL_224ab96e68964f69b1a6ce9a5f372728", + "value": "Exporting projects-geedim-assets-s2_medoid_im: " } }, - "78301e69717d4b1ab47fb3a2d0028a66": { + "788b37c13ae049c7826a82167b7ccc0e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", @@ -2273,33 +2532,29 @@ "description_width": "" } }, - "79c65c71f5144182834b7b71a34c2ece": { - "model_module": "@jupyter-widgets/controls", + "7b4d26ba0d5f4022bc76dd3931f7838c": { + "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", - "model_name": "HBoxModel", + "model_name": "LayoutModel", "state": { - "children": [ - "IPY_MODEL_da9337c7a73f495daa1b9e9e51e52453", - "IPY_MODEL_01739747fcf940f08e89728f30c13f04", - "IPY_MODEL_2386f757ab5b48c9b58d4c15f7e6ac85" - ], - "layout": "IPY_MODEL_e99486544ccf46c382af6f910db4cba7" + "flex": "2" } }, "7cd8bafd2ee5493cb7de55943777b550": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "USGS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "0", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "USGS Hydrography", "options": [ "attribution", @@ -2325,13 +2580,14 @@ }, "7ebb4ae0a64b49f18e31fe5ea0763925": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.DarkMatter", "options": [ "attribution", @@ -2349,27 +2605,16 @@ "url": "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png" } }, - "7fc48c6c891e403596fa4d6c47f63b1c": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "FloatProgressModel", - "state": { - "bar_style": "success", - "layout": "IPY_MODEL_448e85d294b34d459fbfa308410eb4d8", - "max": 919483860, - "style": "IPY_MODEL_78301e69717d4b1ab47fb3a2d0028a66", - "value": 919483860 - } - }, "8012082e620b448d8a0954831622496e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.Positron", "options": [ "attribution", @@ -2389,13 +2634,14 @@ }, "80b3adf2139c4988a6f93df0ecfdb5d2": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Kaartgegevens (C) Kadaster", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "nlmaps.standaard", "options": [ "attribution", @@ -2415,13 +2661,14 @@ }, "82b48bc8e4ca4e12844a90c08e174617": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.nonWhite", "options": [ "attribution", @@ -2441,13 +2688,14 @@ }, "845a2541853d4e1caf41743d65ce3637": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TopOSMFeatures", "options": [ "attribution", @@ -2467,13 +2715,14 @@ }, "8711037b63434d2cb3ffb116cfcf2bd3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Geoportail France", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "GeoportailFrance.parcels", "options": [ "attribution", @@ -2493,13 +2742,14 @@ }, "8788c204d6c149649bc99d38822f21a6": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Strava 2021", + "error": {}, "max_zoom": 15, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Strava.Water", "options": [ "attribution", @@ -2519,12 +2769,13 @@ }, "883539b8b0144be881dc5e092fa6680f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "WaymarkedTrails.mtb", "options": [ "attribution", @@ -2544,13 +2795,14 @@ }, "885c4d3236a34a6b8170cc693a7d0d9d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors, vizualization CC-By-SA 2.0 Freemap.sk", + "error": {}, "max_zoom": 16, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "FreeMapSK", "options": [ "attribution", @@ -2570,13 +2822,14 @@ }, "8880d3560b3d4f87bb0234e1893ba75f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 7, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraLSTDay", "options": [ "attribution", @@ -2594,23 +2847,16 @@ "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_Land_Surface_Temp_Day/default//GoogleMapsCompatible_Level7/{z}/{y}/{x}.png" } }, - "88c090c36fcd4372a280f748a3be9051": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "ProgressStyleModel", - "state": { - "description_width": "" - } - }, "88cb7c05a49b4c7a8990f7bdaced4162": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by NOAA National Centers for Environmental Information (NCEI); International Bathymetric Chart of the Southern Ocean (IBCSO); General Bathymetric Chart of the Oceans (GEBCO).", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.AntarcticBasemap", "options": [ "attribution", @@ -2628,25 +2874,16 @@ "url": "https://tiles.arcgis.com/tiles/C8EMgrsFcRFL6LrL/arcgis/rest/services/Antarctic_Basemap/MapServer/tile/{z}/{y}/{x}" } }, - "89148b7fa3da444f816989ef9184c474": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "display": "inline-flex", - "flex_flow": "row wrap", - "width": "100%" - } - }, "8a06f003f35443d5bcc350f5f10e18d5": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ViirsTrueColorCR", "options": [ "attribution", @@ -2666,13 +2903,14 @@ }, "8b12911c7a2d493589202b6406547d88": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.overlay", "options": [ "attribution", @@ -2692,18 +2930,19 @@ }, "8bc672192ae04d80927027224197a57c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "ESA", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "WORLDCOVER_2020_S2_FCC", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "ESA Worldcover 2020 S2 FCC", "options": [ "attribution", @@ -2727,15 +2966,34 @@ "url": "https://services.terrascope.be/wms/v2" } }, + "8c90c2880d7546b1809089f8ebbf5e18": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "description_width": "" + } + }, + "8cd86ea0043e4312b235242dc8f41ffc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, "90a63530e21b4a89bfba38dc8aec8a42": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldTopoMap", "options": [ "attribution", @@ -2755,13 +3013,14 @@ }, "91d2b6c810174daf80609a5f69c61338": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Kaartgegevens (C) Kadaster", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "nlmaps.grijs", "options": [ "attribution", @@ -2781,13 +3040,14 @@ }, "921fc0850bb24265bf2f57cd0017c209": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "© Gaode.com", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Gaode.Normal", "options": [ "attribution", @@ -2807,13 +3067,14 @@ }, "92a3311aa31f4a54a8cc1add13616518": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "error": {}, "max_zoom": 24, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.ArcticOceanReference", "options": [ "attribution", @@ -2833,13 +3094,14 @@ }, "938cfc4b03c54b0eb4852dac21fb2510": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenSeaMap contributors", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenSeaMap", "options": [ "attribution", @@ -2859,18 +3121,19 @@ }, "93b32b3673e3430ba0ab3896a9d72b64": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "USGS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "USGSNAIPImagery:FalseColorComposite", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "USGS NAIP Imagery False Color", "options": [ "attribution", @@ -2896,13 +3159,14 @@ }, "93bd5f2696df48ed891a65f7164cac0d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 7, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraChlorophyll", "options": [ "attribution", @@ -2920,26 +3184,15 @@ "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_Chlorophyll_A/default//GoogleMapsCompatible_Level7/{z}/{y}/{x}.png" } }, - "9478b5e28c2e40f8bebb839862698638": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "FloatProgressModel", - "state": { - "bar_style": "success", - "layout": "IPY_MODEL_4e80260b9bb8493aa009987650ebe127", - "max": 1, - "style": "IPY_MODEL_7658f97a48734da0a87ee263ace8a210", - "value": 1 - } - }, "9598c5f4c7ab487a9e5c47f843fa577c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OneMapSG.Night", "options": [ "attribution", @@ -2959,13 +3212,14 @@ }, "9ab92867b61e4d3b96404031ffef70ea": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles courtesy of the U.S. Geological Survey", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "USGS.USTopo", "options": [ "attribution", @@ -2983,15 +3237,26 @@ "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}" } }, + "9aeafa397af948bd9326ca47493c3e0c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "display": "inline-flex", + "flex_flow": "row wrap", + "width": "100%" + } + }, "9e27826226cd49558ba2dd21d7fa66a0": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.VoyagerNoLabels", "options": [ "attribution", @@ -3011,13 +3276,14 @@ }, "a019b71738ed44a28ed09833627d0581": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stadia.OSMBright", "options": [ "attribution", @@ -3037,13 +3303,14 @@ }, "a116507937204e6386c7d4b3b429305c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "CyclOSM | Map data: (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CyclOSM", "options": [ "attribution", @@ -3061,15 +3328,38 @@ "url": "https://a.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png" } }, + "a1a55e38255a4c489cad017c5ec35957": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "bar_style": "success", + "layout": "IPY_MODEL_5533b4a4b7fb4f8fa11aeff65bfa2a13", + "max": 951190200, + "style": "IPY_MODEL_bfc4557369ce4523863cd34b235e069c", + "value": 951190200 + } + }, + "a57a7639c34f4d9e988193958af06e0f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_c8b6c4bdebd2442fb06ee99128d47a5b", + "style": "IPY_MODEL_294c0807169c4e28b8b7df90c9ba2b06", + "value": " [100.0%] in 15:09 (eta: 00:00)" + } + }, "a6cead798ace4f908b3d61149e5c9915": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisAquaTrueColorCR", "options": [ "attribution", @@ -3089,18 +3379,19 @@ }, "a7135194894e478ab6b222866694c0b0": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2001_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2001 CONUS Land Cover", "options": [ "attribution", @@ -3124,21 +3415,16 @@ "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2001_Land_Cover_L48/wms?" } }, - "a9af591fddc94edea20560ba384bb890": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, "aba8d9a76c6d4d07a735b84875e8bced": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Google", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Google Terrain", "options": [ "attribution", @@ -3158,13 +3444,14 @@ }, "abc8ec4af74a4652a68555fb96e660b4": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.plurality", "options": [ "attribution", @@ -3184,13 +3471,14 @@ }, "ac1e1ac0b89e41b9a231625ed01a3fde": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldStreetMap", "options": [ "attribution", @@ -3210,13 +3498,14 @@ }, "ac7bd026d36440ec99f068a97dd19ebc": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TonerLite", "options": [ "attribution", @@ -3236,12 +3525,13 @@ }, "ad390e66c574405e82791d4da6ed6252": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OneMapSG.Original", "options": [ "attribution", @@ -3261,13 +3551,14 @@ }, "aea9826a4850465d9c6c71d0b462115c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "© Gaode.com", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Gaode.Satellite", "options": [ "attribution", @@ -3285,25 +3576,16 @@ "url": "http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}" } }, - "af1b249c71f14b7ba1e415a93f0ee5d1": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, "af69c1e4ee6b41559d92fb8a0822b78c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Google", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Google Maps", "options": [ "attribution", @@ -3323,13 +3605,14 @@ }, "b328a8339ace483895ef4aea754dfde1": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.income", "options": [ "attribution", @@ -3347,15 +3630,22 @@ "url": "https://www.justicemap.org/tile/county/income/{z}/{x}/{y}.png" } }, + "b4f77d8a066a420ea239b42487ad67a8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, "b5bd2b82d53d4ba893c1ec76f6aa0e75": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.VoyagerLabelsUnder", "options": [ "attribution", @@ -3373,30 +3663,31 @@ "url": "https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png" } }, - "b64e2ea9db874ed693f0ddd32a4c42bc": { + "b67efd3ff159409098a0fa4505a3c1b1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", + "model_name": "HTMLModel", "state": { - "description_width": "", - "font_size": null, - "text_color": null + "layout": "IPY_MODEL_4d1d69aba4ff4392a0280303cede128c", + "style": "IPY_MODEL_8cd86ea0043e4312b235242dc8f41ffc", + "value": "s2_medoid_im.tif: " } }, "b6f03fcf81d6460d9ac056070fdb23a3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "FWS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "0", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "FWS NWI Wetlands Raster", "options": [ "attribution", @@ -3420,28 +3711,16 @@ "url": "https://www.fws.gov/wetlands/arcgis/services/Wetlands_Raster/ImageServer/WMSServer?" } }, - "b7ca150eac5e4a73a61d79f11f9a35c5": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HBoxModel", - "state": { - "children": [ - "IPY_MODEL_6c9c206e37d146feb29b79e565162427", - "IPY_MODEL_9478b5e28c2e40f8bebb839862698638", - "IPY_MODEL_06b7e688e76545ac809500ea9896ad1d" - ], - "layout": "IPY_MODEL_3bcd7a717d074520876adb3983d8f813" - } - }, "b80a487b5a824084a4f306bb9f8221cc": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Earthstar Geographics", + "error": {}, "max_zoom": 24, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.AntarcticImagery", "options": [ "attribution", @@ -3459,21 +3738,16 @@ "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Antarctic_Imagery/MapServer/tile/{z}/{y}/{x}" } }, - "b890a51478c242a3bc27b16ce39b3778": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, "b8df6bc15d094860974d1e81adfbcb3b": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stadia.AlidadeSmoothDark", "options": [ "attribution", @@ -3493,13 +3767,14 @@ }, "b8e168f0cb014c1f9f02fbf26d3d2753": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri", + "error": {}, "max_zoom": 13, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.OceanBasemap", "options": [ "attribution", @@ -3517,25 +3792,16 @@ "url": "https://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}" } }, - "b9b56ba6f94841a18366daa5a7ff03d3": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, "b9bba44516ad4d57856000a42c20e260": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.asian", "options": [ "attribution", @@ -3555,12 +3821,13 @@ }, "bbe777fd811347e5ad0ef157c3fc66c9": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "WaymarkedTrails.cycling", "options": [ "attribution", @@ -3580,13 +3847,14 @@ }, "bc259018ef394552b43084f7d8caad42": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Kaartgegevens (C) Kadaster", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "nlmaps.pastel", "options": [ "attribution", @@ -3606,12 +3874,13 @@ }, "bc49213330e34d1ba44e2d5e10e9a0af": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OneMapSG.LandLot", "options": [ "attribution", @@ -3631,13 +3900,14 @@ }, "bd06020187344a059345b976ed326d8e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) Stadia Maps, (C) OpenMapTiles (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stadia.Outdoors", "options": [ "attribution", @@ -3655,15 +3925,29 @@ "url": "https://tiles.stadiamaps.com/tiles/outdoors/{z}/{x}/{y}.png" } }, + "bdb4a2ebe5614259887662a90121aa16": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_b67efd3ff159409098a0fa4505a3c1b1", + "IPY_MODEL_a1a55e38255a4c489cad017c5ec35957", + "IPY_MODEL_f2d3829d3a1647628ffafd4105e1618d" + ], + "layout": "IPY_MODEL_6f731e5e27444366b95528938448ab21" + } + }, "be78eda94bd94971a0af5344eee9fe9d": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 16, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.Watercolor", "options": [ "attribution", @@ -3683,13 +3967,14 @@ }, "be86a6442eb04a7396d7af73c83c3248": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisAquaBands721CR", "options": [ "attribution", @@ -3707,21 +3992,16 @@ "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_Bands721/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" } }, - "bf836e0fdbe44070bbbb0cf4cdeb3f52": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": {} - }, "bf9b38be4e4a46b5bef6af30119ccffd": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Strava 2021", + "error": {}, "max_zoom": 15, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Strava.Winter", "options": [ "attribution", @@ -3739,20 +4019,29 @@ "url": "https://heatmap-external-a.strava.com/tiles/winter/hot/{z}/{x}/{y}.png" } }, + "bfc4557369ce4523863cd34b235e069c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "description_width": "" + } + }, "c09537bb14d64841bdabc44dac43e21f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "USGS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "USGSNAIPImagery:NDVI_Color", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "USGS NAIP Imagery NDVI", "options": [ "attribution", @@ -3778,18 +4067,19 @@ }, "c26a8b152d1148c8964d18b373c59454": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "FWS", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "1", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "FWS NWI Wetlands", "options": [ "attribution", @@ -3815,13 +4105,14 @@ }, "c4f3405c724944cb903be76333300db3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Copyright: (C)2012 DeLorme", + "error": {}, "max_zoom": 11, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.DeLorme", "options": [ "attribution", @@ -3839,15 +4130,26 @@ "url": "https://server.arcgisonline.com/ArcGIS/rest/services/Specialty/DeLorme_World_Base_Map/MapServer/tile/{z}/{y}/{x}" } }, + "c5374355a9354ae887317c8ff3d41250": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, "c59550707736421db30389135d604684": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors & USGS", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "MtbMap", "options": [ "attribution", @@ -3867,18 +4169,19 @@ }, "c5fda237e505448389028037f377aba2": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2016_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2016 CONUS Land Cover", "options": [ "attribution", @@ -3902,14 +4205,33 @@ "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2016_Land_Cover_L48/wms?" } }, + "c8a267d6a66b4132bf526a516e3f2278": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "bar_style": "success", + "layout": "IPY_MODEL_7b4d26ba0d5f4022bc76dd3931f7838c", + "max": 1, + "style": "IPY_MODEL_788b37c13ae049c7826a82167b7ccc0e", + "value": 1 + } + }, + "c8b6c4bdebd2442fb06ee99128d47a5b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, "cb16b110a9244dfa90d7c9c530c109e6": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TerrainLabels", "options": [ "attribution", @@ -3927,15 +4249,22 @@ "url": "https://stamen-tiles-a.a.ssl.fastly.net/terrain-labels/{z}/{x}/{y}.png" } }, + "cb3d841725d947f8922659146d9a79c3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, "cbe8b7918aae4cbfacc61b46e3e6a170": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles courtesy of the U.S. Geological Survey", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "USGS.USImagery", "options": [ "attribution", @@ -3955,13 +4284,14 @@ }, "cd73c10387a94bf7b0e0b843c2c6f76e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) OpenFireMap (CC-BY-SA)", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenFireMap", "options": [ "attribution", @@ -3979,25 +4309,16 @@ "url": "http://openfiremap.org/hytiles/{z}/{x}/{y}.png" } }, - "cdd9b298703c478cbe73b515c5f908cc": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, "cf4910a75c544f6688481561d3af7de5": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.VoyagerOnlyLabels", "options": [ "attribution", @@ -4017,13 +4338,14 @@ }, "d00fe490e5464e78bbd9ec71ba20236f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Justice Map", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "JusticeMap.multi", "options": [ "attribution", @@ -4041,14 +4363,28 @@ "url": "https://www.justicemap.org/tile/county/multi/{z}/{x}/{y}.png" } }, + "d1475bca1d334047bb219db903069ef3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_7687cbfc04b24918b564223f8929102d", + "IPY_MODEL_c8a267d6a66b4132bf526a516e3f2278", + "IPY_MODEL_a57a7639c34f4d9e988193958af06e0f" + ], + "layout": "IPY_MODEL_d82698c1ca56487bb7b184446f5e1294" + } + }, "d26ac23ccd4b432b9bdb93c0afda4152": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TerrainBackground", "options": [ "attribution", @@ -4068,13 +4404,14 @@ }, "d3112468c7414951afb2320a73fcedc1": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Esri, DeLorme, NAVTEQ", + "error": {}, "max_zoom": 16, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldGrayCanvas", "options": [ "attribution", @@ -4094,13 +4431,14 @@ }, "d3d3bce783c34ff68aeff1e9356d4e11": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.highdpi", "options": [ "attribution", @@ -4118,14 +4456,25 @@ "url": "https://maps.wien.gv.at/basemap/bmaphidpi/normal/google3857/{z}/{y}/{x}.jpeg" } }, + "d82698c1ca56487bb7b184446f5e1294": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "display": "inline-flex", + "flex_flow": "row wrap", + "width": "100%" + } + }, "da8baf500177455796c951468d69e1c0": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "© swisstopo", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "SwissFederalGeoportal.JourneyThroughTime", "options": [ "attribution", @@ -4143,25 +4492,16 @@ "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.zeitreihen/default/18641231/3857/{z}/{x}/{y}.png" } }, - "da9337c7a73f495daa1b9e9e51e52453": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLModel", - "state": { - "layout": "IPY_MODEL_bf836e0fdbe44070bbbb0cf4cdeb3f52", - "style": "IPY_MODEL_af1b249c71f14b7ba1e415a93f0ee5d1", - "value": "s2_medoid_im.tif: " - } - }, "daa4eea8a3f048358dcc5b5b222c6966": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Source: US National Park Service", + "error": {}, "max_zoom": 8, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldPhysical", "options": [ "attribution", @@ -4179,25 +4519,16 @@ "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}" } }, - "db2ccbfb8f4b484ba9787f42fcf0a169": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, "dc3a0fded3214fdb977fe1d440da5dd8": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.DarkMatterOnlyLabels", "options": [ "attribution", @@ -4217,13 +4548,14 @@ }, "dcddf21ca4ac4c359d4d56a26c4efdf2": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Geoportail France", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "GeoportailFrance.orthos", "options": [ "attribution", @@ -4243,12 +4575,13 @@ }, "e04e2168983d4c81a9cd0955d6f293f3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Geoportail France", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "GeoportailFrance.plan", "options": [ "attribution", @@ -4268,13 +4601,14 @@ }, "e190c599b12543c9ab6c11c91a534f02": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "OpenStreetMap", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap", "options": [ "attribution", @@ -4293,18 +4627,19 @@ }, "e1cedd4f07704fbbbf480c45be7a4f6e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2011_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2011 CONUS Land Cover", "options": [ "attribution", @@ -4330,13 +4665,14 @@ }, "e3b2bd0b21374fe4a6f3e4dfcbc5449a": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) OpenRailwayMap (CC-BY-SA)", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenRailwayMap", "options": [ "attribution", @@ -4356,13 +4692,14 @@ }, "e3c8826fb5ae430390b4b288e6b365a7": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 8, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ViirsEarthAtNight2012", "options": [ "attribution", @@ -4382,12 +4719,13 @@ }, "e6d46b02990d46d4b51ce0a5bfa556ef": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "WaymarkedTrails.slopes", "options": [ "attribution", @@ -4407,13 +4745,14 @@ }, "e713b42d5aec4721a1268c659d42a829": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Strava 2021", + "error": {}, "max_zoom": 15, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Strava.Ride", "options": [ "attribution", @@ -4433,13 +4772,14 @@ }, "e8f273a1448a486a9e0f5d7d0bc4fae6": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Earthstar Geographics", + "error": {}, "max_zoom": 24, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.ArcticImagery", "options": [ "attribution", @@ -4457,30 +4797,21 @@ "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Imagery/MapServer/tile/{z}/{y}/{x}" } }, - "e99486544ccf46c382af6f910db4cba7": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "2.0.0", - "model_name": "LayoutModel", - "state": { - "display": "inline-flex", - "flex_flow": "row wrap", - "width": "100%" - } - }, "e9e62decfdad4a1ca0ee34c0deed5865": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2013_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2013 CONUS Land Cover", "options": [ "attribution", @@ -4506,12 +4837,13 @@ }, "ea6feb2791b847d49faef95cd60d4c4a": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.CH", "options": [ "attribution", @@ -4531,12 +4863,13 @@ }, "ead93acd8d484ccc9f0e75c66d8e0272": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.BlackAndWhite", "options": [ "attribution", @@ -4554,15 +4887,26 @@ "url": "http://a.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png" } }, + "ed97a2cfa08b44cc9cd2c61701ec5dcf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "description_width": "", + "font_size": null, + "text_color": null + } + }, "ede50f3d0204466bbbaf8081a4f0451b": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 8, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraSnowCover", "options": [ "attribution", @@ -4582,13 +4926,14 @@ }, "eedddf1bb86d4be8aa2043da235ef8b6": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 8, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.BlueMarble", "options": [ "attribution", @@ -4608,13 +4953,14 @@ }, "ef3baaec543a455ea1c0cc76ee9161bb": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.Voyager", "options": [ "attribution", @@ -4634,13 +4980,14 @@ }, "f1400a13c80b4738aa2e229a6364942f": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 6, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraAOD", "options": [ "attribution", @@ -4658,15 +5005,22 @@ "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_Aerosol/default//GoogleMapsCompatible_Level6/{z}/{y}/{x}.png" } }, + "f17410c4e4d2455495bf04af0de8f33a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, "f1e66528f1b04571be857631f73ab4dd": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "© swisstopo", + "error": {}, "max_zoom": 19, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "SwissFederalGeoportal.SWISSIMAGE", "options": [ "attribution", @@ -4686,13 +5040,14 @@ }, "f1eaadb1c01540dc83bf2c38d0bfd1b8": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 5, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.BlueMarble3031", "options": [ "attribution", @@ -4712,13 +5067,14 @@ }, "f2330164ab4f45af922d88f9862cccd5": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community", + "error": {}, "max_zoom": 22, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldImagery", "options": [ "attribution", @@ -4736,14 +5092,25 @@ "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}" } }, + "f2d3829d3a1647628ffafd4105e1618d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_cb3d841725d947f8922659146d9a79c3", + "style": "IPY_MODEL_c5374355a9354ae887317c8ff3d41250", + "value": " 951M/951M (raw) [100.0%] in 06:23 (eta: 00:00)" + } + }, "f3670cd9c9b84b268cd1b9ad3f119cfc": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors", + "error": {}, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenStreetMap.DE", "options": [ "attribution", @@ -4763,18 +5130,19 @@ }, "f4c986db7cfd4b6e929606b435f36f22": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletWMSLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "MRLC", "crs": { "custom": false, "name": "EPSG3857" }, + "error": {}, "format": "image/png", "layers": "NLCD_2006_Land_Cover_L48", + "msg": "Failed to load model class 'LeafletWMSLayerModel' from module 'jupyter-leaflet'", "name": "NLCD 2006 CONUS Land Cover", "options": [ "attribution", @@ -4798,15 +5166,29 @@ "url": "https://www.mrlc.gov/geoserver/mrlc_display/NLCD_2006_Land_Cover_L48/wms?" } }, + "f4e01a76ac9949cf8b4527f63de188b2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_6d59087c069740149fd4f70d469901a0", + "IPY_MODEL_6a93b9d2ac5745d9a1503abdd0097976", + "IPY_MODEL_0046d915033c4a348423b6830ea40858" + ], + "layout": "IPY_MODEL_9aeafa397af948bd9326ca47493c3e0c" + } + }, "f5e8241cd3ea4fbb93dd708bc2675bb5": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "CartoDB.PositronNoLabels", "options": [ "attribution", @@ -4826,13 +5208,14 @@ }, "f5f722ce03be4a5a8ec66503c9926de4": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Datenquelle: basemap.at", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "BasemapAT.basemap", "options": [ "attribution", @@ -4852,13 +5235,14 @@ }, "f6ab13cfe8064a37936c227831743f2c": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "error": {}, "max_zoom": 9, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "NASAGIBS.ModisTerraBands721CR", "options": [ "attribution", @@ -4876,25 +5260,16 @@ "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands721/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg" } }, - "f6c8928d26884767bec25775a52636bd": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "2.0.0", - "model_name": "HTMLStyleModel", - "state": { - "description_width": "", - "font_size": null, - "text_color": null - } - }, "fbeff9c277c542fbb86883ebd972201e": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Tiles (C) Esri -- Source: USGS, Esri, TANA, DeLorme, and NPS", + "error": {}, "max_zoom": 13, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Esri.WorldTerrain", "options": [ "attribution", @@ -4914,13 +5289,14 @@ }, "fc92ed808ca04c4abb7b623c1c39caa3": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "openAIP Data (CC-BY-NC-SA)", + "error": {}, "max_zoom": 14, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "OpenAIP", "options": [ "attribution", @@ -4940,13 +5316,14 @@ }, "ff758207968e4df8848ecce6ddd34c84": { "model_module": "jupyter-leaflet", - "model_module_version": "^0.17", + "model_module_version": "2.0.0", "model_name": "LeafletTileLayerModel", "state": { - "_model_module_version": "^0.17", - "_view_module_version": "^0.17", + "_view_name": "ErrorWidgetView", "attribution": "Map tiles by Stamen Design, CC BY 3.0 -- Map data (C) OpenStreetMap contributors", + "error": {}, "max_zoom": 20, + "msg": "Failed to load model class 'LeafletTileLayerModel' from module 'jupyter-leaflet'", "name": "Stamen.TonerLabels", "options": [ "attribution", diff --git a/geedim/__init__.py b/geedim/__init__.py index f31a934..f5f314d 100644 --- a/geedim/__init__.py +++ b/geedim/__init__.py @@ -13,7 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. """ + from geedim.collection import MaskedCollection -from geedim.enums import CloudMaskMethod, CompositeMethod, ResamplingMethod, ExportType +from geedim.enums import CloudMaskMethod, CloudScoreBand, CompositeMethod, ExportType, ResamplingMethod from geedim.mask import MaskedImage from geedim.utils import Initialize diff --git a/geedim/cli.py b/geedim/cli.py index da1142c..dd6972f 100644 --- a/geedim/cli.py +++ b/geedim/cli.py @@ -29,12 +29,12 @@ from click.core import ParameterSource from rasterio.errors import CRSError -from geedim import schema, Initialize, version +from geedim import Initialize, schema, version from geedim.collection import MaskedCollection -from geedim.download import BaseImage, supported_dtypes -from geedim.enums import CloudMaskMethod, CompositeMethod, ResamplingMethod, ExportType +from geedim.download import _nodata_vals, BaseImage +from geedim.enums import CloudMaskMethod, CloudScoreBand, CompositeMethod, ExportType, ResamplingMethod from geedim.mask import MaskedImage -from geedim.utils import get_bounds, Spinner, asset_id +from geedim.utils import asset_id, get_bounds, Spinner logger = logging.getLogger(__name__) @@ -169,26 +169,6 @@ def _region_cb(ctx, param, value): return value -def _mask_method_cb(ctx, param, value): - """click callback to convert cloud mask method string to enum.""" - return CloudMaskMethod(value) - - -def _resampling_method_cb(ctx, param, value): - """click callback to convert resampling string to enum.""" - return ResamplingMethod(value) - - -def _comp_method_cb(ctx, param, value): - """click callback to convert composite method string to enum.""" - return CompositeMethod(value) if value else None - - -def _export_type_cb(ctx, param, value): - """click callback to convert export type string to enum.""" - return ExportType(value) - - def _prepare_image_list(obj: SimpleNamespace, mask=False) -> List[MaskedImage,]: """Validate and prepare the obj.image_list for export/download. Returns a list of MaskedImage objects.""" if len(obj.image_list) == 0: @@ -248,7 +228,7 @@ def _prepare_image_list(obj: SimpleNamespace, mask=False) -> List[MaskedImage,]: dtype_option = click.option( '-dt', '--dtype', - type=click.Choice(supported_dtypes, case_sensitive=False), + type=click.Choice(_nodata_vals.keys(), case_sensitive=True), default=None, show_default='smallest data type able to represent the range of pixel values.', help='Data type to convert image(s) to.', @@ -264,10 +244,9 @@ def _prepare_image_list(obj: SimpleNamespace, mask=False) -> List[MaskedImage,]: resampling_option = click.option( '-rs', '--resampling', - type=click.Choice([rm.value for rm in ResamplingMethod], case_sensitive=True), - default=BaseImage._default_resampling.value, + type=click.Choice(ResamplingMethod, case_sensitive=True), + default=BaseImage._default_resampling, show_default=True, - callback=_resampling_method_cb, help='Resampling method.', ) scale_offset_option = click.option( @@ -340,16 +319,16 @@ def cli(ctx, verbose, quiet): '--mask-shadows/--no-mask-shadows', default=True, show_default=True, - help='Whether to mask cloud shadows.', + help='Whether to mask cloud shadows. Valid for Landsat images, and, for Sentinel-2 images with the `qa` or ' + '`cloud-prob` ``--mask-method``.', ) @click.option( '-mm', '--mask-method', - type=click.Choice([cmm.value for cmm in CloudMaskMethod], case_sensitive=True), - default=CloudMaskMethod.cloud_prob.value, + type=click.Choice(CloudMaskMethod, case_sensitive=True), + default=CloudMaskMethod.cloud_score, show_default=True, - callback=_mask_method_cb, - help='Method used to mask clouds. Valid for Sentinel-2 images. ', + help='Method used to mask clouds. Valid for Sentinel-2 images.', ) @click.option( '-p', @@ -357,7 +336,7 @@ def cli(ctx, verbose, quiet): type=click.FloatRange(min=0, max=100), default=60, show_default=True, - help='Cloud probability threshold (%). Valid for Sentinel-2 images with the `cloud-prob` ``--mask-method``', + help='Cloud Probability threshold (%). Valid for Sentinel-2 images with the `cloud-prob` ``--mask-method``', ) @click.option( '-d', @@ -365,8 +344,8 @@ def cli(ctx, verbose, quiet): type=click.FloatRange(min=0, max=1), default=0.15, show_default=True, - help='NIR reflectance threshold for shadow masking. NIR values below this threshold are ' - 'potential cloud shadows. Valid for Sentinel-2 images', + help='NIR reflectance threshold for shadow masking. NIR values below this threshold are potential cloud shadows. ' + 'Valid for Sentinel-2 images with the `qa` or `cloud-prob` ``--mask-method``.', ) @click.option( '-sd', @@ -374,7 +353,8 @@ def cli(ctx, verbose, quiet): type=click.INT, default=1000, show_default=True, - help='Maximum distance (m) to look for cloud shadows from cloud edges. Valid for Sentinel-2 images.', + help='Maximum distance (m) to look for cloud shadows from cloud edges. Valid for Sentinel-2 images with the `qa` ' + 'or `cloud-prob` ``--mask-method``.', ) @click.option( '-b', @@ -382,7 +362,8 @@ def cli(ctx, verbose, quiet): type=click.INT, default=50, show_default=True, - help='Distance (m) to dilate cloud/shadow. Valid for Sentinel-2 images.', + help='Distance (m) to dilate cloud/shadow. Valid for Sentinel-2 images with the `qa` or `cloud-prob` ' + '``--mask-method``.', ) @click.option( '-cdi', @@ -390,7 +371,7 @@ def cli(ctx, verbose, quiet): type=click.FloatRange(min=-1, max=1), default=None, help='Cloud Displacement Index (CDI) threshold. Values below this threshold are considered potential clouds. ' - 'Valid for Sentinel-2 images. By default, the CDI is not used.', + 'Valid for Sentinel-2 images with the `qa` or `cloud-prob` ``--mask-method``. By default, the CDI is not used.', ) @click.option( '-mcd', @@ -401,8 +382,24 @@ def cli(ctx, verbose, quiet): help='Maximum distance (m) to look for clouds. Used to form the cloud distance band for the `q-mosaic` ' 'compositing ``--method``.', ) +@click.option( + '-s', + '--score', + type=click.FloatRange(min=0, max=1), + default=0.6, + show_default=True, + help='Cloud Score+ threshold. Valid for Sentinel-2 images with the `cloud-score` ``--mask-method``', +) +@click.option( + '-cb', + '--cs-band', + type=click.Choice(CloudScoreBand, case_sensitive=True), + default=CloudScoreBand.cs, + show_default=True, + help='Cloud Score+ band to threshold. Valid for Sentinel-2 images with the `cloud-score` ``--mask-method``', +) @click.pass_context -def config(ctx, mask_cirrus, mask_shadows, mask_method, prob, dark, shadow_dist, buffer, cdi_thresh, max_cloud_dist): +def config(ctx, **kwargs): # @formatter:off """ Configure cloud/shadow masking. @@ -431,9 +428,9 @@ def config(ctx, mask_cirrus, mask_shadows, mask_method, prob, dark, shadow_dist, For Sentinel-2 collections, ``--mask-method`` can be one of: \b - * | `cloud-prob`: Use a threshold on the corresponding Sentinel-2 cloud - | probability image. - * | `qa`: Use the Sentinel-2 `QA60` quality band. + * | `cloud-prob`: Threshold the Sentinel-2 Cloud Probability. + * | `qa`: Bit mask the `QA60` quality assessment band. + * | `cloud-score`: Threshold the Sentinel-2 Cloud Score+. \b Examples @@ -760,10 +757,9 @@ def download(obj, image_id, bbox, region, like, download_dir, mask, max_tile_siz @click.option( '-t', '--type', - type=click.Choice([t.value for t in ExportType], case_sensitive=True), + type=click.Choice(ExportType, case_sensitive=True), default=BaseImage._default_export_type.value, show_default=True, - callback=_export_type_cb, help='Export type.', ) @click.option( @@ -881,9 +877,8 @@ def export(obj, image_id, type, folder, bbox, region, like, mask, wait, **kwargs '-cm', '--method', 'method', - type=click.Choice([cm.value for cm in CompositeMethod], case_sensitive=False), + type=click.Choice(CompositeMethod, case_sensitive=False), default=None, - callback=_comp_method_cb, show_default='`q-mosaic` for cloud/shadow mask supported collections, `mosaic` otherwise.', help='Compositing method to use.', ) @@ -898,9 +893,8 @@ def export(obj, image_id, type, folder, bbox, region, like, mask, wait, **kwargs @click.option( '-rs', '--resampling', - type=click.Choice([rm.value for rm in ResamplingMethod], case_sensitive=True), - default=BaseImage._default_resampling.value, - callback=_resampling_method_cb, + type=click.Choice(ResamplingMethod, case_sensitive=True), + default=BaseImage._default_resampling, show_default=True, help='Resample images with this method before compositing.', ) diff --git a/geedim/collection.py b/geedim/collection.py index d0a53ca..7a851cc 100644 --- a/geedim/collection.py +++ b/geedim/collection.py @@ -14,24 +14,27 @@ limitations under the License. """ +from __future__ import annotations + import logging import re +import textwrap as wrap from collections import OrderedDict from datetime import datetime, timedelta, timezone from typing import Dict, List, Union import ee import tabulate -import textwrap as wrap +from tabulate import DataRow, Line, TableFormat + from geedim import schema -from geedim.medoid import medoid from geedim.download import BaseImage -from geedim.enums import ResamplingMethod, CompositeMethod -from geedim.errors import UnfilteredError, InputImageError -from geedim.mask import MaskedImage, class_from_id +from geedim.enums import CompositeMethod, ResamplingMethod +from geedim.errors import InputImageError, UnfilteredError +from geedim.mask import class_from_id, MaskedImage +from geedim.medoid import medoid from geedim.stac import StacCatalog, StacItem -from geedim.utils import split_id, resample -from tabulate import TableFormat, Line, DataRow +from geedim.utils import resample, split_id logger = logging.getLogger(__name__) tabulate.MIN_PADDING = 0 @@ -46,7 +49,7 @@ headerrow=DataRow("", " ", ""), datarow=DataRow("", " ", ""), padding=0, - with_header_hide=["lineabove", "linebelow"] + with_header_hide=["lineabove", "linebelow"], ) # yapf: disable @@ -73,18 +76,18 @@ def compatible_collections(names: List[str]) -> bool: def parse_date(date: Union[datetime, str], var_name=None) -> datetime: - """ Convert a string to a datetime, raising an exception if it is in the wrong format. """ + """Convert a string to a datetime, raising an exception if it is in the wrong format.""" var_name = var_name or 'date' if isinstance(date, str): try: - date = datetime.strptime(date, '%Y-%m-%d') + date = datetime.strptime(date, '%Y-%m-%d').replace(tzinfo=timezone.utc) except ValueError: - raise ValueError(f'{var_name} should be a datetime instance or a string with format: "%Y-%m-%d"') + raise ValueError(f'{var_name} should be a datetime instance or UTC string with format: "%Y-%m-%d"') return date def abbreviate(name: str) -> str: - """ Return an acronym for a string in camel or snake case. """ + """Return an acronym for a string in camel or snake case.""" name = name.strip() if len(name) <= 5: return name @@ -127,7 +130,7 @@ def __init__(self, ee_collection: ee.ImageCollection, add_props: List[str] = Non self._stats_scale = None @classmethod - def from_name(cls, name: str, add_props: List[str] = None) -> 'MaskedCollection': + def from_name(cls, name: str, add_props: List[str] = None) -> MaskedCollection: """ Create a MaskedCollection instance from an Earth Engine image collection name. @@ -144,16 +147,7 @@ def from_name(cls, name: str, add_props: List[str] = None) -> 'MaskedCollection' A MaskedCollection instance. """ # this is separate from __init__ for consistency with MaskedImage.from_id() - if (name == 'COPERNICUS/S2') or (name == 'COPERNICUS/S2_SR'): - # Recent images in S2_SR do not always have matching images in S2_CLOUD_PROBABILITY (which is needed for - # 'cloud_prob' cloud masking), so this is a special case to return a filtered S2/S2_SR collection that has - # matching images in S2_CLOUD_PROBABILITY. - cloud_prob_coll = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY') - s2_coll = ee.ImageCollection(name) - filt = ee.Filter.equals(leftField='system:index', rightField='system:index') - ee_collection = ee.ImageCollection(ee.Join.simple().apply(s2_coll, cloud_prob_coll, filt)) - else: - ee_collection = ee.ImageCollection(name) + ee_collection = ee.ImageCollection(name) gd_collection = cls(ee_collection, add_props=add_props) gd_collection._name = name return gd_collection @@ -161,7 +155,7 @@ def from_name(cls, name: str, add_props: List[str] = None) -> 'MaskedCollection' @classmethod def from_list( cls, image_list: List[Union[str, MaskedImage, ee.Image]], add_props: List[str] = None - ) -> 'MaskedCollection': + ) -> MaskedCollection: """ Create a MaskedCollection instance from a list of Earth Engine image ID strings, ``ee.Image`` instances and/or :class:`~geedim.mask.MaskedImage` instances. The list may include composite images, as created with @@ -198,6 +192,7 @@ def from_list( if isinstance(image_obj, str): im_dict_list.append(dict(ee_image=ee.Image(image_obj), id=image_obj, has_date=True)) elif isinstance(image_obj, ee.Image): + # TODO: combine all getInfo() calls into one ee_info = image_obj.getInfo() ee_id = ee_info['id'] if 'id' in ee_info else None has_date = ('properties' in ee_info) and ('system:time_start' in ee_info['properties']) @@ -226,14 +221,14 @@ def from_list( @property def stac(self) -> Union[StacItem, None]: - """ STAC info, if any. """ + """STAC info, if any.""" if not self._stac and (self.name in StacCatalog().url_dict): self._stac = StacCatalog().get_item(self.name) return self._stac @property def stats_scale(self) -> Union[float, None]: - """ Scale to use for re-projections when finding region statistics. """ + """Scale to use for re-projections when finding region statistics.""" if not self.stac: return None if not self._stats_scale: @@ -245,12 +240,12 @@ def stats_scale(self) -> Union[float, None]: @property def ee_collection(self) -> ee.ImageCollection: - """ Earth Engine image collection. """ + """Earth Engine image collection.""" return self._ee_collection @property def name(self) -> str: - """ Name of the encapsulated Earth Engine image collection. """ + """Name of the encapsulated Earth Engine image collection.""" if not self._name: ee_info = self._ee_collection.first().getInfo() self._name = split_id(ee_info['id'])[0] if ee_info and 'id' in ee_info else 'None' @@ -258,7 +253,7 @@ def name(self) -> str: @property def image_type(self) -> type: - """ :class:`~geedim.mask.MaskedImage` class or sub-class corresponding to images in :attr:`ee_collection`. """ + """:class:`~geedim.mask.MaskedImage` class or sub-class corresponding to images in :attr:`ee_collection`.""" if not self._image_type: self._image_type = class_from_id(self.name) return self._image_type @@ -279,7 +274,7 @@ def properties(self) -> Dict[str, Dict]: @property def properties_table(self) -> str: - """ :attr:`properties` formatted as a printable table string. """ + """:attr:`properties` formatted as a printable table string.""" return self._get_properties_table(self.properties) @property @@ -308,7 +303,7 @@ def schema(self) -> Dict[str, Dict]: @property def schema_table(self) -> str: - """ :attr:`schema` formatted as a printable table string. """ + """:attr:`schema` formatted as a printable table string.""" table_list = [] for prop_name, prop_dict in self.schema.items(): description = '\n'.join(wrap.wrap(prop_dict['description'], 50)) @@ -318,13 +313,13 @@ def schema_table(self) -> str: @property def refl_bands(self) -> Union[List[str], None]: - """ List of spectral / reflectance band names, if any. """ + """List of spectral / reflectance band names, if any.""" if not self.stac: return None return [bname for bname, bdict in self.stac.band_props.items() if 'center_wavelength' in bdict] def _get_properties(self, ee_collection: ee.ImageCollection, schema=None) -> Dict: - """ Retrieve properties of images in a given Earth Engine image collection. """ + """Retrieve properties of images in a given Earth Engine image collection.""" if not schema: schema = self.schema @@ -367,7 +362,7 @@ def _get_properties_table(self, properties: Dict, schema: Dict = None) -> str: for prop_name, key_dict in schema.items(): if prop_name in im_prop_dict: if prop_name == 'system:time_start': # convert timestamp to date string - dt = datetime.utcfromtimestamp(im_prop_dict[prop_name] / 1000) + dt = datetime.fromtimestamp(im_prop_dict[prop_name] / 1000, tz=timezone.utc) abbrev_dict[key_dict['abbrev']] = datetime.strftime(dt, '%Y-%m-%d %H:%M') else: abbrev_dict[key_dict['abbrev']] = im_prop_dict[prop_name] @@ -375,8 +370,13 @@ def _get_properties_table(self, properties: Dict, schema: Dict = None) -> str: return tabulate.tabulate(abbrev_props, headers='keys', floatfmt='.2f', tablefmt=_table_fmt) def _prepare_for_composite( - self, method: CompositeMethod, mask: bool = True, resampling: Union[ResamplingMethod, str] = None, - date: str = None, region: Dict = None, **kwargs + self, + method: CompositeMethod, + mask: bool = True, + resampling: Union[ResamplingMethod, str] = None, + date: str = None, + region: dict | ee.Geometry = None, + **kwargs, ) -> ee.ImageCollection: """ Prepare the Earth Engine collection for compositing. See :meth:`~MaskedCollection.composite` for @@ -399,7 +399,7 @@ def _prepare_for_composite( ) def prepare_image(ee_image: ee.Image): - """ Prepare an Earth Engine image for use in compositing. """ + """Prepare an Earth Engine image for use in compositing.""" if date and (method in self._sort_methods): date_dist = ee.Number(ee_image.get('system:time_start')).subtract(ee.Date(date).millis()).abs() ee_image = ee_image.set('DATE_DIST', date_dist) @@ -430,9 +430,15 @@ def prepare_image(ee_image: ee.Image): return ee_collection def search( - self, start_date: Union[datetime, str] = None, end_date: Union[datetime, str] = None, region: Dict = None, - fill_portion: float = None, cloudless_portion: float = None, custom_filter: str = None, **kwargs - ) -> 'MaskedCollection': + self, + start_date: datetime | str = None, + end_date: datetime | str = None, + region: dict | ee.Geometry = None, + fill_portion: float = None, + cloudless_portion: float = None, + custom_filter: str = None, + **kwargs, + ) -> MaskedCollection: """ Search for images based on date, region, filled/cloudless portion, and custom criteria. @@ -449,8 +455,8 @@ def search( end_date : datetime, str, optional End date (UTC). In '%Y-%m-%d' format if a string. If None, ``end_date`` is set to a day after ``start_date``. - region : dict, ee.Geometry - Polygon in WGS84 specifying a region that images should intersect. + region: dict, ee.Geometry + Region that images should intersect as a GeoJSON dictionary or ``ee.Geometry``. fill_portion: float, optional Lower limit on the portion of region that contains filled/valid image pixels (%). cloudless_portion: float, optional @@ -473,7 +479,7 @@ def search( logger.warning('Specifying `start_date` and `region` will improve the search speed.') def set_region_stats(ee_image: ee.Image): - """ Find filled and cloud/shadow free portions inside the search region for a given image. """ + """Find filled and cloud/shadow free portions inside the search region for a given image.""" gd_image = self.image_type(ee_image, **kwargs) gd_image._set_region_stats(region, scale=self.stats_scale) return gd_image.ee_image @@ -523,9 +529,13 @@ def set_region_stats(ee_image: ee.Image): return gd_collection def composite( - self, method: Union[CompositeMethod, str] = None, mask: bool = True, - resampling: Union[ResamplingMethod, str] = None, date: Union[datetime, str] = None, region: dict = None, - **kwargs + self, + method: CompositeMethod | str = None, + mask: bool = True, + resampling: ResamplingMethod | str = None, + date: datetime | str = None, + region: dict | ee.Geometry = None, + **kwargs, ) -> MaskedImage: """ Create a composite image from the encapsulated image collection. @@ -543,16 +553,16 @@ def composite( Resampling method to use on collection images prior to compositing. If None, `near` resampling is used (the default). See :class:`~geedim.enums.ResamplingMethod` for available options. date: datetime, str, optional - Sort collection images by their absolute difference in capture time from this date. Useful for - prioritising pixels from images closest to this date. Valid for the `q-mosaic`, `mosaic` and - `medoid` ``method`` only. If None, no time difference sorting is done (the default). - region: dict, optional - Sort collection images by the portion of their pixels that are cloudless, and inside this geojson polygon. - This is useful to prioritise pixels from the least cloudy image(s). Valid for the `q-mosaic` `mosaic`, and - `medoid` ``method`` only. If collection has no cloud/shadow mask support, images are sorted by the portion - of their pixels that are valid, and inside ``region``. If None, no cloudless/valid portion sorting is done - (the default). If ``date`` and ``region`` are not specified, collection images are sorted by their capture - date. + Sort collection images by their absolute difference in capture time from this date. Pioritises pixels + from images closest to this date. Valid for the `q-mosaic`, `mosaic` and `medoid` ``method`` only. If + None, no time difference sorting is done (the default). + region: dict, ee.Geometry, optional + Sort collection images by the portion of their pixels that are cloudless, and inside this region. Can be + a GeoJSON dictionary or ee.Geometry. Prioritises pixels from the least cloudy image(s). Valid for the + `q-mosaic`, `mosaic`, and `medoid` ``method`` only. If collection has no cloud/shadow mask support, + images are sorted by the portion of their pixels that are valid, and inside ``region``. If None, + no cloudless/valid portion sorting is done (the default). If ``date`` and ``region`` are not specified, + collection images are sorted by their capture date. **kwargs Optional cloud/shadow masking parameters - see :meth:`geedim.mask.MaskedImage.__init__` for details. @@ -561,12 +571,7 @@ def composite( MaskedImage Composite image. """ - - if isinstance(date, str): - try: - date = datetime.strptime(date, '%Y-%m-%d') - except ValueError: - raise ValueError('`date` should be a datetime instance or a string with format: "%Y-%m-%d"') + date = parse_date(date, 'date') if method is None: method = CompositeMethod.mosaic if self.image_type == MaskedImage else CompositeMethod.q_mosaic @@ -602,7 +607,7 @@ def composite( comp_image = comp_image.set('INPUT_IMAGES', 'TABLE:\n' + props_str) # construct an ID for the composite - dates = [datetime.utcfromtimestamp(item['system:time_start'] / 1000) for item in props.values()] + dates = [datetime.fromtimestamp(item['system:time_start'] / 1000, tz=timezone.utc) for item in props.values()] start_date = min(dates).strftime('%Y_%m_%d') end_date = max(dates).strftime('%Y_%m_%d') @@ -615,8 +620,7 @@ def composite( comp_image = comp_image.set('system:index', comp_id) # sets 'properties'->'system:index' # set the composite capture time to the capture time of the first input image. - # note that we must specify the timezone as utc, otherwise .timestamp() assumes local time. - timestamp = min(dates).replace(tzinfo=timezone.utc).timestamp() * 1000 + timestamp = min(dates).timestamp() * 1000 comp_image = comp_image.set('system:time_start', timestamp) gd_comp_image = self.image_type(comp_image) gd_comp_image._id = comp_id # avoid getInfo() for id property diff --git a/geedim/download.py b/geedim/download.py index 4d68a59..b633553 100644 --- a/geedim/download.py +++ b/geedim/download.py @@ -14,45 +14,53 @@ limitations under the License. """ +from __future__ import annotations + import logging import os import pathlib import threading import time -import warnings -from concurrent.futures import ThreadPoolExecutor, as_completed -from datetime import datetime +from concurrent.futures import as_completed, ThreadPoolExecutor +from datetime import datetime, timezone from itertools import product -from typing import Tuple, Dict, List, Union, Iterator, Optional +from typing import Dict, Iterator, List, Optional, Tuple, Union import ee import numpy as np import rasterio as rio -from rasterio import windows, features, warp +from rasterio import features, windows from rasterio.crs import CRS from rasterio.enums import Resampling as RioResampling -from tqdm import TqdmWarning from tqdm.auto import tqdm from tqdm.contrib.logging import logging_redirect_tqdm from geedim import utils -from geedim.enums import ResamplingMethod, ExportType +from geedim.enums import ExportType, ResamplingMethod from geedim.stac import StacCatalog, StacItem from geedim.tile import Tile logger = logging.getLogger(__name__) -supported_dtypes = ['uint8', 'uint16', 'uint32', 'int8', 'int16', 'int32', 'float32', 'float64'] -""" Supported image data types for downloading/exporting. """ +_nodata_vals = dict( + uint8=0, + uint16=0, + uint32=0, + int8=np.iinfo('int8').min, + int16=np.iinfo('int16').min, + int32=np.iinfo('int32').min, + float32=float('-inf'), + float64=float('-inf'), +) +"""Nodata values for supported download / export dtypes. """ # Note: -# - while gdal >= 3.5 supports *int64 data type, there is a rasterio bug retrieving the *int64 nodata value, +# - while gdal >= 3.5 supports *int64 data type, there is a rasterio bug that casts the *int64 nodata value to float, # so geedim will not support these types for now. -# - the ordering of the list above is relevant to the auto dtype and should be: unsigned ints smallest - largest, +# - the ordering of the keys above is relevant to the auto dtype and should be: unsigned ints smallest - largest, # signed ints smallest to largest, float types smallest to largest. class BaseImage: - _float_nodata = float('-inf') _desc_width = 50 _default_resampling = ResamplingMethod.near _ee_max_tile_size = 32 @@ -102,12 +110,12 @@ def from_id(cls, image_id: str) -> 'BaseImage': def _ee_info(self) -> Dict: """Earth Engine image metadata.""" if self.__ee_info is None: - self.__ee_info = self._ee_image.getInfo() + self.__ee_info = self._get_ee_info(self._ee_image) return self.__ee_info @property def _min_projection(self) -> Dict: - """Projection information corresponding to the minimum scale band.""" + """Projection information of the minimum scale band.""" if not self.__min_projection: self.__min_projection = self._get_projection(self._ee_info, min_scale=True) return self.__min_projection @@ -138,10 +146,10 @@ def id(self) -> Optional[str]: return self._ee_info['id'] if 'id' in self._ee_info else None @property - def date(self) -> Optional[datetime]: + def date(self) -> datetime | None: """Image capture date & time. None if the image ``system:time_start`` property is not set.""" if 'system:time_start' in self.properties: - return datetime.utcfromtimestamp(self.properties['system:time_start'] / 1000) + return datetime.fromtimestamp(self.properties['system:time_start'] / 1000, tz=timezone.utc) else: return None @@ -152,19 +160,17 @@ def name(self) -> Optional[str]: @property def crs(self) -> Optional[str]: - """ - Image CRS corresponding to minimum scale band, as an EPSG string. None if the image has no fixed projection. - """ + """CRS of the minimum scale band. None if the image has no fixed projection.""" return self._min_projection['crs'] @property def scale(self) -> Optional[float]: - """Minimum scale (m) of image bands. None if the image has no fixed projection.""" + """Minimum scale of the image bands (meters). None if the image has no fixed projection.""" return self._min_projection['scale'] @property def footprint(self) -> Optional[Dict]: - """Geojson polygon of the image extent. None if the image is a composite.""" + """GeoJSON polygon of the image extent. None if the image has no fixed projection.""" if ('properties' not in self._ee_info) or ('system:footprint' not in self._ee_info['properties']): return None footprint = self._ee_info['properties']['system:footprint'] @@ -179,7 +185,7 @@ def footprint(self) -> Optional[Dict]: return self._ee_info['properties']['system:footprint'] @property - def shape(self) -> Optional[Tuple[int, int]]: + def shape(self) -> tuple[int, int]: """(row, column) pixel dimensions of the minimum scale band. None if the image has no fixed projection.""" return self._min_projection['shape'] @@ -211,6 +217,8 @@ def size(self) -> Optional[int]: @property def has_fixed_projection(self) -> bool: """True if the image has a fixed projection, otherwise False.""" + # TODO: make a common server side fn that can be used in e.g. utils.get_projection, and utils.resample, + # and then retrieved client side in e.g. _ee_info return self.scale is not None @property @@ -245,33 +253,51 @@ def profile(self) -> Dict: @property def bounded(self) -> bool: """True if the image is bounded, otherwise False.""" - # TODO: an unbounded region could also have these bounds unbounded_bounds = (-180, -90, 180, 90) return (self.footprint is not None) and (features.bounds(self.footprint) != unbounded_bounds) + @staticmethod + def _get_ee_info(ee_image: ee.Image) -> dict: + """Retrieve ``ee_image`` image description, with band scales in meters, in one call to ``getInfo()``.""" + + def band_scale(band_name): + """Return ``ee_image`` scale in meters for the band named ``band_name``.""" + return ee_image.select(ee.String(band_name)).projection().nominalScale() + + scales = ee_image.bandNames().map(band_scale) + scales, ee_info = ee.List([scales, ee_image]).getInfo() + + # zip scales into ee_info band dictionaries + for scale, bdict in zip(scales, ee_info.get('bands', [])): + bdict['scale'] = scale + return ee_info + @staticmethod def _get_projection(ee_info: Dict, min_scale=True) -> Dict: """ Return the projection information corresponding to the min/max scale band of a given Earth Engine image info dictionary. """ - projection_info = dict(crs=None, transform=None, shape=None, scale=None) - if 'bands' in ee_info: - # get scale & crs corresponding to min/max scale band - scales = np.array([abs(bd['crs_transform'][0]) for bd in ee_info['bands']]) + proj_info = dict(index=None, crs=None, transform=None, shape=None, scale=None) + if 'bands' in ee_info and len(ee_info['bands']) > 0: + xress = np.array([abs(bd['crs_transform'][0]) for bd in ee_info['bands']]) + scales = np.array([bd['scale'] for bd in ee_info['bands']]) crss = np.array([bd['crs'] for bd in ee_info['bands']]) - fixed_idx = (crss != 'EPSG:4326') | (scales != 1) + fixed_idx = (crss != 'EPSG:4326') | (xress != 1) + + # set properties if there is a fixed projection if sum(fixed_idx) > 0: idx = np.argmin(scales[fixed_idx]) if min_scale else np.argmax(scales[fixed_idx]) band_info = np.array(ee_info['bands'])[fixed_idx][idx] - projection_info['scale'] = abs(band_info['crs_transform'][0]) - projection_info['crs'] = band_info['crs'] + proj_info['scale'] = float(scales[fixed_idx][idx]) + proj_info['crs'] = band_info['crs'] if 'dimensions' in band_info: - projection_info['shape'] = band_info['dimensions'][::-1] - projection_info['transform'] = rio.Affine(*band_info['crs_transform']) + proj_info['shape'] = tuple(band_info['dimensions'][::-1]) + proj_info['transform'] = rio.Affine(*band_info['crs_transform']) if ('origin' in band_info) and not np.any(np.isnan(band_info['origin'])): - projection_info['transform'] *= rio.Affine.translation(*band_info['origin']) - return projection_info + proj_info['transform'] *= rio.Affine.translation(*band_info['origin']) + + return proj_info @staticmethod def _get_min_dtype(ee_info: Dict) -> str: @@ -285,14 +311,14 @@ def get_min_int_dtype(band_info: List[Dict]) -> Optional[str]: for band_dict in band_info if band_dict['data_type']['precision'] == 'int' for minmax in (int(band_dict['data_type']['min']), int(band_dict['data_type']['max'])) - ] # yapf: disable + ] if len(int_minmax) == 0: return None min_value = np.nanmin(int_minmax) max_value = np.nanmax(int_minmax) - for dtype in supported_dtypes[:-2]: + for dtype in list(_nodata_vals.keys())[:-2]: if (min_value >= np.iinfo(dtype).min) and (max_value <= np.iinfo(dtype).max): return dtype return 'float64' @@ -314,8 +340,7 @@ def get_min_int_dtype(band_info: List[Dict]) -> Optional[str]: @staticmethod def _str_format_size(byte_size: float, units=['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']) -> str: - """ - Returns a human readable string representation of a given byte size. + """Returns a human readable string representation of a given byte size. Adapted from https://stackoverflow.com/questions/1094841/get-human-readable-version-of-file-size. """ if byte_size < 1000: @@ -335,6 +360,7 @@ def _convert_dtype(ee_image: ee.Image, dtype: str) -> ee.Image: int16=ee.Image.toInt16, uint32=ee.Image.toUint32, int32=ee.Image.toInt32, + # int64=ee.Image.toInt64, ) if dtype not in conv_dict: raise TypeError(f'Unsupported dtype: {dtype}') @@ -403,15 +429,16 @@ def _scale_offset(ee_image: ee.Image, band_properties: List[Dict]) -> ee.Image: def _prepare_for_export( self, crs: str = None, - crs_transform: Tuple[float] = None, + crs_transform: Tuple[float, ...] = None, shape: Tuple[int, int] = None, - region: Dict = None, + region: dict | ee.Geometry = None, scale: float = None, resampling: ResamplingMethod = _default_resampling, dtype: str = None, scale_offset: bool = False, bands: List[str] = None, ) -> 'BaseImage': + # TODO: don't repeat the argument docstrings on internal code """ Prepare the encapsulated image for export/download. Will reproject, resample, clip and convert the image according to the provided parameters. @@ -434,12 +461,12 @@ def _prepare_for_export( this transform. shape: tuple of int, optional (height, width) dimensions to export (pixels). - region : dict, geojson, ee.Geometry, optional - Region of interest (WGS84) to export. Defaults to the image footprint, when available. + region: dict, ee.Geometry, optional + Region to export as a GeoJSON dictionary or ``ee.Geometry``. Defaults to the image footprint, if available. scale : float, optional Pixel scale (m) to export to. Where image bands have different scales, all are re-projected to this scale. - Ignored if ``crs`` and ``crs_transform`` are specified. Defaults to use the minimum scale of - image bands if available. + Ignored if ``crs`` and ``crs_transform`` are specified. Defaults to the minimum scale of image bands + if available. resampling : ResamplingMethod, optional Resampling method - see :class:`~geedim.enums.ResamplingMethod` for available options. dtype: str, optional @@ -455,46 +482,45 @@ def _prepare_for_export( """ # TODO: allow setting a custom nodata value with ee.Image.unmask() - see #21 - # Check for parameter combination errors. - # This necessarily duplicates some of what is done in ee.Image.getDownloadURL, so that errors are raised - # before tile creation & download. - if (not crs or not region or not scale) and (not crs or not crs_transform or not shape): + # Prevent exporting images with no fixed projection unless arguments defining the export pixel grid and + # bounds are provided. While EE allows this, the default argument values are not sensible for most use cases. + if (not crs or not region or not (scale or shape)) and (not crs or not crs_transform or not shape): if not self.has_fixed_projection: - # if the image has no fixed projection, either crs, region, & scale; or crs, crs_transform and shape - # must be specified raise ValueError( - f'This image does not have a fixed projection, you need to specify a crs, region & scale; or a ' - f'crs, crs_transform & shape.' + f'This image does not have a fixed projection, you need to specify a crs, region & scale / shape; ' + f'or a crs, crs_transform & shape.' ) - if (not region and (not crs or not crs_transform or not shape)) and (not self.bounded): - # if the image has no footprint (i.e. it is 'unbounded'), either region; or crs, crs_transform and shape - # must be specified - raise ValueError( - f'This image is unbounded, you need to specify a region; or a crs, crs_transform and shape.' - ) - - if not scale and not shape and self.crs == 'EPSG:4326': - # If the image is in EPSG:4326, either scale (in meters); or shape must be specified. - # Note that ee.Image.prepare_for_export() expects a scale in meters, but if the image is EPSG:4326, - # the default scale is in degrees. - raise ValueError(f'This image is in EPSG:4326, you need to specify a scale (in meters); or a shape.') + # Prevent exporting unbounded images without arguments defining the export bounds. EE also prevents this (for + # the full image) in ee.Image.getDownloadUrl(). + if (not region and (not crs_transform or not shape)) and (not self.bounded): + raise ValueError(f'This image is unbounded, you need to specify a region; or a crs_transform and shape.') if scale and shape: - # This error is raised in later calls to ee.Image.getInfo(), but is neater to raise here first raise ValueError('You can specify one of scale or shape, but not both.') if bands: + # If one or more specified bands don't exist, raise an error band_diff = set(bands).difference([band_prop['name'] for band_prop in self.band_properties]) if len(band_diff) > 0: - # If one or more specified bands don't exist, raise an error raise ValueError(f'The band(s) {list(band_diff)} don\'t exist.') # Create a new BaseImage if band subset is specified. This is done here so that crs, scale etc - # parameters used below will have the values specific to bands. + # parameters used below will have values specific to bands. exp_image = BaseImage(self.ee_image.select(bands)) if bands else self - # perform image scale/offset, dtype and resampling operations + # configure the export spatial parameters + if not crs_transform and not shape: + # Only pass crs to ee.Image.prepare_for_export() when it is different from the source. Passing same crs + # as source does not maintain the source pixel grid. + crs = crs if crs != exp_image.crs else None + # Default scale to the scale in meters of the minimum scale band. + scale = scale or exp_image.scale + else: + # crs argument is required with crs_transform + crs = crs or exp_image.crs + + # apply export scale/offset, dtype and resampling ee_image = exp_image.ee_image if scale_offset: ee_image = BaseImage._scale_offset(ee_image, exp_image.band_properties) @@ -510,55 +536,16 @@ def _prepare_for_export( 'you can resample the component images used to create the composite.' ) ee_image = utils.resample(ee_image, resampling) - # TODO: only do this if there is a change? Or do we need to standardise the bands? - ee_image = BaseImage._convert_dtype(ee_image, dtype=dtype or im_dtype) - # configure the export parameter values - crs = crs or exp_image.crs - if not crs_transform and not shape: - # if none of crs_transform, shape, region or scale are specified, then set region and scale to defaults - region = region or exp_image.footprint - scale = scale or exp_image.scale + ee_image = BaseImage._convert_dtype(ee_image, dtype=dtype or im_dtype) - if (crs == exp_image.crs) and (scale == exp_image.scale): - # if crs_transform & shape are not already specified, and crs & scale match this image's crs & scale, - # then set crs_transform and shape to export on export image's pixel grid - if region == exp_image.footprint: - crs_transform = exp_image.transform - shape = exp_image.shape - else: - # find a crs_transform and shape that encompasses region - if isinstance(region, ee.Geometry): - region = region.getInfo() - region_crs = region['crs']['properties']['name'] if 'crs' in region else 'EPSG:4326' - region_bounds = warp.transform_bounds(region_crs, utils.rio_crs(crs), *features.bounds(region)) - region_win = windows.from_bounds(*region_bounds, transform=exp_image.transform) - region_win = utils.expand_window_to_grid(region_win) - crs_transform = exp_image.transform * rio.Affine.translation(region_win.col_off, region_win.row_off) - shape = (region_win.height, region_win.width) - - # prevent exporting with region & scale now that crs_transform and shape are set - region = None - scale = None - - # create the export parameter dict + # apply export spatial parameters crs_transform = crs_transform[:6] if crs_transform else None dimensions = shape[::-1] if shape else None - export_kwargs = dict( - crs=crs, - crs_transform=crs_transform, - dimensions=dimensions, - region=region, - scale=scale, - bands=bands, - fileFormat='GeoTIFF', - filePerBand=False, - ) - # drop items with values==None + export_kwargs = dict(crs=crs, crs_transform=crs_transform, dimensions=dimensions, region=region, scale=scale) export_kwargs = {k: v for k, v in export_kwargs.items() if v is not None} - logger.debug(f'ee.Image.prepare_for_export() params: {export_kwargs}') - # TODO: prepare_for_export does not seem to be used in ee internals any more ee_image, _ = ee_image.prepare_for_export(export_kwargs) + return BaseImage(ee_image) def _prepare_for_download(self, set_nodata: bool = True, **kwargs) -> Tuple['BaseImage', Dict]: @@ -571,17 +558,7 @@ def _prepare_for_download(self, set_nodata: bool = True, **kwargs) -> Tuple['Bas # resample, convert, clip and reproject image according to download params exp_image = self._prepare_for_export(**kwargs) # see float nodata workaround note in Tile.download(...) - nodata_dict = dict( - float32=self._float_nodata, - float64=self._float_nodata, - uint8=0, - int8=np.iinfo('int8').min, - uint16=0, - int16=np.iinfo('int16').min, - uint32=0, - int32=np.iinfo('int32').min, - ) # yapf: disable - nodata = nodata_dict[exp_image.dtype] if set_nodata else None + nodata = _nodata_vals[exp_image.dtype] if set_nodata else None profile = dict( driver='GTiff', dtype=exp_image.dtype, @@ -603,7 +580,7 @@ def _prepare_for_download(self, set_nodata: bool = True, **kwargs) -> Tuple['Bas def _get_tile_shape( self, max_tile_size: Optional[float] = None, max_tile_dim: Optional[int] = None - ) -> Tuple[Tuple, int]: # yapf: disable + ) -> Tuple[Tuple, int]: """ Return a tile shape and number of tiles, such that the tile shape satisfies GEE download limits, and is 'square-ish'. @@ -650,10 +627,8 @@ def _get_tile_shape( def _build_overviews(self, filename: Union[str, pathlib.Path], max_num_levels: int = 8, min_ovw_pixels: int = 256): """Build internal overviews, downsampled by successive powers of 2, for a given filename.""" - # TODO: revisit multi-threaded overviews on gdal update - # build overviews in a single threaded environment (currently gdal reports errors when building overviews - # with GDAL_NUM_THREADS='ALL_CPUs' - see https://github.com/OSGeo/gdal/issues/7921) - env_dict = dict(GTIFF_FORCE_RGBA=False, COMPRESS_OVERVIEW='DEFLATE') + # build overviews + env_dict = dict(GTIFF_FORCE_RGBA=False, COMPRESS_OVERVIEW='DEFLATE', GDAL_NUM_THREADS='ALL_CPUS') if self.size >= 4e9: env_dict.update(BIGTIFF_OVERVIEW=True) @@ -669,6 +644,7 @@ def _build_overviews(self, filename: Union[str, pathlib.Path], max_num_levels: i def _write_metadata(self, dataset: rio.io.DatasetWriter): """Write Earth Engine and STAC metadata to an open rasterio dataset.""" + # TODO: Xee with rioxarray writes an html description - can we do the same? if dataset.closed: raise IOError('Image dataset is closed') @@ -804,8 +780,8 @@ def export( this transform. shape: tuple of int, optional (height, width) dimensions to export (pixels). - region : dict, geojson, ee.Geometry, optional - Region of interest (WGS84) to export. Defaults to the image footprint, when available. + region: dict, ee.Geometry, optional + Region to export as a GeoJSON dictionary or ``ee.Geometry``. Defaults to the image footprint, if available. scale : float, optional Pixel scale (m) to export to. Where image bands have different scales, all are re-projected to this scale. Ignored if ``crs`` and ``crs_transform`` are specified. Defaults to use the minimum scale of @@ -910,13 +886,13 @@ def download( WKT or EPSG specification of CRS to export to. Where image bands have different CRSs, all are re-projected to this CRS. Defaults to use the CRS of the minimum scale band if available. crs_transform: tuple of float, list of float, rio.Affine, optional - List of 6 numbers specifying an affine transform in the specified CRS. In row-major order: + List of 6 numbers specifying an affine transform in the given CRS. In row-major order: [xScale, xShearing, xTranslation, yShearing, yScale, yTranslation]. All bands are re-projected to this transform. shape: tuple of int, optional (height, width) dimensions to export (pixels). - region : dict, geojson, ee.Geometry, optional - Region of interest (WGS84) to export. Defaults to the image footprint, when available. + region: dict, ee.Geometry, optional + Region to export as a GeoJSON dictionary or ``ee.Geometry``. Defaults to the image footprint, if available. scale : float, optional Pixel scale (m) to export to. Where image bands have different scales, all are re-projected to this scale. Ignored if ``crs`` and ``crs_transform`` are specified. Defaults to use the minimum scale of @@ -931,7 +907,7 @@ def download( bands: list of str, optional List of band names to download. """ - + # TODO: allow bands to be band indexes too max_threads = num_threads or min(32, (os.cpu_count() or 1) + 4) out_lock = threading.Lock() filename = pathlib.Path(filename) @@ -976,7 +952,6 @@ def download( ) session = utils.retry_session() - warnings.filterwarnings('ignore', category=TqdmWarning) # redirect logging through tqdm redir_tqdm = logging_redirect_tqdm([logging.getLogger(__package__)], tqdm_class=type(bar)) env = rio.Env(GDAL_NUM_THREADS='ALL_CPUs', GTIFF_FORCE_RGBA=False) diff --git a/geedim/enums.py b/geedim/enums.py index 71e0288..e1f8ebb 100644 --- a/geedim/enums.py +++ b/geedim/enums.py @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. """ + from enum import Enum @@ -21,6 +22,7 @@ class CompositeMethod(str, Enum): Enumeration for the compositing method, i.e. the method for finding a composite pixel from the stack of corresponding input image pixels. """ + q_mosaic = 'q-mosaic' """ Use the unmasked pixel with the highest cloud distance (distance to nearest cloud). Where more than one pixel has @@ -46,18 +48,53 @@ class CompositeMethod(str, Enum): mean = 'mean' """ Use the mean of the unmasked pixels. """ + def __repr__(self): + return self._name_ + + def __str__(self): + return self._name_ + class CloudMaskMethod(str, Enum): - """ Enumeration for the Sentinel-2 cloud masking method. """ + """Enumeration for the Sentinel-2 cloud masking method.""" + cloud_prob = 'cloud-prob' - """ Threshold the corresponding image from the Sentinel-2 cloud probability collection. """ + """Threshold the Sentinel-2 Cloud Probability.""" qa = 'qa' - """ Use the `QA60` quality assessment band. """ + """Bit mask the `QA60` quality assessment band.""" + + cloud_score = 'cloud-score' + """Threshold the Sentinel-2 Cloud Score+.""" + + def __repr__(self): + return self._name_ + + def __str__(self): + return self._name_ + + +class CloudScoreBand(str, Enum): + """Enumeration for the Sentinel-2 Cloud Score+ band used with the :attr:`~CloudMaskMethod.cloud_score` cloud + masking method. + """ + + cs = 'cs' + """Pixel quality score based on spectral distance from a (theoretical) clear reference.""" + + cs_cdf = 'cs_cdf' + """Value of the cumulative distribution function of possible cs values for the estimated cs value.""" + + def __repr__(self): + return self._name_ + + def __str__(self): + return self._name_ class ResamplingMethod(str, Enum): - """ Enumeration for the resampling method. """ + """Enumeration for the resampling method.""" + near = 'near' """ Nearest neighbour. """ @@ -70,9 +107,16 @@ class ResamplingMethod(str, Enum): average = 'average' """ Average (recommended for downsampling). """ + def __repr__(self): + return self._name_ + + def __str__(self): + return self._name_ + class ExportType(str, Enum): - """ Enumeration for the export type. """ + """Enumeration for the export type.""" + drive = 'drive' """ Export to Google Drive. """ @@ -82,9 +126,16 @@ class ExportType(str, Enum): cloud = 'cloud' """ Export to Google Cloud Storage. """ + def __repr__(self): + return self._name_ + + def __str__(self): + return self._name_ + class SpectralDistanceMetric(str, Enum): - """ Enumeration for the spectral distance metric. """ + """Enumeration for the spectral distance metric.""" + sam = 'sam' """ Spectral angle mapper. """ @@ -97,3 +148,8 @@ class SpectralDistanceMetric(str, Enum): emd = 'emd' """ Earth movers distance. """ + def __repr__(self): + return self._name_ + + def __str__(self): + return self._name_ diff --git a/geedim/errors.py b/geedim/errors.py index 36c52db..04fba90 100644 --- a/geedim/errors.py +++ b/geedim/errors.py @@ -29,3 +29,7 @@ class InputImageError(GeedimError): class TileError(GeedimError): """Raised when there is a problem downloading an image tile.""" + + +class GeedimWarning(UserWarning): + """Base warning class.""" diff --git a/geedim/mask.py b/geedim/mask.py index 20344e7..b78ea80 100644 --- a/geedim/mask.py +++ b/geedim/mask.py @@ -14,14 +14,16 @@ limitations under the License. """ +from __future__ import annotations + import logging -from typing import Dict +import warnings import ee import geedim.schema from geedim.download import BaseImage -from geedim.enums import CloudMaskMethod +from geedim.enums import CloudMaskMethod, CloudScoreBand from geedim.utils import get_projection, split_id logger = logging.getLogger(__name__) @@ -32,7 +34,7 @@ class MaskedImage(BaseImage): _default_mask = False - def __init__(self, ee_image: ee.Image, mask: bool = _default_mask, region: dict = None, **kwargs): + def __init__(self, ee_image: ee.Image, mask: bool = _default_mask, region: dict | ee.Geometry = None, **kwargs): """ A class for describing, masking and downloading an Earth Engine image. @@ -42,9 +44,9 @@ def __init__(self, ee_image: ee.Image, mask: bool = _default_mask, region: dict Earth Engine image to encapsulate. mask: bool, optional Whether to mask the image. - region: dict, optional - A geojson polygon inside of which to find statistics for the image. These values are stored in the image - properties. If None, statistics are not found (the default). + region: dict, ee.Geometry, optional + Region in which to find statistics for the image, as a GeoJSON dictionary or ``ee.Geometry``. Statistics + are stored in the image properties. If None, statistics are not found (the default). **kwargs Cloud/shadow masking parameters - see below: @@ -52,7 +54,8 @@ def __init__(self, ee_image: ee.Image, mask: bool = _default_mask, region: dict Whether to mask cirrus clouds. Valid for Landsat 8-9 images, and for Sentinel-2 images with the `qa` ``mask_method``. mask_shadows: bool, optional - Whether to mask cloud shadows. + Whether to mask cloud shadows. Valid for Landsat images, and for Sentinel-2 images with + the `qa` or `cloud-prob` ``mask_method``. mask_method: CloudMaskMethod, str, optional Method used to mask clouds. Valid for Sentinel-2 images. See :class:`~geedim.enums.CloudMaskMethod` for details. @@ -60,18 +63,25 @@ def __init__(self, ee_image: ee.Image, mask: bool = _default_mask, region: dict Cloud probability threshold (%). Valid for Sentinel-2 images with the `cloud-prob` ``mask-method``. dark: float, optional NIR threshold [0-1]. NIR values below this threshold are potential cloud shadows. Valid for Sentinel-2 - images. + images with the `qa` or `cloud-prob` ``mask_method``. shadow_dist: int, optional - Maximum distance (m) to look for cloud shadows from cloud edges. Valid for Sentinel-2 images. + Maximum distance (m) to look for cloud shadows from cloud edges. Valid for Sentinel-2 images with the `qa` + or `cloud-prob` ``mask_method``. buffer: int, optional - Distance (m) to dilate cloud/shadow. Valid for Sentinel-2 images. + Distance (m) to dilate cloud/shadow. Valid for Sentinel-2 images with the `qa` or `cloud-prob` + ``mask_method``. cdi_thresh: float, optional Cloud Displacement Index threshold. Values below this threshold are considered potential clouds. - If this parameter is not specified (=None), the index is not used. Valid for Sentinel-2 images. - See https://developers.google.com/earth-engine/apidocs/ee-algorithms-sentinel2-cdi for details. + If this parameter is not specified (=None), the index is not used. Valid for Sentinel-2 images with the + `qa` or `cloud-prob` ``mask_method``. See + https://developers.google.com/earth-engine/apidocs/ee-algorithms-sentinel2-cdi for details. max_cloud_dist: int, optional Maximum distance (m) to look for clouds when forming the 'cloud distance' band. Valid for Sentinel-2 images. + score: float, optional + Cloud Score+ threshold. Valid for Sentinel-2 images with the `cloud-score` ``mask-method``. + cs_band: CloudScoreBand, str, optional + Cloud Score+ band to threshold. Valid for Sentinel-2 images with the `cloud-score` ``mask-method``. """ BaseImage.__init__(self, ee_image) self._ee_projection = None @@ -137,15 +147,16 @@ def _add_aux_bands(self, **kwargs): ee.Algorithms.If(overwrite, self.ee_image.addBands(aux_image, overwrite=True), self.ee_image) ) - def _set_region_stats(self, region: Dict = None, scale: float = None): + def _set_region_stats(self, region: dict | ee.Geometry = None, scale: float = None): """ Set FILL_PORTION and CLOUDLESS_PORTION on the encapsulated image for the specified region. Derived classes should override this method and set CLOUDLESS_PORTION, and/or other statistics they support. Parameters ---------- - region : dict, ee.Geometry, optional - Region inside of which to find statistics. If not specified, the image footprint is used. + region: dict, ee.Geometry, optional + Region in which to find statistics for the image, as a GeoJSON dictionary or ``ee.Geometry``. If not + specified, the image footprint is used. scale: float, optional Re-project to this scale when finding statistics. Defaults to the scale of :attr:`~MaskedImage._ee_proj`. Should be provided if the encapsulated image is a composite / without a @@ -210,14 +221,15 @@ def _cloud_dist(self, cloudless_mask: ee.Image = None, max_cloud_dist: float = 5 # download. return cloud_dist.toUint16().rename('CLOUD_DIST') - def _set_region_stats(self, region: Dict = None, scale: float = None): + def _set_region_stats(self, region: dict | ee.Geometry = None, scale: float = None): """ Set FILL_PORTION and CLOUDLESS_PORTION on the encapsulated image for the specified region. Parameters ---------- - region : dict, ee.Geometry, optional - Region inside of which to find statistics. If not specified, the image footprint is used. + region: dict, ee.Geometry, optional + Region in which to find statistics for the image, as a GeoJSON dictionary or ``ee.Geometry``. If not + specified, the image footprint is used. scale: float, optional Re-project to this scale when finding statistics. Defaults to the scale of :attr:`~MaskedImage._ee_proj`. Should be provided if the encapsulated image is a composite / without a @@ -340,124 +352,59 @@ def _aux_image( s2_toa: bool = False, mask_cirrus: bool = True, mask_shadows: bool = True, - mask_method: CloudMaskMethod = CloudMaskMethod.cloud_prob, + mask_method: CloudMaskMethod = CloudMaskMethod.cloud_score, prob: float = 60, dark: float = 0.15, shadow_dist: int = 1000, buffer: int = 50, cdi_thresh: float = None, max_cloud_dist: int = 5000, + score: float = 0.6, + cs_band: CloudScoreBand = CloudScoreBand.cs, ) -> ee.Image: - """ - Derive cloud, shadow and validity masks for the encapsulated image. - - Adapted from https://github.com/r-earthengine/ee_extra, under Apache 2.0 license. - - Parameters - ---------- - s2_toa : bool, optional - S2 TOA/SR collection. Set to True if this image is from COPERNICUS/S2, or False if it is from - COPERNICUS/S2_SR. - mask_cirrus: bool, optional - Whether to mask cirrus clouds. Valid for Landsat 8-9 images, and for Sentinel-2 images with - the `qa` ``mask_method``. - mask_shadows: bool, optional - Whether to mask cloud shadows. - mask_method: CloudMaskMethod, str, optional - Method used to mask clouds. Valid for Sentinel-2 images. See :class:`~geedim.enums.CloudMaskMethod` for - details. - prob: float, optional - Cloud probability threshold (%). Valid for Sentinel-2 images with the `cloud-prob` ``mask-method``. - dark: float, optional - NIR threshold [0-1]. NIR values below this threshold are potential cloud shadows. Valid for Sentinel-2 - images. - shadow_dist: int, optional - Maximum distance (m) to look for cloud shadows from cloud edges. Valid for Sentinel-2 images. - buffer: int, optional - Distance (m) to dilate cloud/shadow. Valid for Sentinel-2 images. - cdi_thresh: float, optional - Cloud Displacement Index threshold. Values below this threshold are considered potential clouds. - If this parameter is not specified (=None), the index is not used. Valid for Sentinel-2 images. - See https://developers.google.com/earth-engine/apidocs/ee-algorithms-sentinel2-cdi for details. - max_cloud_dist: int, optional - Maximum distance (m) to look for clouds when forming the 'cloud distance' band. Valid for - Sentinel-2 images. + """Derive cloud, shadow and validity masks for the encapsulated image. - Returns - ------- - ee.Image - An Earth Engine image containing *_MASK and CLOUD_DIST bands. + Parts adapted from https://github.com/r-earthengine/ee_extra, under Apache 2.0 license. """ - # TODO: add warning about post Feb 2022 validity when qa method is used mask_method = CloudMaskMethod(mask_method) - - def get_cloud_prob(ee_im): - """Get the cloud probability image from COPERNICUS/S2_CLOUD_PROBABILITY that corresponds to `ee_im`, if it - exists. Otherwise, get a 100% probability. + if mask_method is not CloudMaskMethod.cloud_score: + warnings.warn( + f"The '{mask_method}' mask method is deprecated and will be removed in a future release. Please " + f"switch to 'cloud-score'.", + category=FutureWarning, + ) + + def match_image(ee_image: ee.Image, collection: str, band: str, match_prop: str = 'system:index') -> ee.Image: + """Return an image from ``collection`` matching ``ee_image`` with single ``band`` selected, or a fully + masked image if no match is found. """ - # default masked cloud probability image - default_cloud_prob = ee.Image().updateMask(0) - - # get the cloud probability image if it exists, otherwise revert to default_cloud_prob - # (ee.Image.linkCollection() has a similar functionality but the masked image it returns when cloud - # probability doesn't exist is 0 rather than nodata on download) - filt = ee.Filter.eq('system:index', ee_im.get('system:index')) - cloud_prob = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY').filter(filt).first() - cloud_prob = ee.Image(ee.List([cloud_prob, default_cloud_prob]).reduce(ee.Reducer.firstNonNull())) - - return cloud_prob.rename('CLOUD_PROB') - - def get_cloud_mask(ee_im, cloud_prob=None): - """Get the cloud mask for ee_im""" - if mask_method == CloudMaskMethod.cloud_prob: - if not cloud_prob: - cloud_prob = get_cloud_prob(ee_im) - cloud_mask = cloud_prob.gte(prob) - else: - # mask QA60 if it is post Feb 2022 to invalidate the cloud mask (post Feb 2022 QA60 is no longer - # populated and may be masked / transparent or zero). - qa_valid = ee.Number(ee_im.date().difference(ee.Date('2022-02-01'), 'days').lt(0)) - qa = ee_im.select('QA60').updateMask(qa_valid) + # default fully masked image + default = ee.Image().updateMask(0) + default = default.rename(band) - cloud_mask = qa.bitwiseAnd(1 << 10).neq(0) - if mask_cirrus: - cloud_mask = cloud_mask.Or(qa.bitwiseAnd(1 << 11).neq(0)) + # find matching image + filt = ee.Filter.eq(match_prop, ee_image.get(match_prop)) + match = ee.ImageCollection(collection).filter(filt).first() - return cloud_mask.rename('CLOUD_MASK') + # revert to default if no match found + match = ee.Image(ee.List([match, default]).reduce(ee.Reducer.firstNonNull())) + return match.select(band) - def get_cdi_cloud_mask(ee_im): - """ - Get a CDI cloud mask for ee_im. - See https://developers.google.com/earth-engine/apidocs/ee-algorithms-sentinel2-cdi for more detail. - """ - if s2_toa: - s2_toa_image = ee_im - else: - # get the Sentinel-2 TOA image that corresponds to ee_im - idx = ee_im.get('system:index') - s2_toa_image = ee.ImageCollection('COPERNICUS/S2').filter(ee.Filter.eq('system:index', idx)).first() - cdi_image = ee.Algorithms.Sentinel2.CDI(s2_toa_image) - return cdi_image.lt(cdi_thresh).rename('CDI_CLOUD_MASK') + def cloud_cast_shadow_mask(ee_image: ee.Image, cloud_mask: ee.Image) -> ee.Image: + """Create & return a shadow mask for ``ee_image`` by projecting shadows from ``cloud_mask``. - def get_shadow_mask(ee_im, cloud_mask): - """Given a cloud mask, get a shadow mask for ee_im.""" - dark_mask = ee_im.select('B8').lt(dark * 1e4) + Adapted from https://developers.google.com/earth-engine/tutorials/community/sentinel-2-s2cloudless. + """ + dark_mask = ee_image.select('B8').lt(dark * 1e4) if not s2_toa: # exclude water - dark_mask = ee_im.select('SCL').neq(6).And(dark_mask) - - # Note: - # S2 MEAN_SOLAR_AZIMUTH_ANGLE (SAA) appears to be measured clockwise with 0 at N (i.e. shadow goes in the - # opposite direction), directionalDistanceTransform() angle appears to be measured clockwise with 0 at W. - # So we need to add/subtract 180 to SAA to get shadow angle in S2 convention, then add 90 to get - # directionalDistanceTransform() convention i.e. we need to add -180 + 90 = -90 to SAA. This is not - # the same as in the EE tutorial which is 90-SAA - # (https://developers.google.com/earth-engine/tutorials/community/sentinel-2-s2cloudless). - shadow_azimuth = ee.Number(-90).add(ee.Number(ee_im.get('MEAN_SOLAR_AZIMUTH_ANGLE'))) - proj_pixels = ee.Number(shadow_dist).divide(self._ee_proj.nominalScale()).round() + dark_mask = ee_image.select('SCL').neq(6).And(dark_mask) - # Project the cloud mask in the direction of the shadows it will cast (can project the mask into invalid - # areas). + # Find shadow direction. Note that the angle convention depends on the reproject args below. + shadow_azimuth = ee.Number(90).subtract(ee.Number(ee_image.get('MEAN_SOLAR_AZIMUTH_ANGLE'))) + + # Project the cloud mask in the shadow direction (can project the mask into invalid areas). + proj_pixels = ee.Number(shadow_dist).divide(self._ee_proj.nominalScale()).round() cloud_cast_proj = cloud_mask.directionalDistanceTransform(shadow_azimuth, proj_pixels).select('distance') # Reproject to force calculation at the correct scale. @@ -471,51 +418,104 @@ def get_shadow_mask(ee_im, cloud_mask): return shadow_mask.rename('SHADOW_MASK') - # combine the various masks - ee_image = self.ee_image - cloud_prob = get_cloud_prob(ee_image) if mask_method == CloudMaskMethod.cloud_prob else None - cloud_mask = get_cloud_mask(ee_image, cloud_prob=cloud_prob) + def qa_cloud_mask(ee_image: ee.Image) -> ee.Image: + """Create & return a cloud mask for ``ee_image`` using the QA60 band.""" + # mask QA60 if it is between Feb 2022 - Feb 2024 to invalidate the cloud mask (QA* bands are not populated + # over this period and may be masked / transparent or zero). + qa_valid = ( + ee_image.date() + .difference(ee.Date('2022-02-01'), 'days') + .lt(0) + .Or(ee_image.date().difference(ee.Date('2024-02-01'), 'days').gt(0)) + ) + qa = ee_image.select('QA60').updateMask(qa_valid) + + cloud_mask = qa.bitwiseAnd(1 << 10).neq(0) + if mask_cirrus: + cloud_mask = cloud_mask.Or(qa.bitwiseAnd(1 << 11).neq(0)) - if cdi_thresh is not None: - cloud_mask = cloud_mask.And(get_cdi_cloud_mask(ee_image)) - if mask_shadows: - shadow_mask = get_shadow_mask(ee_image, cloud_mask) - cloud_shadow_mask = cloud_mask.Or(shadow_mask) - else: - cloud_shadow_mask = cloud_mask + return cloud_mask.rename('CLOUD_MASK') - # do a morphological opening type operation that removes small (20m) blobs from the mask and then dilates - cloud_shadow_mask = cloud_shadow_mask.focal_min(20, units='meters').focal_max(buffer, units='meters') + def cloud_prob_cloud_mask(ee_image: ee.Image) -> tuple[ee.Image, ee.Image]: + """Return the cloud probability thresholded cloud mask, and cloud probability image for ``ee_image``.""" + cloud_prob = match_image(ee_image, 'COPERNICUS/S2_CLOUD_PROBABILITY', 'probability') + cloud_mask = cloud_prob.gte(prob) + return cloud_mask.rename('CLOUD_MASK'), cloud_prob.rename('CLOUD_PROB') + + def cloud_score_cloud_shadow_mask(ee_image: ee.Image) -> tuple[ee.Image, ee.Image]: + """Return the cloud score thresholded cloud mask, and cloud score image for ``ee_image``.""" + cloud_score = match_image(ee_image, 'GOOGLE/CLOUD_SCORE_PLUS/V1/S2_HARMONIZED', cs_band.name) + cloud_shadow_mask = cloud_score.lte(score) + return cloud_shadow_mask.rename('CLOUD_SHADOW_MASK'), cloud_score.rename('CLOUD_SCORE') + + def cdi_cloud_mask(ee_image: ee.Image) -> ee.Image: + """Return the CDI cloud mask for ``ee_image``. + See https://developers.google.com/earth-engine/apidocs/ee-algorithms-sentinel2-cdi for detail. + """ + if s2_toa: + s2_toa_image = ee_image + else: + # get the Sentinel-2 TOA image that corresponds to ``ee_image`` + idx = ee_image.get('system:index') + s2_toa_image = ee.ImageCollection('COPERNICUS/S2').filter(ee.Filter.eq('system:index', idx)).first() + cdi_image = ee.Algorithms.Sentinel2.CDI(s2_toa_image) + return cdi_image.lt(cdi_thresh).rename('CDI_CLOUD_MASK') + + def cloud_shadow_masks(ee_image: ee.Image) -> dict[str, ee.Image]: + """Return a dictionary of cloud/shadow masks & related images for ``ee_image``.""" + aux_bands = {} + if mask_method is CloudMaskMethod.cloud_score: + aux_bands['cloud_shadow'], aux_bands['score'] = cloud_score_cloud_shadow_mask(ee_image) + else: + if mask_method is CloudMaskMethod.qa: + aux_bands['cloud'] = qa_cloud_mask(ee_image) + else: + aux_bands['cloud'], aux_bands['prob'] = cloud_prob_cloud_mask(ee_image) + + if cdi_thresh is not None: + aux_bands['cloud'] = aux_bands['cloud'].And(cdi_cloud_mask(ee_image)) + + aux_bands['shadow'] = cloud_cast_shadow_mask(ee_image, aux_bands['cloud']) + + if mask_shadows: + aux_bands['cloud_shadow'] = aux_bands['cloud'].Or(aux_bands['shadow']) + else: + aux_bands['cloud_shadow'] = aux_bands['cloud'] + aux_bands.pop('shadow', None) + + # do a morphological opening that removes small (20m) blobs from the mask and then dilates + aux_bands['cloud_shadow'] = ( + aux_bands['cloud_shadow'].focal_min(20, units='meters').focal_max(buffer, units='meters') + ) + return aux_bands + + # get cloud/shadow etc bands + aux_bands = cloud_shadow_masks(self.ee_image) # derive a fill mask from the Earth Engine mask for the surface reflectance bands - fill_mask = ee_image.select('B.*').mask().reduce(ee.Reducer.allNonZero()) + aux_bands['fill'] = self.ee_image.select('B.*').mask().reduce(ee.Reducer.allNonZero()) - # clip this mask to the image footprint (without this step we get memory limit errors on download) - fill_mask = fill_mask.clip(ee_image.geometry()).rename('FILL_MASK') + # clip fill mask to the image footprint (without this step we get memory limit errors on download) + aux_bands['fill'] = aux_bands['fill'].clip(self.ee_image.geometry()).rename('FILL_MASK') - # combine all masks into cloudless_mask - cloudless_mask = (cloud_shadow_mask.Not()).And(fill_mask).rename('CLOUDLESS_MASK') + # combine masks into cloudless_mask + aux_bands['cloudless'] = (aux_bands['cloud_shadow'].Not()).And(aux_bands['fill']).rename('CLOUDLESS_MASK') + aux_bands.pop('cloud_shadow') # construct and return the auxiliary image - aux_bands = [fill_mask, cloud_mask, cloudless_mask] - if mask_shadows: - aux_bands.append(shadow_mask) - if mask_method == CloudMaskMethod.cloud_prob: - aux_bands.append(cloud_prob) - - cloud_dist = self._cloud_dist(cloudless_mask=cloudless_mask, max_cloud_dist=max_cloud_dist) - return ee.Image(aux_bands + [cloud_dist]) + aux_bands['dist'] = self._cloud_dist(cloudless_mask=aux_bands['cloudless'], max_cloud_dist=max_cloud_dist) + return ee.Image(list(aux_bands.values())) class Sentinel2SrClImage(Sentinel2ClImage): - """Class for cloud/shadow masking of Sentinel-2 SR (COPERNICUS/S2_SR) images.""" + """Class for cloud/shadow masking of Sentinel-2 SR (COPERNICUS/S2_SR & COPERNICUS/S2_SR_HARMONIZED) images.""" def _aux_image(self, s2_toa: bool = False, **kwargs) -> ee.Image: return Sentinel2ClImage._aux_image(self, s2_toa=False, **kwargs) class Sentinel2ToaClImage(Sentinel2ClImage): - """Class for cloud/shadow masking of Sentinel-2 TOA (COPERNICUS/S2) images.""" + """Class for cloud/shadow masking of Sentinel-2 TOA (COPERNICUS/S2 & COPERNICUS/S2_HARMONIZED) images.""" def _aux_image(self, s2_toa: bool = False, **kwargs) -> ee.Image: return Sentinel2ClImage._aux_image(self, s2_toa=True, **kwargs) diff --git a/geedim/schema.py b/geedim/schema.py index d66c9c7..325bcad 100644 --- a/geedim/schema.py +++ b/geedim/schema.py @@ -13,12 +13,14 @@ See the License for the specific language governing permissions and limitations under the License. """ + +from textwrap import wrap + # schema definitions for MaskedImage.from_id(), geedim <-> EE collection names, and search properties from tabulate import tabulate -from textwrap import wrap + import geedim.mask -# yapf: disable default_prop_schema = { 'system:id': {'abbrev': 'ID', 'description': 'Earth Engine image id'}, 'system:time_start': {'abbrev': 'DATE', 'description': 'Image capture date/time (UTC)'}, @@ -29,23 +31,29 @@ 'system:id': {'abbrev': 'ID', 'description': 'Earth Engine image id'}, 'system:time_start': {'abbrev': 'DATE', 'description': 'Image capture date/time (UTC)'}, 'FILL_PORTION': {'abbrev': 'FILL', 'description': 'Portion of region pixels that are valid (%)'}, - 'CLOUDLESS_PORTION': {'abbrev': 'CLOUDLESS', 'description': 'Portion of filled pixels that are cloud/shadow free (%)'}, + 'CLOUDLESS_PORTION': { + 'abbrev': 'CLOUDLESS', + 'description': 'Portion of filled pixels that are cloud/shadow free (%)', + }, 'GEOMETRIC_RMSE_MODEL': {'abbrev': 'GRMSE', 'description': 'Orthorectification RMSE (m)'}, 'SUN_AZIMUTH': {'abbrev': 'SAA', 'description': 'Solar azimuth angle (deg)'}, - 'SUN_ELEVATION': {'abbrev': 'SEA', 'description': 'Solar elevation angle (deg)'} + 'SUN_ELEVATION': {'abbrev': 'SEA', 'description': 'Solar elevation angle (deg)'}, } s2_prop_schema = { 'system:id': {'abbrev': 'ID', 'description': 'Earth Engine image id'}, 'system:time_start': {'abbrev': 'DATE', 'description': 'Image capture date/time (UTC)'}, 'FILL_PORTION': {'abbrev': 'FILL', 'description': 'Portion of region pixels that are valid (%)'}, - 'CLOUDLESS_PORTION': {'abbrev': 'CLOUDLESS', 'description': 'Portion of filled pixels that are cloud/shadow free (%)'}, + 'CLOUDLESS_PORTION': { + 'abbrev': 'CLOUDLESS', + 'description': 'Portion of filled pixels that are cloud/shadow free (%)', + }, 'RADIOMETRIC_QUALITY': {'abbrev': 'RADQ', 'description': 'Radiometric quality check'}, 'GEOMETRIC_QUALITY': {'abbrev': 'GEOMQ', 'description': 'Geometric quality check'}, 'MEAN_SOLAR_AZIMUTH_ANGLE': {'abbrev': 'SAA', 'description': 'Solar azimuth angle (deg)'}, 'MEAN_SOLAR_ZENITH_ANGLE': {'abbrev': 'SZA', 'description': 'Solar zenith angle (deg)'}, 'MEAN_INCIDENCE_AZIMUTH_ANGLE_B1': {'abbrev': 'VAA', 'description': 'View (B1) azimuth angle (deg)'}, - 'MEAN_INCIDENCE_ZENITH_ANGLE_B1': {'abbrev': 'VZA', 'description': 'View (B1) zenith angle (deg)'} + 'MEAN_INCIDENCE_ZENITH_ANGLE_B1': {'abbrev': 'VZA', 'description': 'View (B1) zenith angle (deg)'}, } collection_schema = { @@ -54,73 +62,73 @@ 'prop_schema': landsat_prop_schema, 'image_type': geedim.mask.LandsatImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LT04_C02_T1_L2', - 'description': 'Landsat 4, collection 2, tier 1, level 2 surface reflectance.' + 'description': 'Landsat 4, collection 2, tier 1, level 2 surface reflectance.', }, 'LANDSAT/LT05/C02/T1_L2': { 'gd_coll_name': 'l5-c2-l2', 'prop_schema': landsat_prop_schema, 'image_type': geedim.mask.LandsatImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LT05_C02_T1_L2', - 'description': 'Landsat 5, collection 2, tier 1, level 2 surface reflectance.' + 'description': 'Landsat 5, collection 2, tier 1, level 2 surface reflectance.', }, 'LANDSAT/LE07/C02/T1_L2': { 'gd_coll_name': 'l7-c2-l2', 'prop_schema': landsat_prop_schema, 'image_type': geedim.mask.LandsatImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LE07_C02_T1_L2', - 'description': 'Landsat 7, collection 2, tier 1, level 2 surface reflectance.' + 'description': 'Landsat 7, collection 2, tier 1, level 2 surface reflectance.', }, 'LANDSAT/LC08/C02/T1_L2': { 'gd_coll_name': 'l8-c2-l2', 'prop_schema': landsat_prop_schema, 'image_type': geedim.mask.LandsatImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LC08_C02_T1_L2', - 'description': 'Landsat 8, collection 2, tier 1, level 2 surface reflectance.' + 'description': 'Landsat 8, collection 2, tier 1, level 2 surface reflectance.', }, 'LANDSAT/LC09/C02/T1_L2': { 'gd_coll_name': 'l9-c2-l2', 'prop_schema': landsat_prop_schema, 'image_type': geedim.mask.LandsatImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LC09_C02_T1_L2', - 'description': 'Landsat 9, collection 2, tier 1, level 2 surface reflectance.' + 'description': 'Landsat 9, collection 2, tier 1, level 2 surface reflectance.', }, 'COPERNICUS/S2': { 'gd_coll_name': 's2-toa', 'prop_schema': s2_prop_schema, 'image_type': geedim.mask.Sentinel2ToaClImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2', - 'description': 'Sentinel-2, level 1C, top of atmosphere reflectance.' + 'description': 'Sentinel-2, level 1C, top of atmosphere reflectance.', }, 'COPERNICUS/S2_SR': { 'gd_coll_name': 's2-sr', 'prop_schema': s2_prop_schema, 'image_type': geedim.mask.Sentinel2SrClImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR', - 'description': 'Sentinel-2, level 2A, surface reflectance.' + 'description': 'Sentinel-2, level 2A, surface reflectance.', }, 'COPERNICUS/S2_HARMONIZED': { 'gd_coll_name': 's2-toa-hm', 'prop_schema': s2_prop_schema, 'image_type': geedim.mask.Sentinel2ToaClImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_HARMONIZED', - 'description': 'Harmonised Sentinel-2, level 1C, top of atmosphere reflectance.' + 'description': 'Harmonised Sentinel-2, level 1C, top of atmosphere reflectance.', }, 'COPERNICUS/S2_SR_HARMONIZED': { 'gd_coll_name': 's2-sr-hm', 'prop_schema': s2_prop_schema, 'image_type': geedim.mask.Sentinel2SrClImage, 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED', - 'description': 'Harmonised Sentinel-2, level 2A, surface reflectance.' + 'description': 'Harmonised Sentinel-2, level 2A, surface reflectance.', }, - 'MODIS/006/MCD43A4': { + 'MODIS/061/MCD43A4': { 'gd_coll_name': 'modis-nbar', 'prop_schema': default_prop_schema, 'image_type': geedim.mask.MaskedImage, - 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/MODIS_006_MCD43A4', - 'description': 'MODIS nadir BRDF adjusted daily reflectance.' - } + 'ee_url': 'https://developers.google.com/earth-engine/datasets/catalog/MODIS_061_MCD43A4', + 'description': 'MODIS nadir BRDF adjusted daily reflectance.', + }, } -# yapf: enable + # Dict to convert from geedim to Earth Engine collection names ee_to_gd = dict([(k, v['gd_coll_name']) for k, v in collection_schema.items()]) @@ -136,7 +144,7 @@ def cli_cloud_coll_table() -> str: - """ Return a table of cloud/shadow mask supported collections for use in CLI help strings. """ + """Return a table of cloud/shadow mask supported collections for use in CLI help strings.""" headers = dict(gd_coll_name='geedim name', ee_coll_name='EE name') data = [] for key, val in collection_schema.items(): @@ -161,7 +169,7 @@ def cloud_coll_table(descr_join='\n') -> str: for key, val in collection_schema.items(): if val['image_type'] != geedim.mask.MaskedImage: ee_coll_name = '\n'.join(wrap(f'`{key} <{val["ee_url"]}>`_', width=40)) - descr = descr_join.join(wrap(val['description'], width=60)) # for RTD multiline table + descr = descr_join.join(wrap(val['description'], width=60)) # for RTD multiline table data.append(dict(ee_coll_name=ee_coll_name, descr=descr)) return tabulate(data, headers=headers, tablefmt='grid') diff --git a/geedim/tile.py b/geedim/tile.py index 39e98d8..6a71b82 100644 --- a/geedim/tile.py +++ b/geedim/tile.py @@ -17,15 +17,15 @@ import logging import threading import time -import zipfile from io import BytesIO import numpy as np import rasterio as rio import requests -from rasterio import Affine, MemoryFile +from rasterio import Affine +from rasterio.errors import RasterioIOError from rasterio.windows import Window -from requests.exceptions import RequestException, JSONDecodeError +from requests.exceptions import JSONDecodeError, RequestException from tqdm.auto import tqdm from geedim import utils @@ -98,37 +98,33 @@ def _download_to_array(self, url: str, session: requests.Session = None, bar: tq dtype_size = np.dtype(self._exp_image.dtype).itemsize raw_download_size = self._shape[0] * self._shape[1] * self._exp_image.count * dtype_size - # download and unzip the tile + # download & read the tile downloaded_size = 0 + buf = BytesIO() try: - # download zip into buffer - zip_buffer = BytesIO() + # download gtiff into buffer for data in response.iter_content(chunk_size=10240): if bar: # update with raw download progress (0-1) bar.update(raw_download_size * (len(data) / download_size)) - zip_buffer.write(data) + buf.write(data) downloaded_size += len(data) - zip_buffer.flush() + buf.flush() - # extract GeoTIFF bytes from zipped buffer - with zipfile.ZipFile(zip_buffer, 'r') as zip_file: - gtiff_bytes = zip_file.read(zip_file.filelist[0]) + # read the tile array from the GeoTIFF buffer + buf.seek(0) + env = rio.Env(GDAL_NUM_THREADS='ALL_CPUs', GTIFF_FORCE_RGBA=False) + with utils.suppress_rio_logs(), env, rio.open(buf, 'r') as ds: + array = ds.read() + return array - except (RequestException, zipfile.BadZipfile): + except (RequestException, RasterioIOError): if bar: # reverse progress bar bar.update(-raw_download_size * (downloaded_size / download_size)) pass raise - # read the tile array from the GeoTIFF bytes, via a rasterio memory file - env = rio.Env(GDAL_NUM_THREADS='ALL_CPUs', GTIFF_FORCE_RGBA=False) - with utils.suppress_rio_logs(), env, MemoryFile(gtiff_bytes) as mem_file: - with mem_file.open() as ds: - array = ds.read() - return array - def download( self, session: requests.Session = None, @@ -161,32 +157,22 @@ def download( session = session or requests # get download URL - with self._ee_lock: - url = self._exp_image.ee_image.getDownloadURL( - dict( - crs=self._exp_image.crs, - crs_transform=tuple(self._transform)[:6], - dimensions=self._shape[::-1], - filePerBand=False, - fileFormat='GeoTIFF', - ) + url = self._exp_image.ee_image.getDownloadURL( + dict( + crs=self._exp_image.crs, + crs_transform=tuple(self._transform)[:6], + dimensions=self._shape[::-1], + format='GEO_TIFF', ) + ) # download and read the tile, with retries - array = None for retry in range(max_retries + 1): try: - array = self._download_to_array(url, session=session, bar=bar) - break - - except (RequestException, zipfile.BadZipfile) as ex: + return self._download_to_array(url, session=session, bar=bar) + except (RequestException, RasterioIOError) as ex: if retry < max_retries: - # retry tile download time.sleep(backoff_factor * (2**retry)) - logger.warning( - f'Tile downloaded failed, retry {retry + 1} of {max_retries}. URL: {url}. {str(ex)}.' - ) + logger.warning(f'Tile download failed, retry {retry + 1} of {max_retries}. URL: {url}. {str(ex)}.') else: raise TileError(f'Tile download failed, reached the maximum retries. URL: {url}.') from ex - - return array diff --git a/geedim/utils.py b/geedim/utils.py index 275526f..afd51f4 100644 --- a/geedim/utils.py +++ b/geedim/utils.py @@ -14,6 +14,8 @@ limitations under the License. """ +from __future__ import annotations + import itertools import json import logging @@ -29,8 +31,8 @@ import numpy as np import rasterio as rio import requests +from rasterio import warp from rasterio.env import GDALVersion -from rasterio.warp import transform_geom from rasterio.windows import Window from requests.adapters import HTTPAdapter, Retry from tqdm.auto import tqdm @@ -114,6 +116,8 @@ def split_id(image_id: str) -> Tuple[str, str]: @contextmanager def suppress_rio_logs(level: int = logging.ERROR): """A context manager that sets the `rasterio` logging level, then returns it to its original value.""" + # TODO: this should not be necessary if logging level changes are limited to geedim. if it has to be used, + # it should be made thread-safe. try: # GEE sets GeoTIFF `colorinterp` tags incorrectly. This suppresses `rasterio` warning relating to this: # 'Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel' @@ -160,7 +164,7 @@ def get_bounds(filename: pathlib.Path, expand: float = 5): ] bbox_expand_dict = dict(type="Polygon", coordinates=[coordinates]) - src_bbox_wgs84 = transform_geom(im.crs, "WGS84", bbox_expand_dict) # convert to WGS84 geojson + src_bbox_wgs84 = warp.transform_geom(im.crs, "WGS84", bbox_expand_dict) # convert to WGS84 geojson return src_bbox_wgs84 @@ -261,6 +265,9 @@ def resample(ee_image: ee.Image, method: ResamplingMethod) -> ee.Image: Resample an ee.Image. Extends ee.Image.resample by only resampling when the image has a fixed projection, and by providing an additional 'average' method for downsampling. This logic is performed server-side. + Note that for the :attr:`ResamplingMethod.average` ``method``, the returned image has a minimum scale default + projection. + See https://developers.google.com/earth-engine/guides/resample for more info. Parameters @@ -281,12 +288,15 @@ def resample(ee_image: ee.Image, method: ResamplingMethod) -> ee.Image: return ee_image # resample the image, if it has a fixed projection - proj = ee_image.select(0).projection() + proj = get_projection(ee_image, min_scale=True) has_fixed_proj = proj.crs().compareTo('EPSG:4326').neq(0).Or(proj.nominalScale().toInt64().neq(111319)) def _resample(ee_image: ee.Image) -> ee.Image: """Resample the given image, allowing for additional 'average' method.""" if method == ResamplingMethod.average: + # set the default projection to the minimum scale projection (required for e.g. S2 images that have + # non-fixed projection bands) + ee_image = ee_image.setDefaultProjection(proj) return ee_image.reduceResolution(reducer=ee.Reducer.mean(), maxPixels=1024) else: return ee_image.resample(method.value) @@ -336,23 +346,23 @@ def expand_window_to_grid(win: Window, expand_pixels: Tuple[int, int] = (0, 0)) return exp_win -def rio_crs(crs: str) -> str: +def rio_crs(crs: str | rio.CRS) -> str | rio.CRS: """Convert a GEE CRS string to a rasterio compatible CRS string.""" if crs == 'SR-ORG:6974': # This is a workaround for https://issuetracker.google.com/issues/194561313, that replaces the alleged GEE - # SR-ORG:6974 with actual (rasterio) SR-ORG:6842. WKT taken from - # https://spatialreference.org/ref/sr-org/modis-sinusoidal/html/. + # SR-ORG:6974 with actual WKT for SR-ORG:6842 taken from + # https://github.com/OSGeo/spatialreference.org/blob/master/scripts/sr-org.json. crs = """PROJCS["Sinusoidal", -GEOGCS["GCS_Undefined", - DATUM["Undefined", - SPHEROID["User_Defined_Spheroid",6371007.181,0.0]], - PRIMEM["Greenwich",0.0], - UNIT["Degree",0.0174532925199433]], -PROJECTION["Sinusoidal"], -PARAMETER["False_Easting",0.0], -PARAMETER["False_Northing",0.0], -PARAMETER["Central_Meridian",0.0], -UNIT["Meter",1.0]]""" + GEOGCS["GCS_Undefined", + DATUM["Undefined", + SPHEROID["User_Defined_Spheroid",6371007.181,0.0]], + PRIMEM["Greenwich",0.0], + UNIT["Degree",0.0174532925199433]], + PROJECTION["Sinusoidal"], + PARAMETER["False_Easting",0.0], + PARAMETER["False_Northing",0.0], + PARAMETER["Central_Meridian",0.0], + UNIT["Meter",1.0]]""" return crs diff --git a/pyproject.toml b/pyproject.toml index 2344c30..9b7535b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,13 +2,13 @@ name = 'geedim' description = 'Search, composite and download Google Earth Engine imagery.' readme = 'README.rst' -requires-python = '>=3.6' +requires-python = '>=3.8' dependencies = [ 'numpy>=1.19', - 'rasterio>=1.3', + 'rasterio>=1.3.8', 'click>=8', 'tqdm>=4.6', - 'earthengine-api>=0.1.2', + 'earthengine-api>=0.1.379', 'requests>=2.2', 'tabulate>=0.8' ] diff --git a/tests/conftest.py b/tests/conftest.py index eb6bb29..c20b2db 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -72,92 +72,74 @@ def const_image_25ha_file() -> pathlib.Path: @pytest.fixture(scope='session') def l4_image_id() -> str: - """Landsat-4 EE ID for image that covers `region_*ha`, with partial cloud cover only for `region10000ha`.""" + """Landsat-4 EE ID for image that covering `region_*ha`, with partial cloud/shadow for `region10000ha` only.""" return 'LANDSAT/LT04/C02/T1_L2/LT04_173083_19880310' @pytest.fixture(scope='session') def l5_image_id() -> str: - """Landsat-5 EE ID for image that covers `region_*ha` with partial cloud cover.""" - return 'LANDSAT/LT05/C02/T1_L2/LT05_173083_20051112' # 'LANDSAT/LT05/C02/T1_L2/LT05_173083_20070307' + """Landsat-5 EE ID for image covering `region_*ha` with partial cloud/shadow.""" + return 'LANDSAT/LT05/C02/T1_L2/LT05_173083_20051112' @pytest.fixture(scope='session') def l7_image_id() -> str: - """Landsat-7 EE ID for image that covers `region_*ha` with partial cloud cover.""" - return 'LANDSAT/LE07/C02/T1_L2/LE07_173083_20220119' # 'LANDSAT/LE07/C02/T1_L2/LE07_173083_20200521' + """Landsat-7 EE ID for image covering `region_*ha` with partial cloud/shadow.""" + return 'LANDSAT/LE07/C02/T1_L2/LE07_173083_20220119' @pytest.fixture(scope='session') def l8_image_id() -> str: - """Landsat-8 EE ID for image that covers `region_*ha` with partial cloud cover.""" - return 'LANDSAT/LC08/C02/T1_L2/LC08_173083_20180217' # 'LANDSAT/LC08/C02/T1_L2/LC08_173083_20171113' + """Landsat-8 EE ID for image covering `region_*ha` with partial cloud/shadow.""" + return 'LANDSAT/LC08/C02/T1_L2/LC08_173083_20180217' @pytest.fixture(scope='session') def l9_image_id() -> str: - """Landsat-9 EE ID for image that covers `region_*ha` with partial cloud cover.""" - return 'LANDSAT/LC09/C02/T1_L2/LC09_173083_20220308' # 'LANDSAT/LC09/C02/T1_L2/LC09_173083_20220103' + """Landsat-9 EE ID for image covering `region_*ha` with partial cloud/shadow.""" + return 'LANDSAT/LC09/C02/T1_L2/LC09_173083_20220308' @pytest.fixture(scope='session') def landsat_image_ids(l4_image_id, l5_image_id, l7_image_id, l8_image_id, l9_image_id) -> List[str]: - """Landsat4-9 EE IDs for images that covers `region_*ha` with partial cloud cover.""" + """Landsat4-9 EE IDs for images covering `region_*ha` with partial cloud/shadow.""" return [l4_image_id, l5_image_id, l7_image_id, l8_image_id, l9_image_id] @pytest.fixture(scope='session') def s2_sr_image_id() -> str: - """Sentinel-2 SR EE ID for image that covers `region_*ha` with partial cloud cover.""" - # 'COPERNICUS/S2/20220107T081229_20220107T083059_T34HEJ' - return 'COPERNICUS/S2_SR/20211004T080801_20211004T083709_T34HEJ' + """Sentinel-2 SR EE ID for image with QA* data, covering `region_*ha` with partial cloud/shadow.""" + return 'COPERNICUS/S2_SR/20200929T080731_20200929T083634_T34HEJ' @pytest.fixture(scope='session') def s2_toa_image_id() -> str: - """Sentinel-2 TOA EE ID for image that covers `region_*ha` with partial cloud cover.""" - return 'COPERNICUS/S2/20220107T081229_20220107T083059_T34HEJ' + """Sentinel-2 TOA EE ID for image with QA* data, covering `region_*ha` with partial cloud/shadow.""" + return 'COPERNICUS/S2/20210216T081011_20210216T083703_T34HEJ' @pytest.fixture(scope='session') -def s2_sr_hm_image_id() -> str: - """Harmonised Sentinel-2 SR EE ID for image that covers `region_*ha` with partial cloud cover.""" - # 'COPERNICUS/S2/20220107T081229_20220107T083059_T34HEJ' - return 'COPERNICUS/S2_SR_HARMONIZED/20211004T080801_20211004T083709_T34HEJ' - - -@pytest.fixture(scope='session') -def s2_sr_hm_qa_mask_image_id() -> str: - """Harmonised Sentinel-2 SR EE ID for image with masked QA* data, that covers `region_*ha` with partial cloud - cover. - """ - return 'COPERNICUS/S2_SR_HARMONIZED/20240426T080609_20240426T083054_T34HEJ' +def s2_sr_hm_image_id(s2_sr_image_id: str) -> str: + """Harmonised Sentinel-2 SR EE ID for image with QA* data, covering `region_*ha` with partial cloud/shadow.""" + return 'COPERNICUS/S2_SR_HARMONIZED/' + s2_sr_image_id.split('/')[-1] @pytest.fixture(scope='session') def s2_sr_hm_qa_zero_image_id() -> str: - """Harmonised Sentinel-2 SR EE ID for image with zero QA* data, that covers `region_*ha` with partial cloud - cover. - """ - return 'COPERNICUS/S2_SR_HARMONIZED/20230407T080611_20230407T083613_T34HEJ' + """Harmonised Sentinel-2 SR EE ID for image with zero QA* data, covering `region_*ha` with partial cloud/shadow.""" + return 'COPERNICUS/S2_SR_HARMONIZED/20230721T080609_20230721T083101_T34HEJ' @pytest.fixture(scope='session') -def s2_toa_hm_image_id() -> str: - """Harmonised Sentinel-2 TOA EE ID for image that covers `region_*ha` with partial cloud cover.""" - return 'COPERNICUS/S2_HARMONIZED/20220107T081229_20220107T083059_T34HEJ' - - -@pytest.fixture(scope='session') -def s2_image_ids(s2_sr_image_id, s2_toa_image_id, s2_sr_hm_image_id, s2_toa_hm_image_id) -> List[str]: - """Sentinel-2 TOA/SR EE IDs for images that covers `region_*ha` with partial cloud cover.""" - return [s2_sr_image_id, s2_toa_image_id, s2_sr_hm_image_id, s2_toa_hm_image_id] +def s2_toa_hm_image_id(s2_toa_image_id: str) -> str: + """Harmonised Sentinel-2 TOA EE ID for image with QA* data, covering `region_*ha` with partial cloud/shadow.""" + return 'COPERNICUS/S2_HARMONIZED/' + s2_toa_image_id.split('/')[-1] @pytest.fixture(scope='session') def modis_nbar_image_id() -> str: - """Global MODIS NBAR image ID. WGS84 @ 500m.""" - return 'MODIS/006/MCD43A4/2022_01_01' + """Global MODIS NBAR image ID.""" + return 'MODIS/061/MCD43A4/2022_01_01' @pytest.fixture(scope='session') @@ -193,6 +175,22 @@ def landsat_ndvi_image_id() -> str: return 'LANDSAT/COMPOSITES/C02/T1_L2_8DAY_NDVI/20211211' +@pytest.fixture(scope='session') +def google_dyn_world_image_id(s2_sr_hm_image_id) -> str: + """Google Dynamic World EE ID. 10m with positive y-axis transform.""" + return 'GOOGLE/DYNAMICWORLD/V1/' + s2_sr_hm_image_id.split('/')[-1] + + +@pytest.fixture() +def s2_sr_hm_image_ids(s2_sr_image_id: str, s2_toa_image_id: str) -> List[str]: + """A list of harmonised Sentinel-2 SR image IDs, covering `region_*ha` with partial cloud/shadow..""" + return [ + 'COPERNICUS/S2_SR_HARMONIZED/' + s2_sr_image_id.split('/')[-1], + 'COPERNICUS/S2_SR_HARMONIZED/' + s2_toa_image_id.split('/')[-1], + 'COPERNICUS/S2_SR_HARMONIZED/20191229T081239_20191229T083040_T34HEJ', + ] + + @pytest.fixture(scope='session') def generic_image_ids( modis_nbar_image_id, gch_image_id, s1_sar_image_id, gedi_agb_image_id, gedi_cth_image_id, landsat_ndvi_image_id @@ -210,19 +208,19 @@ def generic_image_ids( @pytest.fixture(scope='session') def l4_masked_image(l4_image_id) -> MaskedImage: - """Landsat-4 MaskedImage that covers `region_*ha`, with partial cloud cover only for `region10000ha`.""" + """Landsat-4 MaskedImage covering `region_*ha`, with partial cloud for `region10000ha` only.""" return MaskedImage.from_id(l4_image_id) @pytest.fixture(scope='session') def l5_masked_image(l5_image_id) -> MaskedImage: - """Landsat-5 MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Landsat-5 MaskedImage covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(l5_image_id) @pytest.fixture(scope='session') def l7_masked_image(l7_image_id) -> MaskedImage: - """Landsat-7 MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Landsat-7 MaskedImage covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(l7_image_id) @@ -234,40 +232,32 @@ def l8_masked_image(l8_image_id) -> MaskedImage: @pytest.fixture(scope='session') def l9_masked_image(l9_image_id) -> MaskedImage: - """Landsat-9 MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Landsat-9 MaskedImage covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(l9_image_id) -@pytest.fixture(scope='session') -def landsat_masked_images( - l4_masked_image, l5_masked_image, l7_masked_image, l8_masked_image, l9_masked_image -) -> List[MaskedImage]: # yapf: disable - """Landsat4-9 MaskedImage's that cover `region_*ha` with partial cloud cover.""" - return [l4_masked_image, l5_masked_image, l7_masked_image, l8_masked_image, l9_masked_image] - - @pytest.fixture(scope='session') def s2_sr_masked_image(s2_sr_image_id) -> MaskedImage: - """Sentinel-2 SR MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Sentinel-2 SR MaskedImage with QA* data, covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(s2_sr_image_id) @pytest.fixture(scope='session') def s2_toa_masked_image(s2_toa_image_id) -> MaskedImage: - """Sentinel-2 TOA MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Sentinel-2 TOA MaskedImage with QA* data, covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(s2_toa_image_id) @pytest.fixture(scope='session') def s2_sr_hm_masked_image(s2_sr_hm_image_id) -> MaskedImage: - """Harmonised Sentinel-2 SR MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Harmonised Sentinel-2 SR MaskedImage with QA* data, covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(s2_sr_hm_image_id) @pytest.fixture(scope='session') def s2_sr_hm_nocp_masked_image(s2_sr_hm_image_id) -> MaskedImage: - """Harmonised Sentinel-2 SR MaskedImage with no corresponding cloud probability, that covers `region_*ha` with - partial cloud cover. + """Harmonised Sentinel-2 SR MaskedImage with no corresponding cloud probability, covering `region_*ha` with partial + cloud/shadow. """ # create an image with unknown id to prevent linking to cloud probability ee_image = ee.Image(s2_sr_hm_image_id) @@ -276,31 +266,28 @@ def s2_sr_hm_nocp_masked_image(s2_sr_hm_image_id) -> MaskedImage: @pytest.fixture(scope='session') -def s2_sr_hm_qa_mask_masked_image(s2_sr_hm_qa_mask_image_id: str) -> MaskedImage: - """Harmonised Sentinel-2 SR MaskedImage with masked QA* bands, that covers `region_*ha` with partial cloud cover.""" - return MaskedImage.from_id(s2_sr_hm_qa_mask_image_id, mask_method='qa') +def s2_sr_hm_nocs_masked_image(s2_sr_hm_image_id) -> MaskedImage: + """Harmonised Sentinel-2 SR MaskedImage with no corresponding cloud score, covering `region_*ha` with partial + cloud/shadow. + """ + # create an image with unknown id to prevent linking to cloud score + ee_image = ee.Image(s2_sr_hm_image_id) + ee_image = ee_image.set('system:index', 'COPERNICUS/S2_HARMONIZED/unknown') + return Sentinel2SrClImage(ee_image, mask_method='cloud-score') @pytest.fixture(scope='session') def s2_sr_hm_qa_zero_masked_image(s2_sr_hm_qa_zero_image_id: str) -> MaskedImage: - """Harmonised Sentinel-2 SR MaskedImage with zero QA* bands, that covers `region_*ha` with partial cloud cover.""" + """Harmonised Sentinel-2 SR MaskedImage with zero QA* bands, covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(s2_sr_hm_qa_zero_image_id, mask_method='qa') @pytest.fixture(scope='session') def s2_toa_hm_masked_image(s2_toa_hm_image_id) -> MaskedImage: - """Harmonised Sentinel-2 TOA MaskedImage that covers `region_*ha` with partial cloud cover.""" + """Harmonised Sentinel-2 TOA MaskedImage with QA* data, covering `region_*ha` with partial cloud/shadow.""" return MaskedImage.from_id(s2_toa_hm_image_id) -@pytest.fixture(scope='session') -def s2_masked_images( - s2_sr_masked_image, s2_toa_masked_image, s2_sr_hm_masked_image, s2_toa_hm_masked_image -) -> List[MaskedImage]: # yapf: disable - """Sentinel-2 TOA and SR MaskedImage's that cover `region_*ha` with partial cloud cover.""" - return [s2_sr_masked_image, s2_toa_masked_image, s2_sr_hm_masked_image, s2_toa_hm_masked_image] - - @pytest.fixture(scope='session') def user_masked_image() -> MaskedImage: """A MaskedImage instance where the encapsulated image has no fixed projection or ID.""" @@ -343,26 +330,6 @@ def landsat_ndvi_masked_image(landsat_ndvi_image_id) -> MaskedImage: return MaskedImage.from_id(landsat_ndvi_image_id) -@pytest.fixture(scope='session') -def generic_masked_images( - modis_nbar_masked_image, - gch_masked_image, - s1_sar_masked_image, - gedi_agb_masked_image, - gedi_cth_masked_image, - landsat_ndvi_masked_image, -) -> List[MaskedImage]: - """A list of various non-cloud/shadow MaskedImage's.""" - return [ - modis_nbar_masked_image, - gch_masked_image, - s1_sar_masked_image, - gedi_agb_masked_image, - gedi_cth_masked_image, - landsat_ndvi_masked_image, - ] - - @pytest.fixture def runner(): """click runner for command line execution.""" @@ -385,19 +352,3 @@ def region_100ha_file() -> pathlib.Path: def region_10000ha_file() -> pathlib.Path: """Path to region_10000ha geojson file.""" return root_path.joinpath('tests/data/region_10000ha.geojson') - - -def get_image_std(ee_image: ee.Image, region: Dict, std_scale: float): - """ - Helper function to return the mean of the local/neighbourhood image std. dev., over a region. This serves as a - measure of image smoothness. - """ - # Note that for Sentinel-2 images, only the 20m and 60m bands get resampled by EE (and hence smoothed), so - # here B1 @ 60m is used for testing. - test_image = ee_image.select(0) - proj = test_image.projection() - std_image = test_image.reduceNeighborhood(reducer='stdDev', kernel=ee.Kernel.square(2)).rename('TEST') - mean_std_image = std_image.reduceRegion( - reducer='mean', geometry=region, crs=proj.crs(), scale=std_scale, bestEffort=True, maxPixels=1e6 - ) - return mean_std_image.get('TEST').getInfo() diff --git a/tests/test_cli.py b/tests/test_cli.py index 6a14773..53d6edf 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -36,29 +36,13 @@ @pytest.fixture() -def l4_5_image_id_list(l4_image_id, l5_image_id) -> List[str]: - """A list of landsat 4 & 5 image ID's.""" - return [l4_image_id, l5_image_id] - - -@pytest.fixture() -def l8_9_image_id_list(l8_image_id, l9_image_id) -> List[str]: +def l8_9_image_ids(l8_image_id, l9_image_id) -> List[str]: """A list of landsat 8 & 9 image ID's.""" return [l8_image_id, l9_image_id] @pytest.fixture() -def s2_sr_image_id_list() -> List[str]: - """A list of Sentinel-2 SR image IDs.""" - return [ - 'COPERNICUS/S2_SR/20211004T080801_20211004T083709_T34HEJ', - 'COPERNICUS/S2_SR/20211123T081241_20211123T083704_T34HEJ', - 'COPERNICUS/S2_SR/20220107T081229_20220107T083059_T34HEJ', - ] - - -@pytest.fixture() -def gedi_image_id_list() -> List[str]: +def gedi_image_ids() -> List[str]: """A list of GEDI canopy top height ID's.""" return [ 'LARSE/GEDI/GEDI02_A_002_MONTHLY/202008_018E_036S', @@ -161,7 +145,7 @@ def test_search( start_date = datetime.strptime(start_date, '%Y-%m-%d') end_date = datetime.strptime(end_date, '%Y-%m-%d') im_dates = np.array( - [datetime.utcfromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] + [datetime.fromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] ) # test FILL_PORTION in expected range im_fill_portions = np.array([im_props['FILL_PORTION'] for im_props in properties.values()]) @@ -180,21 +164,21 @@ def test_config_search_s2(region_10000ha_file: pathlib.Path, runner: CliRunner, """Test `config` sub-command chained with `search` of Sentinel-2 affects CLOUDLESS_PORTION as expected.""" results_file = tmp_path.joinpath('search_results.json') name = 'COPERNICUS/S2_SR' - cl_portion_list = [] - for prob in [40, 80]: + cl_portions = [] + for score in [0.4, 0.8]: cli_str = ( - f'config --prob {prob} search -c {name} -s 2022-01-01 -e 2022-02-01 -r {region_10000ha_file} -fp -op ' - f'{results_file}' + f'config -mm cloud-score --score {score} search -c {name} -s 2022-01-01 -e 2022-02-01 ' + f'-r {region_10000ha_file} -fp -op {results_file}' ) result = runner.invoke(cli, cli_str.split()) assert result.exit_code == 0 assert results_file.exists() with open(results_file, 'r') as f: properties = json.load(f) - cl_portion_list.append(np.array([prop_dict['CLOUDLESS_PORTION'] for prop_dict in properties.values()])) + cl_portions.append(np.array([prop_dict['CLOUDLESS_PORTION'] for prop_dict in properties.values()])) - assert np.any(cl_portion_list[0] < cl_portion_list[1]) - assert not np.any(cl_portion_list[0] > cl_portion_list[1]) + assert np.any(cl_portions[0] > cl_portions[1]) + assert not np.any(cl_portions[0] < cl_portions[1]) def test_config_search_l9(region_10000ha_file: pathlib.Path, runner: CliRunner, tmp_path: pathlib.Path): @@ -329,7 +313,7 @@ def test_search_cloudless_portion_no_value(region_25ha_file: pathlib.Path, runne ('gedi_cth_image_id', 'region_25ha_file'), ('modis_nbar_image_id', 'region_25ha_file'), ], -) # yapf: disable +) def test_download_region_defaults( image_id: str, region_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner, request ): @@ -386,11 +370,11 @@ def test_download_crs_transform( def test_download_like( - l8_image_id: str, s2_sr_image_id: str, region_25ha_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner + l8_image_id: str, s2_sr_hm_image_id: str, region_25ha_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner ): """Test image download using --like.""" l8_file = tmp_path.joinpath(l8_image_id.replace('/', '-') + '.tif') - s2_file = tmp_path.joinpath(s2_sr_image_id.replace('/', '-') + '.tif') + s2_file = tmp_path.joinpath(s2_sr_hm_image_id.replace('/', '-') + '.tif') # download the landsat 8 image to be the template # TODO: make a synthetic template to save time @@ -400,7 +384,7 @@ def test_download_like( assert l8_file.exists() # download the sentinel 2 image like the landsat 8 image - s2_cli_str = f'download -i {s2_sr_image_id} --like {l8_file} -dd {tmp_path}' + s2_cli_str = f'download -i {s2_sr_hm_image_id} --like {l8_file} -dd {tmp_path}' result = runner.invoke(cli, s2_cli_str.split()) assert result.exit_code == 0 assert s2_file.exists() @@ -418,7 +402,7 @@ def test_download_like( ('l5_image_id', 'region_25ha_file', 'EPSG:3857', 30, 'uint16', None, False, 'near', False, 16, 10000), ('l9_image_id', 'region_25ha_file', 'EPSG:3857', 30, 'float32', None, False, 'near', True, 32, 10000), ( - 's2_toa_image_id', + 's2_toa_hm_image_id', 'region_25ha_file', 'EPSG:3857', 10, @@ -488,10 +472,10 @@ def test_download_params( def test_max_tile_size_error( - s2_sr_image_id: str, region_100ha_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner, request + s2_sr_hm_image_id: str, region_100ha_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner, request ): """Test image download with max_tile_size > EE limit raises an EE error.""" - cli_str = f'download -i {s2_sr_image_id} -r {region_100ha_file} -dd {tmp_path} -mts 100' + cli_str = f'download -i {s2_sr_hm_image_id} -r {region_100ha_file} -dd {tmp_path} -mts 100' result = runner.invoke(cli, cli_str.split()) assert result.exit_code != 0 assert isinstance(result.exception, ValueError) @@ -499,10 +483,10 @@ def test_max_tile_size_error( def test_max_tile_dim_error( - s2_sr_image_id: str, region_100ha_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner, request + s2_sr_hm_image_id: str, region_100ha_file: pathlib.Path, tmp_path: pathlib.Path, runner: CliRunner, request ): """Test image download with max_tile_dim > EE limit raises an EE error.""" - cli_str = f'download -i {s2_sr_image_id} -r {region_100ha_file} -dd {tmp_path} -mtd 100000' + cli_str = f'download -i {s2_sr_hm_image_id} -r {region_100ha_file} -dd {tmp_path} -mtd 100000' result = runner.invoke(cli, cli_str.split()) assert result.exit_code != 0 assert isinstance(result.exception, ValueError) @@ -550,7 +534,7 @@ def test_export_asset_no_folder_error(l8_image_id: str, region_25ha_file: pathli assert '--folder' in result.output -@pytest.mark.parametrize('image_list, scale', [('s2_sr_image_id_list', 10), ('l8_9_image_id_list', 30)]) +@pytest.mark.parametrize('image_list, scale', [('s2_sr_hm_image_ids', 10), ('l8_9_image_ids', 30)]) def test_composite_defaults( image_list: str, scale: float, @@ -582,10 +566,10 @@ def test_composite_defaults( @pytest.mark.parametrize( 'image_list, method, region_file, date, mask, resampling, download_scale', [ - ('s2_sr_image_id_list', 'mosaic', None, '2021-10-01', True, 'near', 10), - ('l8_9_image_id_list', 'q-mosaic', 'region_25ha_file', None, True, 'bilinear', 30), - ('l8_9_image_id_list', 'medoid', 'region_25ha_file', None, True, 'near', 30), - ('gedi_image_id_list', 'medoid', None, None, True, 'bilinear', 25), + ('s2_sr_hm_image_ids', 'mosaic', None, '2021-10-01', True, 'near', 10), + ('l8_9_image_ids', 'q-mosaic', 'region_25ha_file', None, True, 'bilinear', 30), + ('l8_9_image_ids', 'medoid', 'region_25ha_file', None, True, 'near', 30), + ('gedi_image_ids', 'medoid', None, None, True, 'bilinear', 25), ], ) def test_composite_params( diff --git a/tests/test_collection.py b/tests/test_collection.py index 2071bde..3cb8a91 100644 --- a/tests/test_collection.py +++ b/tests/test_collection.py @@ -14,7 +14,9 @@ limitations under the License. """ -from datetime import datetime +from __future__ import annotations + +from datetime import datetime, timezone from typing import Dict, List, Union import ee @@ -27,29 +29,28 @@ from geedim.errors import InputImageError, UnfilteredError from geedim.mask import MaskedImage from geedim.utils import get_projection, split_id -from .conftest import get_image_std @pytest.fixture() -def l4_5_image_list(l4_image_id, l5_masked_image) -> List[Union[str, MaskedImage]]: +def l4_5_images(l4_image_id, l5_masked_image) -> List[Union[str, MaskedImage]]: """A list of landsat 4 & 5 image ID / MaskedImage's""" return [l4_image_id, l5_masked_image] @pytest.fixture() -def l8_9_image_list(l8_image_id, l9_masked_image) -> List[Union[str, MaskedImage]]: +def l8_9_images(l8_image_id, l9_masked_image) -> List[Union[str, MaskedImage]]: """A list of landsat 8 & 9 image IDs/ MaskedImage's""" return [l8_image_id, l9_masked_image] @pytest.fixture() -def s2_sr_image_list() -> List[Union[str, MaskedImage]]: - """A list of Sentinel-2 SR image IDs/ MaskedImage's""" - return [ - 'COPERNICUS/S2_SR/20211004T080801_20211004T083709_T34HEJ', - 'COPERNICUS/S2_SR/20211123T081241_20211123T083704_T34HEJ', - MaskedImage.from_id('COPERNICUS/S2_SR/20220107T081229_20220107T083059_T34HEJ'), - ] +def s2_sr_hm_images(s2_sr_hm_image_ids: list[str]) -> list[str | MaskedImage]: + """A list of harmonised Sentinel-2 SR image IDs / MaskedImage's with QA* data, covering `region_*ha` with partial + cloud/shadow. + """ + image_list = s2_sr_hm_image_ids.copy() + image_list[-1] = MaskedImage.from_id(image_list[-1]) + return image_list @pytest.fixture() @@ -72,9 +73,9 @@ def test_split_id(): assert im_id == 'ABC' -@pytest.mark.parametrize('name', ['l9_image_id', 'gch_image_id']) +@pytest.mark.parametrize('name', ['s2_sr_hm_image_id', 'l9_image_id', 'gch_image_id']) def test_from_name(name: str, request): - """Test MaskedCollection.from_name() for non Sentinel-2 collections.""" + """Test MaskedCollection.from_name().""" name = request.getfixturevalue(name) name, _ = split_id(name) gd_collection = MaskedCollection.from_name(name) @@ -84,31 +85,9 @@ def test_from_name(name: str, request): assert gd_collection.ee_collection == ee.ImageCollection(name) -@pytest.mark.parametrize('name', ['s2_sr_image_id', 's2_toa_image_id']) -def test_from_name_s2(name: str, request): - """ - Test MaskedCollection.from_name() filters out images that don't have matching cloud probability (for Sentinel-2 - collections). - """ - name = request.getfixturevalue(name) - name, _ = split_id(name) - gd_collection = MaskedCollection.from_name(name) - assert gd_collection._name == name - assert gd_collection.schema is not None - assert gd_collection.schema == schema.s2_prop_schema - # check ee_collection is not the full unfiltered collection - assert gd_collection.ee_collection != ee.ImageCollection(name) - # check one of the problem images is not in the collection - # 20220305T075809_20220305T082125_T35HKD, 0220122T081241_20220122T083135_T34HEJ, - # 20220226T080909_20220226T083100_T34HEH are other options - filt = ee.Filter.eq('system:index', '0220122T081241_20220122T083135_T34HEJ') - filt_collection = gd_collection.ee_collection.filter(filt) - assert filt_collection.size().getInfo() == 0 - - -def test_unfiltered_error(s2_sr_image_id): +def test_unfiltered_error(s2_sr_hm_image_id): """Test UnfilteredError is raised when calling `properties` or `composite` on an unfiltered collection.""" - gd_collection = MaskedCollection.from_name(split_id(s2_sr_image_id)[0]) + gd_collection = MaskedCollection.from_name(split_id(s2_sr_hm_image_id)[0]) with pytest.raises(UnfilteredError): _ = gd_collection.properties with pytest.raises(UnfilteredError): @@ -134,7 +113,7 @@ def test_from_list_errors(landsat_image_ids, user_masked_image): MaskedCollection.from_list([]) -@pytest.mark.parametrize('image_list', ['l4_5_image_list', 'l8_9_image_list']) +@pytest.mark.parametrize('image_list', ['l4_5_images', 'l8_9_images']) def test_from_list_landsat(image_list: str, request): """ Test MaskedCollection.from_list() works with landsat images from different, but spectrally compatible @@ -146,7 +125,7 @@ def test_from_list_landsat(image_list: str, request): assert gd_collection.properties is not None -@pytest.mark.parametrize('image_list', ['s2_sr_image_list', 'gedi_image_list']) +@pytest.mark.parametrize('image_list', ['s2_sr_hm_images', 'gedi_image_list']) def test_from_list(image_list: str, request): """ Test MaskedCollection.from_list() generates a valid MaskedCollection object from lists of cloud/shadow @@ -166,7 +145,7 @@ def test_from_list(image_list: str, request): assert gd_collection.schema_table is not None -@pytest.mark.parametrize('image_list', ['s2_sr_image_list', 'gedi_image_list']) +@pytest.mark.parametrize('image_list', ['s2_sr_hm_images', 'gedi_image_list']) def test_from_list_order(image_list: str, request): """Test MaskedCollection.from_list() maintains the order of the provided image list.""" image_list: List = request.getfixturevalue(image_list)[::-1] @@ -187,8 +166,8 @@ def test_from_list_ee_image(gedi_image_list: List): @pytest.mark.parametrize( 'image_list, add_props', [ - ('s2_sr_image_list', ['AOT_RETRIEVAL_ACCURACY', 'CLOUDY_PIXEL_PERCENTAGE']), - ('l8_9_image_list', ['CLOUD_COVER', 'GEOMETRIC_RMSE_VERIFY']), + ('s2_sr_hm_images', ['AOT_RETRIEVAL_ACCURACY', 'CLOUDY_PIXEL_PERCENTAGE']), + ('l8_9_images', ['CLOUD_COVER', 'GEOMETRIC_RMSE_VERIFY']), ], ) def test_from_list_add_props(image_list: str, add_props: List, request: pytest.FixtureRequest): @@ -235,7 +214,7 @@ def test_search( start_date = datetime.strptime(start_date, '%Y-%m-%d') end_date = datetime.strptime(end_date, '%Y-%m-%d') im_dates = np.array( - [datetime.utcfromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] + [datetime.fromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] ) # test FILL_PORTION in expected range im_fill_portions = np.array([im_props['FILL_PORTION'] for im_props in properties.values()]) @@ -269,7 +248,7 @@ def test_search_no_end_date(region_100ha): end_date = datetime.strptime('2022-01-04', '%Y-%m-%d') properties = searched_collection.properties im_dates = np.array( - [datetime.utcfromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] + [datetime.fromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] ) assert len(properties) > 0 assert np.all(im_dates >= start_date) and np.all(im_dates < end_date) @@ -288,14 +267,20 @@ def test_search_mult_kwargs(region_100ha): """ start_date = '2022-01-01' end_date = '2022-01-10' - gd_collection = MaskedCollection.from_name('COPERNICUS/S2_SR') + gd_collection = MaskedCollection.from_name('COPERNICUS/S2_SR_HARMONIZED') def get_cloudless_portion(properties: Dict) -> List[float]: return [prop_dict['CLOUDLESS_PORTION'] for prop_dict in properties.values()] - filt_collection = gd_collection.search(start_date, end_date, region_100ha, prob=80, fill_portion=0) - filt_coll_prob80 = filt_collection.search(start_date, end_date, region_100ha, prob=80, fill_portion=0) - filt_coll_prob40 = filt_collection.search(start_date, end_date, region_100ha, prob=40, fill_portion=0) + filt_collection = gd_collection.search( + start_date, end_date, region_100ha, mask_method='cloud-score', score=0.5, fill_portion=0 + ) + filt_coll_prob80 = filt_collection.search( + start_date, end_date, region_100ha, mask_method='cloud-score', score=0.5, fill_portion=0 + ) + filt_coll_prob40 = filt_collection.search( + start_date, end_date, region_100ha, mask_method='cloud-score', score=0.2, fill_portion=0 + ) cp_ref = get_cloudless_portion(filt_collection.properties) cp_prob80 = get_cloudless_portion(filt_coll_prob80.properties) @@ -355,7 +340,7 @@ def test_search_no_fill_or_cloudless_portion( start_date = datetime.strptime(start_date, '%Y-%m-%d') end_date = datetime.strptime(end_date, '%Y-%m-%d') im_dates = np.array( - [datetime.utcfromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] + [datetime.fromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] ) # test FILL_PORTION and CLOUDLESS_PORTION are not in properties prop_keys = list(properties.values())[0].keys() @@ -371,12 +356,12 @@ def test_search_no_fill_or_cloudless_portion( @pytest.mark.parametrize( 'image_list, method, region, date', [ - ('s2_sr_image_list', CompositeMethod.q_mosaic, 'region_10000ha', None), - ('s2_sr_image_list', CompositeMethod.q_mosaic, None, '2021-10-01'), + ('s2_sr_hm_images', CompositeMethod.q_mosaic, 'region_10000ha', None), + ('s2_sr_hm_images', CompositeMethod.q_mosaic, None, '2021-10-01'), ('gedi_image_list', CompositeMethod.mosaic, 'region_10000ha', None), ('gedi_image_list', CompositeMethod.mosaic, None, '2020-09-01'), - ('l8_9_image_list', CompositeMethod.medoid, 'region_10000ha', None), - ('l8_9_image_list', CompositeMethod.medoid, None, '2021-10-01'), + ('l8_9_images', CompositeMethod.medoid, 'region_10000ha', None), + ('l8_9_images', CompositeMethod.medoid, None, '2021-10-01'), ], ) def test_composite_region_date_ordering(image_list, method, region, date, request): @@ -402,18 +387,14 @@ def test_composite_region_date_ordering(image_list, method, region, date, reques elif date: # test images are ordered by time difference with `date` im_dates = np.array( - [datetime.utcfromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] + [datetime.fromtimestamp(im_props['system:time_start'] / 1000) for im_props in properties.values()] ) comp_date = datetime.strptime(date, '%Y-%m-%d') im_date_diff = np.abs(comp_date - im_dates) assert all(sorted(im_date_diff, reverse=True) == im_date_diff) -def _get_masked_portion( - ee_image: ee.Image, - proj: ee.Projection = None, - region: dict = None, -) -> ee.Number: +def _get_masked_portion(ee_image: ee.Image, proj: ee.Projection = None, region: dict = None) -> ee.Number: """Return the valid portion of the ``ee_image`` inside ``region``. Assumes the ``region`` is completely covered by ``ee_image``. """ @@ -426,17 +407,18 @@ def _get_masked_portion( @pytest.mark.parametrize( 'image_list, method, mask', [ - ('s2_sr_image_list', CompositeMethod.q_mosaic, True), - ('s2_sr_image_list', CompositeMethod.mosaic, False), - ('l8_9_image_list', CompositeMethod.medoid, True), - ('l8_9_image_list', CompositeMethod.median, False), - ('s2_sr_image_list', CompositeMethod.medoid, True), - ('s2_sr_image_list', CompositeMethod.medoid, False), - ('l8_9_image_list', CompositeMethod.medoid, False), + ('s2_sr_hm_images', CompositeMethod.q_mosaic, True), + ('s2_sr_hm_images', CompositeMethod.mosaic, False), + ('l8_9_images', CompositeMethod.medoid, True), + ('l8_9_images', CompositeMethod.median, False), + ('s2_sr_hm_images', CompositeMethod.medoid, True), + ('s2_sr_hm_images', CompositeMethod.medoid, False), + ('l8_9_images', CompositeMethod.medoid, False), ], ) def test_composite_mask(image_list, method, mask, region_100ha, request): """In MaskedImage.composite(), test masking of component and composite images with the `mask` parameter.""" + # TODO: combine >1 getInfo() calls into 1 for all tests # form the composite collection and image image_list: List = request.getfixturevalue(image_list) gd_collection = MaskedCollection.from_list(image_list) @@ -452,8 +434,10 @@ def get_masked_portions(ee_image: ee.Image, portions: ee.List) -> ee.List: return ee.List(portions).add(portion) # get the mask portions for the component and composite images - component_portions = np.array(ee_collection.iterate(get_masked_portions, ee.List([])).getInfo()) - composite_portion = _get_masked_portion(composite_im.ee_image, proj=proj, region=region_100ha).getInfo() + component_portions = ee_collection.iterate(get_masked_portions, ee.List([])) + composite_portion = _get_masked_portion(composite_im.ee_image, proj=proj, region=region_100ha) + component_portions, composite_portion = ee.List([component_portions, composite_portion]).getInfo() + component_portions = np.array(component_portions) # test masking of components and composite image if mask: @@ -461,7 +445,7 @@ def get_masked_portions(ee_image: ee.Image, portions: ee.List) -> ee.List: assert composite_portion <= np.sum(component_portions) assert composite_portion >= np.min(component_portions) else: - assert component_portions == pytest.approx(100, abs=1) + assert component_portions == pytest.approx(100, abs=2) assert composite_portion >= component_portions.max() @@ -469,8 +453,8 @@ def get_masked_portions(ee_image: ee.Image, portions: ee.List) -> ee.List: 'masked_image, method, mask_kwargs', [ ('s2_sr_hm_nocp_masked_image', 'q-mosaic', dict(mask_method='cloud-prob')), - ('s2_sr_hm_qa_mask_masked_image', 'mosaic', dict(mask_method='qa')), ('s2_sr_hm_qa_zero_masked_image', 'medoid', dict(mask_method='qa')), + ('s2_sr_hm_nocs_masked_image', 'median', dict(mask_method='cloud-score')), ], ) def test_s2_composite_mask_missing_data(masked_image: str, method: str, mask_kwargs: dict, region_100ha, request): @@ -478,7 +462,7 @@ def test_s2_composite_mask_missing_data(masked_image: str, method: str, mask_kwa the composite image is also fully masked. """ # form the composite collection and image - masked_image: List = request.getfixturevalue(masked_image) + masked_image: MaskedImage = request.getfixturevalue(masked_image) image_list = [masked_image] gd_collection = MaskedCollection.from_list(image_list) @@ -496,15 +480,15 @@ def test_s2_composite_mask_missing_data(masked_image: str, method: str, mask_kwa assert component_portion == composite_portion == 0 -def test_s2_composite_q_mosaic_missing_data(s2_sr_hm_nocp_masked_image: MaskedImage, region_100ha: dict): +def test_s2_composite_q_mosaic_missing_data(s2_sr_hm_nocs_masked_image: MaskedImage, region_100ha: dict): """In MaskedImage.composite(), test when an S2 component image is unmasked, but has masked CLOUD_DIST band due to missing cloud data, the composite image is fully masked with 'q-mosaic' method. """ # form the composite collection and image - image_list = [s2_sr_hm_nocp_masked_image] + image_list = [s2_sr_hm_nocs_masked_image] gd_collection = MaskedCollection.from_list(image_list) - kwargs = dict(method='q-mosaic', mask_method='cloud-prob', mask=False) + kwargs = dict(method='q-mosaic', mask_method='cloud-score', mask=False) ee_collection = gd_collection._prepare_for_composite(**kwargs) composite_im = gd_collection.composite(**kwargs) properties = gd_collection._get_properties(ee_collection) @@ -519,57 +503,63 @@ def test_s2_composite_q_mosaic_missing_data(s2_sr_hm_nocp_masked_image: MaskedIm @pytest.mark.parametrize( - 'image_list, resampling, std_scale', + 'image_list, resampling, scale', [ - ('s2_sr_image_list', ResamplingMethod.bilinear, 60), - ('s2_sr_image_list', ResamplingMethod.bicubic, 60), - ('s2_sr_image_list', ResamplingMethod.average, 120), - ('l8_9_image_list', ResamplingMethod.bilinear, 30), - ('l8_9_image_list', ResamplingMethod.bicubic, 30), - ('l8_9_image_list', ResamplingMethod.average, 120), + ('s2_sr_hm_images', ResamplingMethod.bilinear, 7.5), + ('s2_sr_hm_images', ResamplingMethod.bicubic, 7.5), + ('s2_sr_hm_images', ResamplingMethod.average, 30), + ('l8_9_images', ResamplingMethod.bilinear, 20), + ('l8_9_images', ResamplingMethod.bicubic, 20), + ('l8_9_images', ResamplingMethod.average, 50), ], ) def test_composite_resampling( image_list: str, resampling: ResamplingMethod, - std_scale: float, - region_10000ha: Dict, + scale: float, + region_100ha: Dict, request: pytest.FixtureRequest, ): """Test that resampling smooths the composite image.""" - image_list: List = request.getfixturevalue(image_list) gd_collection = MaskedCollection.from_list(image_list) - comp_im_before = gd_collection.composite(method=CompositeMethod.mosaic, mask=False) - comp_im_after = gd_collection.composite(method=CompositeMethod.mosaic, resampling=resampling, mask=False) + comp_im = gd_collection.composite(method=CompositeMethod.mosaic, mask=False) + comp_im_resampled = gd_collection.composite(method=CompositeMethod.mosaic, resampling=resampling, mask=False) + + # find mean of std deviations of reflectance bands for each composite image + crs = gd_collection.ee_collection.first().select(0).projection().crs() + stds = [] + for im in [comp_im, comp_im_resampled]: + im = im.ee_image.select(gd_collection.refl_bands) + im = im.reproject(crs=crs, scale=scale) # required to resample at scale + std = im.reduceRegion('stdDev', geometry=region_100ha).values().reduce('mean') + stds.append(std) + stds = ee.List(stds).getInfo() - # test the resampled composite is smoother than the default composite - std_before = get_image_std(comp_im_before.ee_image, region_10000ha, std_scale) - std_after = get_image_std(comp_im_after.ee_image, region_10000ha, std_scale) - assert std_before > std_after + # test comp_im_resampled is smoother than comp_im + assert stds[1] < stds[0] -def test_composite_s2_cloud_mask_params(s2_sr_image_list, region_10000ha): +def test_composite_s2_cloud_mask_params(s2_sr_hm_images, region_100ha): """ Test cloud/shadow mask **kwargs are passed from MaskedCollection.composite() through to Sentinel2ClImage._aux_image(). """ - gd_collection = MaskedCollection.from_list(s2_sr_image_list) - comp_im_prob80 = gd_collection.composite(prob=80) - comp_im_prob80._set_region_stats(region_10000ha, scale=gd_collection.stats_scale) - comp_im_prob40 = gd_collection.composite(prob=40) - comp_im_prob40._set_region_stats(region_10000ha, scale=gd_collection.stats_scale) - prob80_portion = comp_im_prob80.properties['FILL_PORTION'] - prob40_portion = comp_im_prob40.properties['FILL_PORTION'] - assert prob80_portion > prob40_portion + gd_collection = MaskedCollection.from_list(s2_sr_hm_images) + comp_ims = [] + for score in [0.3, 0.5]: + comp_im = gd_collection.composite(mask_method='cloud-score', score=score) + comp_im._set_region_stats(region_100ha, scale=gd_collection.stats_scale) + comp_ims.append(comp_im) + assert comp_ims[0].properties['FILL_PORTION'] > comp_ims[1].properties['FILL_PORTION'] -def test_composite_landsat_cloud_mask_params(l8_9_image_list, region_10000ha): +def test_composite_landsat_cloud_mask_params(l8_9_images, region_10000ha): """ Test cloud/shadow mask **kwargs are passed from MaskedCollection.composite() through to LandsatImage._aux_image(). """ - gd_collection = MaskedCollection.from_list(l8_9_image_list) + gd_collection = MaskedCollection.from_list(l8_9_images) comp_im_wshadows = gd_collection.composite(mask_shadows=False) comp_im_wshadows._set_region_stats(region_10000ha, scale=gd_collection.stats_scale) comp_im_woshadows = gd_collection.composite(mask_shadows=True) @@ -582,42 +572,25 @@ def test_composite_landsat_cloud_mask_params(l8_9_image_list, region_10000ha): @pytest.mark.parametrize( 'image_list, method, mask, region, date, cloud_kwargs', [ - ('s2_sr_image_list', CompositeMethod.q_mosaic, True, 'region_100ha', None, {}), - ('s2_sr_image_list', CompositeMethod.mosaic, True, None, '2021-10-01', {}), - ('s2_sr_image_list', CompositeMethod.medoid, False, None, None, {}), - ( - 's2_sr_image_list', - CompositeMethod.median, - True, - None, - None, - dict( - mask_method='qa', - mask_cirrus=False, - mask_shadows=False, - prob=60, - dark=0.2, - shadow_dist=500, - buffer=500, - cdi_thresh=None, - max_cloud_dist=2000, - ), - ), - ('l8_9_image_list', CompositeMethod.q_mosaic, True, 'region_100ha', None, {}), - ('l8_9_image_list', CompositeMethod.mosaic, False, None, '2022-03-01', {}), - ('l8_9_image_list', CompositeMethod.medoid, True, None, None, dict(mask_cirrus=False, mask_shadows=False)), - ('l8_9_image_list', CompositeMethod.median, True, None, None, {}), - ('l4_5_image_list', CompositeMethod.q_mosaic, False, 'region_100ha', None, {}), + ('s2_sr_hm_images', CompositeMethod.q_mosaic, True, 'region_100ha', None, {}), + ('s2_sr_hm_images', CompositeMethod.mosaic, True, None, '2021-10-01', {}), + ('s2_sr_hm_images', CompositeMethod.medoid, False, None, None, {}), + ('s2_sr_hm_images', CompositeMethod.median, True, None, None, dict(mask_method='cloud-score', score=0.4)), + ('l8_9_images', CompositeMethod.q_mosaic, True, 'region_100ha', None, {}), + ('l8_9_images', CompositeMethod.mosaic, False, None, '2022-03-01', {}), + ('l8_9_images', CompositeMethod.medoid, True, None, None, dict(mask_cirrus=False, mask_shadows=False)), + ('l8_9_images', CompositeMethod.median, True, None, None, {}), + ('l4_5_images', CompositeMethod.q_mosaic, False, 'region_100ha', None, {}), ( - 'l4_5_image_list', + 'l4_5_images', CompositeMethod.mosaic, True, None, '1988-01-01', dict(mask_cirrus=False, mask_shadows=False), ), - ('l4_5_image_list', CompositeMethod.medoid, True, None, None, {}), - ('l4_5_image_list', CompositeMethod.median, True, None, None, {}), + ('l4_5_images', CompositeMethod.medoid, True, None, None, {}), + ('l4_5_images', CompositeMethod.median, True, None, None, {}), ('gedi_image_list', CompositeMethod.mosaic, True, 'region_100ha', None, {}), ('gedi_image_list', CompositeMethod.mosaic, True, None, '2020-09-01', {}), ('gedi_image_list', CompositeMethod.medoid, True, None, None, {}), @@ -651,15 +624,14 @@ def test_composite_errors(gedi_image_list, region_100ha): empty_collection.composite(method=CompositeMethod.mosaic) -@pytest.mark.parametrize('image_list', ['s2_sr_image_list', 'l8_9_image_list']) +@pytest.mark.parametrize('image_list', ['s2_sr_hm_images', 'l8_9_images']) def test_composite_date(image_list: str, request: pytest.FixtureRequest): """Test the composite date is the same as the first input image date.""" - image_list: List = request.getfixturevalue(image_list) gd_collection = MaskedCollection.from_list(image_list) - # assumes the image_list's are in date order - first_date = datetime.utcfromtimestamp( - gd_collection.ee_collection.first().get('system:time_start').getInfo() / 1000 + first_date = datetime.fromtimestamp( + gd_collection.ee_collection.sort('system:time_start').first().get('system:time_start').getInfo() / 1000, + tz=timezone.utc, ) comp_im = gd_collection.composite() assert comp_im.date == first_date @@ -670,18 +642,16 @@ def test_composite_mult_kwargs(region_100ha): When a search filtered collection is composited, test that masks change with different cloud/shadow kwargs i.e. test that image *_MASK bands are overwritten in the encapsulated collection. """ - gd_collection = MaskedCollection.from_name('COPERNICUS/S2_SR') + gd_collection = MaskedCollection.from_name('COPERNICUS/S2_SR_HARMONIZED') filt_collection = gd_collection.search('2022-01-01', '2022-01-10', region_100ha) - comp_im_prob80 = filt_collection.composite(prob=80) - comp_im_prob80._set_region_stats(region_100ha, scale=filt_collection.stats_scale) - comp_im_prob40 = filt_collection.composite(prob=40) - comp_im_prob40._set_region_stats(region_100ha, scale=filt_collection.stats_scale) - - cp_prob80 = comp_im_prob80.properties['FILL_PORTION'] - cp_prob40 = comp_im_prob40.properties['FILL_PORTION'] + comp_ims = [] + for score in [0.3, 0.5]: + comp_im = filt_collection.composite(mask_method='cloud-score', score=score) + comp_im._set_region_stats(region_100ha, scale=filt_collection.stats_scale) + comp_ims.append(comp_im) - assert cp_prob80 != pytest.approx(cp_prob40, abs=1e-1) + assert comp_ims[0].properties['FILL_PORTION'] != pytest.approx(comp_ims[1].properties['FILL_PORTION'], abs=1e-1) @pytest.mark.parametrize('name', ['FAO/WAPOR/2/L1_RET_E', 'MODIS/006/MCD43A4']) diff --git a/tests/test_download.py b/tests/test_download.py index d01dd42..17ccb0e 100644 --- a/tests/test_download.py +++ b/tests/test_download.py @@ -14,29 +14,30 @@ limitations under the License. """ -import copy +from __future__ import annotations + import pathlib -from datetime import datetime -from typing import Dict, Tuple, List +from datetime import datetime, timezone +from itertools import product +from typing import Dict, List import ee import numpy as np import pytest import rasterio as rio -from rasterio import Affine, windows -from rasterio import features, warp -from rasterio.crs import CRS +from rasterio import Affine, features, warp, windows from geedim import utils -from geedim.download import BaseImage -from geedim.enums import ResamplingMethod, ExportType +from geedim.download import _nodata_vals, BaseImage +from geedim.enums import ExportType, ResamplingMethod +from tests.conftest import region_25ha class BaseImageLike: - """Emulate BaseImage for _get_tile_shape() and tiles().""" + """Mock ``BaseImage`` for ``_get_tile_shape()`` and ``tiles()``.""" def __init__( - self, shape: Tuple[int, int], count: int = 10, dtype: str = 'uint16', transform: Affine = Affine.identity() + self, shape: tuple[int, int], count: int = 10, dtype: str = 'uint16', transform: Affine = Affine.identity() ): self.shape = shape self.count = count @@ -49,6 +50,22 @@ def __init__( _get_tile_shape = BaseImage._get_tile_shape +def _bounds(geom: dict, dst_crs: str | rio.CRS = 'EPSG:4326') -> tuple[float, ...]: + """Return the bounds of GeoJSON polygon ``geom`` in the ``dst_crs`` CRS.""" + # transform geom, then find bounds (if geom is an ee footprint, finding its bounds then transforming expands + # bounds beyond their true location) + src_crs = utils.rio_crs(geom['crs']['properties']['name']) if 'crs' in geom else 'EPSG:4326' + dst_crs = utils.rio_crs(dst_crs) or 'EPSG:4326' + geom = geom if dst_crs == src_crs else warp.transform_geom(src_crs, dst_crs, geom) + return features.bounds(geom) + + +def _intersect_bounds(bounds1: tuple[float, ...], bounds2: tuple[float, ...]) -> tuple[float, ...] | None: + """Return the intersection of ``bounds1`` and ``bounds2``, or ``None`` when there is no intersection.""" + bounds = np.array([*np.fmax(bounds1[:2], bounds2[:2]), *np.fmin(bounds1[2:], bounds2[2:])]) + return tuple(bounds.tolist()) if np.all((bounds[2:] - bounds[:2]) > 0) else None + + @pytest.fixture(scope='session') def user_base_image() -> BaseImage: """A BaseImage instance where the encapsulated image has no fixed projection or ID.""" @@ -57,17 +74,26 @@ def user_base_image() -> BaseImage: @pytest.fixture(scope='session') def user_fix_base_image() -> BaseImage: + """A BaseImage instance where the encapsulated image has a fixed projection (EPSG:4326), a scale in degrees, + is unbounded and has no ID. """ - A BaseImage instance where the encapsulated image has a fixed projection (EPSG:4326), a scale in degrees, - and no footprint or ID. + return BaseImage(ee.Image([1, 2, 3]).setDefaultProjection(crs='EPSG:4326', scale=30)) + + +@pytest.fixture(scope='session') +def user_fix_bnd_base_image(region_10000ha) -> BaseImage: + """A BaseImage instance where the encapsulated image has a fixed projection (EPSG:4326), a scale in degrees, + is bounded, and has no ID. """ - return BaseImage(ee.Image([1, 2, 3]).reproject(crs='EPSG:4326', scale=30)) + return BaseImage( + ee.Image([1, 2, 3]).setDefaultProjection(crs='EPSG:4326', scale=30).clipToBoundsAndScale(region_10000ha) + ) @pytest.fixture(scope='session') -def s2_sr_base_image(s2_sr_image_id: str) -> BaseImage: +def s2_sr_hm_base_image(s2_sr_hm_image_id: str) -> BaseImage: """A BaseImage instance encapsulating a Sentinel-2 image. Covers `region_*ha`.""" - return BaseImage.from_id(s2_sr_image_id) + return BaseImage.from_id(s2_sr_hm_image_id) @pytest.fixture(scope='session') @@ -97,7 +123,15 @@ def modis_nbar_base_image_unbnd(modis_nbar_image_id: str) -> BaseImage: @pytest.fixture(scope='session') def modis_nbar_base_image(modis_nbar_image_id: str, region_100ha: Dict) -> BaseImage: """A BaseImage instance encapsulating a MODIS NBAR image. Covers `region_*ha`.""" - return BaseImage(ee.Image(modis_nbar_image_id).clip(region_100ha)) + return BaseImage(ee.Image(modis_nbar_image_id).clipToBoundsAndScale(region_100ha)) + + +@pytest.fixture(scope='session') +def google_dyn_world_base_image(google_dyn_world_image_id: str) -> BaseImage: + """A BaseImage instance encapsulating a Google Dynamic World image with positive y-axis transform. Covers + `region_*ha`. + """ + return BaseImage.from_id(google_dyn_world_image_id) def bounds_polygon(left: float, bottom: float, right: float, top: float, crs: str = None): @@ -117,48 +151,50 @@ def bounds_polygon(left: float, bottom: float, right: float, top: float, crs: st return poly -def _test_export_profile(exp_profile, tgt_profile, transform_shape=False): - """ - Test an export/download rasterio profile against a target rasterio profile. - ``crs_transform`` specifies whether the export/download profile was generated by specifying crs_transform. +def _test_export_image(exp_image: BaseImage, ref_image: BaseImage, **exp_kwargs): + """Test ``exp_image`` against ``ref_image``, and optional crs, region & scale ``exp_kwargs`` arguments to + ``BaseImage._prepare_for_export``. """ + # remove None value items from exp_kwargs + exp_kwargs = {k: v for k, v in exp_kwargs.items() if v is not None} - for key in ['dtype', 'count']: - assert exp_profile[key] == tgt_profile[key] + assert exp_image.dtype == exp_kwargs.get('dtype', ref_image.dtype) + assert exp_image.band_properties == ref_image.band_properties - assert utils.rio_crs(exp_profile['crs']) == utils.rio_crs(tgt_profile['crs']) - assert exp_profile['transform'][0] == tgt_profile['transform'][0] + # test crs and scale + crs = exp_kwargs.get('crs', ref_image.crs) + assert exp_image.crs == crs - if transform_shape: - for key in ['width', 'height']: - assert exp_profile[key] == tgt_profile[key] - assert exp_profile['transform'][:6] == pytest.approx(tgt_profile['transform'][:6], rel=1e-9) + if 'shape' in exp_kwargs: + assert exp_image.shape == exp_kwargs['shape'] else: - assert exp_profile['transform'][:6] == pytest.approx(tgt_profile['transform'][:6], rel=0.05) + ref_scale = exp_kwargs.get('scale', ref_image.scale) + assert exp_image.scale == ref_scale - tgt_bounds = windows.bounds( - windows.Window(0, 0, tgt_profile['width'], tgt_profile['height']), tgt_profile['transform'] - ) - exp_bounds = windows.bounds( - windows.Window(0, 0, exp_profile['width'], exp_profile['height']), exp_profile['transform'] - ) - if transform_shape: - assert exp_bounds == pytest.approx(tgt_bounds, rel=1e-9) - else: - assert exp_bounds == pytest.approx(tgt_bounds, rel=0.05) + # test export bounds contain reference bounds + region = exp_kwargs.get('region', ref_image.footprint) + ref_bounds = _bounds(region, exp_image.crs) + exp_bounds = _bounds(exp_image.footprint, exp_image.crs) + tol = 1e-9 if exp_image.crs == 'EPSG:4326' else 1e-6 + assert _intersect_bounds(exp_bounds, ref_bounds) == pytest.approx(ref_bounds, abs=tol) + # test export transform is on the reference grid + if {'crs', 'scale', 'shape'}.isdisjoint(exp_kwargs.keys()): + ji = ~exp_image.transform * (ref_image.transform[2], ref_image.transform[5]) + assert ji == pytest.approx(np.round(ji), abs=1e-6) -def test_id_name(user_base_image: BaseImage, s2_sr_base_image: BaseImage): - """Test `id` and `name` properties for different scenarios.""" + +def test_id_name(user_base_image: BaseImage, s2_sr_hm_base_image: BaseImage): + """Test ``id`` and ``name`` properties for different scenarios.""" assert user_base_image.id is None assert user_base_image.name is None # check that BaseImage.from_id() sets id without a getInfo - assert s2_sr_base_image._id is not None - assert s2_sr_base_image.name == s2_sr_base_image.id.replace('/', '-') + assert s2_sr_hm_base_image._id is not None + assert s2_sr_hm_base_image.name == s2_sr_hm_base_image.id.replace('/', '-') def test_user_props(user_base_image: BaseImage): - """Test non fixed projection image properties (other than id and has_fixed_projection).""" + """Test non fixed projection image properties (other than ``id`` and ``has_fixed_projection``).""" assert user_base_image.crs is None assert user_base_image.scale is None assert user_base_image.transform is None @@ -171,9 +207,9 @@ def test_user_props(user_base_image: BaseImage): def test_fix_user_props(user_fix_base_image: BaseImage): - """Test fixed projection image properties (other than id and has_fixed_projection).""" + """Test fixed projection image properties (other than ``id`` and ``has_fixed_projection``).""" assert user_fix_base_image.crs == 'EPSG:4326' - assert user_fix_base_image.scale < 1 + assert user_fix_base_image.scale == pytest.approx(30, abs=1e-6) assert user_fix_base_image.transform is not None assert user_fix_base_image.shape is None assert user_fix_base_image.date is None @@ -183,26 +219,28 @@ def test_fix_user_props(user_fix_base_image: BaseImage): assert user_fix_base_image.count == 3 -def test_s2_props(s2_sr_base_image: BaseImage): - """Test fixed projection S2 image properties (other than id and has_fixed_projection).""" - min_band_info = s2_sr_base_image._ee_info['bands'][1] - assert s2_sr_base_image.crs == min_band_info['crs'] - assert s2_sr_base_image.scale == min_band_info['crs_transform'][0] - assert s2_sr_base_image.transform == Affine(*min_band_info['crs_transform']) - assert s2_sr_base_image.shape == min_band_info['dimensions'][::-1] - assert s2_sr_base_image.date == datetime.utcfromtimestamp(s2_sr_base_image.properties['system:time_start'] / 1000) - assert s2_sr_base_image.size is not None - assert s2_sr_base_image.footprint is not None - assert s2_sr_base_image.footprint['type'] == 'Polygon' - assert s2_sr_base_image.dtype == 'uint32' - assert s2_sr_base_image.count == len(s2_sr_base_image._ee_info['bands']) +def test_s2_props(s2_sr_hm_base_image: BaseImage): + """Test fixed projection S2 image properties (other than ``id`` and ``has_fixed_projection``).""" + min_band_info = s2_sr_hm_base_image._ee_info['bands'][1] + assert s2_sr_hm_base_image.crs == min_band_info['crs'] + assert s2_sr_hm_base_image.scale == min_band_info['crs_transform'][0] + assert s2_sr_hm_base_image.transform == Affine(*min_band_info['crs_transform']) + assert s2_sr_hm_base_image.shape == tuple(min_band_info['dimensions'][::-1]) + assert s2_sr_hm_base_image.date == datetime.fromtimestamp( + s2_sr_hm_base_image.properties['system:time_start'] / 1000, timezone.utc + ) + assert s2_sr_hm_base_image.size is not None + assert s2_sr_hm_base_image.footprint is not None + assert s2_sr_hm_base_image.footprint['type'] == 'Polygon' + assert s2_sr_hm_base_image.dtype == 'uint32' + assert s2_sr_hm_base_image.count == len(s2_sr_hm_base_image._ee_info['bands']) @pytest.mark.parametrize( - 'base_image', ['landsat_ndvi_base_image', 's2_sr_base_image', 'l9_base_image', 'modis_nbar_base_image'] + 'base_image', ['landsat_ndvi_base_image', 's2_sr_hm_base_image', 'l9_base_image', 'modis_nbar_base_image'] ) def test_band_props(base_image: str, request: pytest.FixtureRequest): - """Test `band_properties` completeness for generic/user/reflectance images.""" + """Test ``band_properties`` completeness for generic / user / reflectance images.""" base_image: BaseImage = request.getfixturevalue(base_image) assert base_image.band_properties is not None assert [bd['name'] for bd in base_image.band_properties] == [bd['id'] for bd in base_image._ee_info['bands']] @@ -211,30 +249,32 @@ def test_band_props(base_image: str, request: pytest.FixtureRequest): assert all(has_key) -def test_has_fixed_projection(user_base_image: BaseImage, user_fix_base_image: BaseImage, s2_sr_base_image): - """Test the `has_fixed_projection` property.""" +def test_has_fixed_projection(user_base_image: BaseImage, user_fix_base_image: BaseImage, s2_sr_hm_base_image): + """Test the ``has_fixed_projection`` property.""" assert not user_base_image.has_fixed_projection assert user_fix_base_image.has_fixed_projection - assert s2_sr_base_image.has_fixed_projection + assert s2_sr_hm_base_image.has_fixed_projection -# yapf: disable @pytest.mark.parametrize( - 'ee_data_type_list, exp_dtype', [ + 'ee_data_type_list, exp_dtype', + [ ([{'precision': 'int', 'min': 10, 'max': 11}, {'precision': 'int', 'min': 100, 'max': 101}], 'uint8'), ([{'precision': 'int', 'min': -128, 'max': -100}, {'precision': 'int', 'min': 0, 'max': 127}], 'int8'), ([{'precision': 'int', 'min': 256, 'max': 257}], 'uint16'), ([{'precision': 'int', 'min': -32768, 'max': 32767}], 'int16'), ([{'precision': 'int', 'min': 2**15, 'max': 2**32 - 1}], 'uint32'), - ([{'precision': 'int', 'min': -2**31, 'max': 2**31 - 1}], 'int32'), - ([{'precision': 'float', 'min': 0., 'max': 1.e9}, {'precision': 'float', 'min': 0., 'max': 1.}], 'float32'), - ([{'precision': 'int', 'min': 0., 'max': 2**31 - 1}, {'precision': 'float', 'min': 0., 'max': 1.}], 'float64'), + ([{'precision': 'int', 'min': -(2**31), 'max': 2**31 - 1}], 'int32'), + ([{'precision': 'float', 'min': 0.0, 'max': 1.0e9}, {'precision': 'float', 'min': 0.0, 'max': 1.0}], 'float32'), + ( + [{'precision': 'int', 'min': 0.0, 'max': 2**31 - 1}, {'precision': 'float', 'min': 0.0, 'max': 1.0}], + 'float64', + ), ([{'precision': 'int', 'min': 0, 'max': 255}, {'precision': 'double', 'min': -1e100, 'max': 1e100}], 'float64'), - ] + ], ) -# yapf: enable def test_min_dtype(ee_data_type_list: List, exp_dtype: str): - """Test BasicImage.__get_min_dtype() with emulated EE info dicts.""" + """Test ``BasicImage.__get_min_dtype()`` with emulated EE info dicts.""" ee_info = dict(bands=[]) for ee_data_type in ee_data_type_list: ee_info['bands'].append(dict(data_type=ee_data_type)) @@ -242,7 +282,7 @@ def test_min_dtype(ee_data_type_list: List, exp_dtype: str): def test_convert_dtype_error(): - """Test BaseImage.test_convert_dtype() raises an error with incorrect dtype.""" + """Test ``BaseImage.test_convert_dtype()`` raises an error with incorrect dtype.""" with pytest.raises(TypeError): BaseImage._convert_dtype(ee.Image(1), dtype='unknown') @@ -265,11 +305,10 @@ def test_str_format_size(size: int, exp_str: str): dict(region='region_25ha', scale=100), dict(crs_transform=Affine.identity(), shape=(100, 100)), ], -) # yapf: disable +) def test_prepare_no_fixed_projection(user_base_image: BaseImage, params: Dict, request: pytest.FixtureRequest): - """ - Test BaseImage._prepare_for_export raises an exception when the image has no fixed projection, and insufficient - crs & region defining parameters are specified. + """Test ``BaseImage._prepare_for_export()`` raises an exception when the image has no fixed projection, + and insufficient CRS & region defining arguments. """ if 'region' in params: params['region'] = request.getfixturevalue(params['region']) @@ -286,13 +325,11 @@ def test_prepare_no_fixed_projection(user_base_image: BaseImage, params: Dict, r ('modis_nbar_base_image_unbnd', dict(crs='EPSG:4326', scale=100)), ('modis_nbar_base_image_unbnd', dict(crs='EPSG:4326', crs_transform=Affine.identity())), ('modis_nbar_base_image_unbnd', dict(crs='EPSG:4326', shape=(100, 100))), - ('modis_nbar_base_image_unbnd', dict(crs_transform=Affine.identity(), shape=(100, 100))), ], -) # yapf: disable +) def test_prepare_unbounded(base_image: BaseImage, params: Dict, request: pytest.FixtureRequest): - """ - Test BaseImage._prepare_for_export raises an exception when the image is unbounded, and insufficient bounds - defining parameters are specified. + """Test ``BaseImage._prepare_for_export()`` raises an exception when the image is unbounded, and insufficient + bounds defining parameters are specified. """ base_image: BaseImage = request.getfixturevalue(base_image) with pytest.raises(ValueError) as ex: @@ -301,10 +338,7 @@ def test_prepare_unbounded(base_image: BaseImage, params: Dict, request: pytest. def test_prepare_exceptions(user_base_image: BaseImage, user_fix_base_image: BaseImage, region_25ha: Dict): - """Test remaining BaseImage._prepare_for_export() error cases.""" - with pytest.raises(ValueError): - # EPSG:4326 and no scale - user_fix_base_image._prepare_for_export(region=region_25ha) + """Test remaining ``BaseImage._prepare_for_export()`` error cases.""" with pytest.raises(ValueError): # no fixed projection and resample user_base_image._prepare_for_export( @@ -314,196 +348,181 @@ def test_prepare_exceptions(user_base_image: BaseImage, user_fix_base_image: Bas @pytest.mark.parametrize( 'base_image', - ['s2_sr_base_image', 'l9_base_image', 'modis_nbar_base_image'], + [ + 'user_fix_bnd_base_image', + 's2_sr_hm_base_image', + 'l9_base_image', + 'modis_nbar_base_image', + 'google_dyn_world_base_image', + ], ) def test_prepare_defaults(base_image: str, request: pytest.FixtureRequest): - """Test BaseImage._prepare_for_export() with no (i.e. default) arguments with bounded images.""" + """Test ``BaseImage._prepare_for_export()`` with no (i.e. default) arguments.""" base_image: BaseImage = request.getfixturevalue(base_image) exp_image = base_image._prepare_for_export() - tgt_profile = base_image.profile - _test_export_profile(exp_image.profile, tgt_profile, True) - assert exp_image.scale == base_image.scale + _test_export_image(exp_image, base_image) @pytest.mark.parametrize( - 'base_image, param_image', + 'base_image, crs, crs_transform, shape', [ - ('s2_sr_base_image', 's2_sr_base_image'), - ('l9_base_image', 's2_sr_base_image'), - ('modis_nbar_base_image', 's2_sr_base_image'), - ('user_base_image', 's2_sr_base_image'), - ('user_fix_base_image', 's2_sr_base_image'), - ('l9_base_image', 'l9_base_image'), - ('s2_sr_base_image', 'l9_base_image'), - ('modis_nbar_base_image', 'l9_base_image'), - ('user_base_image', 'l9_base_image'), - ('user_fix_base_image', 'l9_base_image'), - ('l9_base_image', 'modis_nbar_base_image'), - ('s2_sr_base_image', 'modis_nbar_base_image'), - ('modis_nbar_base_image', 'modis_nbar_base_image'), - ('user_base_image', 'modis_nbar_base_image'), - ('user_fix_base_image', 'modis_nbar_base_image'), - ], # yapf: disable + ('user_base_image', 'EPSG:4326', (-1e-3, 0, -180.1, 0, 2e-3, 0.1), (300, 400)), + ('user_fix_base_image', 'EPSG:32734', (10, 0, 100, 0, 10, 200), (300, 400)), + ('s2_sr_hm_base_image', 'EPSG:3857', (10, 0, 100, 0, -10, 200), (300, 400)), + ], ) -def test_prepare_transform_shape(base_image: str, param_image: str, request: pytest.FixtureRequest): - """Test BaseImage._prepare_for_export() with crs_transform and shape parameters.""" +def test_prepare_transform_shape( + base_image: str, crs: str, crs_transform: tuple[float, ...], shape: tuple[int, int], request: pytest.FixtureRequest +): + """Test ``BaseImage._prepare_for_export()`` with ``crs_transform`` and ``shape`` parameters.""" base_image: BaseImage = request.getfixturevalue(base_image) - param_image: BaseImage = request.getfixturevalue(param_image) + exp_image = base_image._prepare_for_export(crs=crs, crs_transform=crs_transform, shape=shape) - exp_params = dict( - crs=param_image.crs, crs_transform=param_image.transform, shape=param_image.shape, dtype=param_image.dtype - ) - exp_image = base_image._prepare_for_export(**exp_params) + assert exp_image.dtype == base_image.dtype + assert exp_image.band_properties == base_image.band_properties - tgt_profile = param_image.profile - tgt_profile.update(count=base_image.count) - - _test_export_profile(exp_image.profile, tgt_profile, True) - assert exp_image.scale == param_image.scale + assert exp_image.crs == crs or base_image.crs + # assert exp_image.scale == np.abs((crs_transform[0], crs_transform[4])).mean() + assert exp_image.shape == shape + assert exp_image.transform[:6] == crs_transform @pytest.mark.parametrize( - 'base_image, param_image', + 'base_image, crs, region, scale', [ - ('s2_sr_base_image', 's2_sr_base_image'), - ('l9_base_image', 's2_sr_base_image'), - ('modis_nbar_base_image', 's2_sr_base_image'), - ('user_base_image', 's2_sr_base_image'), - ('user_fix_base_image', 's2_sr_base_image'), - ('l9_base_image', 'l9_base_image'), - ('s2_sr_base_image', 'l9_base_image'), - ('modis_nbar_base_image', 'l9_base_image'), - ('user_base_image', 'l9_base_image'), - ('user_fix_base_image', 'l9_base_image'), - ('l9_base_image', 'modis_nbar_base_image'), - ('s2_sr_base_image', 'modis_nbar_base_image'), - ('modis_nbar_base_image', 'modis_nbar_base_image'), - ('user_base_image', 'modis_nbar_base_image'), - ('user_fix_base_image', 'modis_nbar_base_image'), + ('user_base_image', 'EPSG:3857', 'region_25ha', 0.1), + ('user_fix_base_image', 'EPSG:32734', 'region_25ha', 30), + ('l9_base_image', 'EPSG:3857', 'region_100ha', 10), + ('s2_sr_hm_base_image', 'EPSG:32734', 'region_100ha', 30), + ('modis_nbar_base_image', 'EPSG:3857', 'region_10000ha', 1000), + ('google_dyn_world_base_image', 'EPSG:4326', 'region_10000ha', 1.0e-5), ], -) # yapf: disable -def test_prepare_region_scale(base_image: str, param_image: str, region_25ha: dict, request: pytest.FixtureRequest): - """Test BaseImage._prepare_for_export() with region and scale parameters.""" +) +def test_prepare_region_scale(base_image: str, crs: str, region: str, scale: float, request: pytest.FixtureRequest): + """Test ``BaseImage._prepare_for_export()`` with ``region`` and ``scale`` parameters.""" base_image: BaseImage = request.getfixturevalue(base_image) - _param_image: BaseImage = request.getfixturevalue(param_image) - param_image = copy.deepcopy(_param_image) # avoid changing session fixture - # clip param_image, so that param_image.transform can be tested against below - param_image.ee_image = param_image.ee_image.clip(region_25ha) + region: dict = request.getfixturevalue(region) if region else None - exp_params = dict( - crs=param_image.crs, region=param_image.footprint, scale=param_image.scale, dtype=param_image.dtype - ) - exp_image = base_image._prepare_for_export(**exp_params) - - tgt_profile = param_image.profile - tgt_profile.update(count=base_image.count) - - _test_export_profile(exp_image.profile, tgt_profile, base_image.id == param_image.id) - assert exp_image.scale == param_image.scale + exp_kwargs = dict(crs=crs, region=region, scale=scale) + exp_image = base_image._prepare_for_export(**exp_kwargs) - # test export bounds contain target bounds - exp_bounds = features.bounds(exp_image.footprint) - tgt_bounds = features.bounds(param_image.footprint) - tgt_footprint_crs = ( - param_image.footprint['crs']['properties']['name'] if 'crs' in param_image.footprint else 'EPSG:4326' - ) - exp_crs = CRS.from_string(utils.rio_crs(exp_image.crs)) - tgt_bounds = warp.transform_bounds(tgt_footprint_crs, exp_crs, *tgt_bounds) - assert ( - (exp_bounds[0] <= tgt_bounds[0]) - and (exp_bounds[1] <= tgt_bounds[1]) - and (exp_bounds[2] >= tgt_bounds[2]) - and (exp_bounds[3] >= tgt_bounds[3]) - ) + _test_export_image(exp_image, base_image, **exp_kwargs) @pytest.mark.parametrize( - 'base_image, bands', + 'base_image, crs, region, shape', [ - ('s2_sr_base_image', ['B1', 'B5']), - ('l9_base_image', ['SR_B4', 'SR_B3', 'SR_B2']), + ('user_base_image', 'EPSG:3857', 'region_25ha', (30, 40)), + ('user_fix_base_image', 'EPSG:32734', 'region_100ha', (300, 400)), + ('s2_sr_hm_base_image', 'EPSG:4326', 'region_10000ha', (300, 400)), ], -) # yapf: disable -def test_prepare_bands(base_image: str, bands: List[str], region_25ha: dict, request: pytest.FixtureRequest): - """Test BaseImage._prepare_for_export() with bands parameter.""" +) +def test_prepare_region_shape( + base_image: str, crs: str, region: str, shape: tuple[int, int], request: pytest.FixtureRequest +): + """Test ``BaseImage._prepare_for_export()`` with ``region`` and ``shape`` parameters.""" base_image: BaseImage = request.getfixturevalue(base_image) - param_image = BaseImage(base_image.ee_image.select(bands)) - - exp_image = base_image._prepare_for_export(bands=bands) + region: dict = request.getfixturevalue(region) if region else None - assert exp_image.count == len(bands) - for attr in ['crs', 'transform', 'scale', 'shape', 'band_properties']: - assert exp_image.__getattribute__(attr) == param_image.__getattribute__(attr) + exp_kwargs = dict(crs=crs, region=region, shape=shape) + exp_image = base_image._prepare_for_export(**exp_kwargs) - -def test_prepare_bands_error(s2_sr_base_image): - """Test BaseImage._prepare_for_export() raises an error with incorrect bands.""" - with pytest.raises(ValueError): - s2_sr_base_image._prepare_for_export(bands=['unknown']) + _test_export_image(exp_image, base_image, **exp_kwargs) @pytest.mark.parametrize( - 'base_image', - ['s2_sr_base_image', 'l9_base_image', 'modis_nbar_base_image'], + 'base_image, region', + [ + ('user_fix_bnd_base_image', 'region_25ha'), + ('l8_base_image', 'region_100ha'), + ('l9_base_image', 'region_10000ha'), + ('s2_sr_hm_base_image', 'region_25ha'), + ('modis_nbar_base_image', 'region_100ha'), + ('google_dyn_world_base_image', 'region_10000ha'), + ], ) -def test_prepare_for_download(base_image: str, request: pytest.FixtureRequest): - """Test BaseImage._prepare_for_download() sets rasterio profile as expected.""" +def test_prepare_src_grid(base_image: str, region: str, request: pytest.FixtureRequest): + """Test ``BaseImage._prepare_for_export()`` maintains the source pixel grid, with default value ``crs`` and + ``scale`` arguments. + """ base_image: BaseImage = request.getfixturevalue(base_image) - exp_image, exp_profile = base_image._prepare_for_download() - tgt_profile = base_image.profile - _test_export_profile(exp_profile, tgt_profile, True) - assert exp_profile['nodata'] is not None + region: dict = request.getfixturevalue(region) + + exp_kwargs = dict(region=region) + exp_image = base_image._prepare_for_export(**exp_kwargs) + + _test_export_image(exp_image, base_image, **exp_kwargs) @pytest.mark.parametrize( - 'dtype, exp_nodata', - [ - ('uint8', 0), - ('int8', -(2**7)), - ('uint16', 0), - ('int16', -(2**15)), - ('uint32', 0), - ('int32', -(2**31)), - ('float32', float('-inf')), - ('float64', float('-inf')), - ], + 'base_image, bands', [('s2_sr_hm_base_image', ['B1', 'B5']), ('l9_base_image', ['SR_B4', 'SR_B3', 'SR_B2'])] ) -def test_prepare_nodata(user_fix_base_image: BaseImage, region_25ha: Dict, dtype: str, exp_nodata: float): - """Test BaseImage._prepare_for_download() sets rasterio profile nodata correctly for different dtypes.""" - exp_image, exp_profile = user_fix_base_image._prepare_for_download(region=region_25ha, scale=30, dtype=dtype) +def test_prepare_bands(base_image: str, bands: List[str], region_25ha: dict, request: pytest.FixtureRequest): + """Test ``BaseImage._prepare_for_export()`` with ``bands`` parameter.""" + base_image: BaseImage = request.getfixturevalue(base_image) + ref_image = BaseImage(base_image.ee_image.select(bands)) + exp_image = base_image._prepare_for_export(bands=bands) + + _test_export_image(exp_image, ref_image) + + +def test_prepare_bands_error(s2_sr_hm_base_image): + """Test ``BaseImage._prepare_for_export()`` raises an error with incorrect bands.""" + with pytest.raises(ValueError) as ex: + s2_sr_hm_base_image._prepare_for_export(bands=['unknown']) + assert 'band' in str(ex.value) + + +def test_prepare_for_download(s2_sr_hm_base_image: BaseImage): + """Test ``BaseImage._prepare_for_download()`` sets the rasterio profile as expected.""" + exp_image, exp_profile = s2_sr_hm_base_image._prepare_for_download() + + _test_export_image(exp_image, s2_sr_hm_base_image) + + # test dynamic values + for key in ['dtype', 'count', 'crs', 'transform']: + assert exp_profile[key] == getattr(exp_image, key), key + + assert exp_profile['width'] == exp_image.shape[1] + assert exp_profile['height'] == exp_image.shape[0] + assert exp_profile['nodata'] == _nodata_vals[exp_profile['dtype']] + + # test fixed values + ref_profile = dict(driver='GTiff', compress='deflate', interleave='band', tiled=True, photometric='MINISBLACK') + for key in ref_profile.keys(): + assert exp_profile[key] == ref_profile[key], key + + +@pytest.mark.parametrize('dtype, exp_nodata', _nodata_vals.items()) +def test_prepare_nodata(user_fix_bnd_base_image: BaseImage, dtype: str, exp_nodata: float): + """Test ``BaseImage._prepare_for_download()`` sets the ``nodata`` value correctly for different dtypes.""" + exp_image, exp_profile = user_fix_bnd_base_image._prepare_for_download(dtype=dtype) assert exp_image.dtype == dtype assert exp_profile['nodata'] == exp_nodata @pytest.mark.parametrize( - 'src_image, dtype', - [ - ('s2_sr_base_image', 'float32'), - ('l9_base_image', None), - ('modis_nbar_base_image', None), - ], -) # yapf: disable + 'src_image, dtype', [('s2_sr_hm_base_image', 'float32'), ('l9_base_image', None), ('modis_nbar_base_image', None)] +) def test_scale_offset(src_image: str, dtype: str, region_100ha: Dict, request: pytest.FixtureRequest): - """Test BaseImage._prepare_for_export(scale_offset=True) gives expected properties and reflectance ranges.""" - + """Test ``BaseImage._prepare_for_export(scale_offset=True)`` gives expected properties and reflectance ranges.""" src_image: BaseImage = request.getfixturevalue(src_image) exp_image = src_image._prepare_for_export(scale_offset=True) + assert exp_image.crs == src_image.crs assert exp_image.scale == src_image.scale assert exp_image.band_properties == src_image.band_properties assert exp_image.dtype == dtype or 'float64' - def get_min_max_refl(base_image: BaseImage) -> Dict: - """Get the min & max of each reflectance band of base_image.""" + def get_min_max_refl(base_image: BaseImage) -> tuple[dict, dict]: + """Return the min & max of each reflectance band of ``base_image``.""" band_props = base_image.band_properties - refl_bands = [ - bp['name'] for bp in band_props if ('center_wavelength' in bp) and (bp['center_wavelength'] < 1) - ] # yapf: disable + refl_bands = [bp['name'] for bp in band_props if ('center_wavelength' in bp) and (bp['center_wavelength'] < 1)] ee_image = base_image.ee_image.select(refl_bands) min_max_dict = ee_image.reduceRegion( reducer=ee.Reducer.minMax(), geometry=region_100ha, bestEffort=True - ).getInfo() # yapf: disable + ).getInfo() min_dict = {k: v for k, v in min_max_dict.items() if 'min' in k} max_dict = {k: v for k, v in min_max_dict.items() if 'max' in k} return min_dict, max_dict @@ -515,21 +534,17 @@ def get_min_max_refl(base_image: BaseImage) -> Dict: def test_tile_shape(): - """Test BaseImage._get_tile_shape() satisfies the tile size limit for different image shapes.""" + """Test ``BaseImage._get_tile_shape()`` satisfies the tile size limit for different image shapes.""" max_tile_dim = 10000 + for max_tile_size, height, width in product(range(8, 32, 8), range(1, 11000, 1000), range(1, 11000, 1000)): + exp_shape = (height, width) + exp_image = BaseImageLike(shape=exp_shape) # mock a BaseImage + tile_shape, num_tiles = exp_image._get_tile_shape(max_tile_size=max_tile_size, max_tile_dim=max_tile_dim) + tile_size = np.prod(tile_shape) * exp_image.count * np.dtype(exp_image.dtype).itemsize - for max_tile_size in range(4, 32, 4): - for height in range(1, 11000, 100): - for width in range(1, 11000, 100): - exp_shape = (height, width) - exp_image = BaseImageLike(shape=exp_shape) # emulate a BaseImage - tile_shape, num_tiles = exp_image._get_tile_shape( - max_tile_size=max_tile_size, max_tile_dim=max_tile_dim - ) - assert all(np.array(tile_shape) <= np.array(exp_shape)) - assert all(np.array(tile_shape) <= max_tile_dim) - tile_image = BaseImageLike(shape=tile_shape) - assert tile_image.size <= (max_tile_size << 20) + assert all(np.array(tile_shape) <= np.array(exp_shape)) + assert all(np.array(tile_shape) <= max_tile_dim) + assert tile_size <= (max_tile_size << 20) @pytest.mark.parametrize( @@ -539,13 +554,13 @@ def test_tile_shape(): ((1000, 100), (101, 101), Affine.scale(1.23)), ((1000, 102), (101, 101), Affine.scale(1.23) * Affine.translation(12, 34)), ], -) # yapf: disable -def test_tiles(image_shape: Tuple, tile_shape: Tuple, image_transform: Affine): +) +def test_tiles(image_shape: tuple[int, int], tile_shape: tuple[int, int], image_transform: Affine): """Test continuity and coverage of tiles.""" exp_image = BaseImageLike(shape=image_shape, transform=image_transform) tiles = [tile for tile in exp_image._tiles(tile_shape=tile_shape)] - # test window coverage, and window & transform continuity + # test tile continuity prev_tile = tiles[0] accum_window = prev_tile.window for tile in tiles[1:]: @@ -554,72 +569,92 @@ def test_tiles(image_shape: Tuple, tile_shape: Tuple, image_transform: Affine): if tile.window.row_off == prev_tile.window.row_off: assert tile.window.col_off == (prev_tile.window.col_off + prev_tile.window.width) - assert tile._transform == pytest.approx( - (prev_tile._transform * Affine.translation(prev_tile.window.width, 0)), rel=0.001 - ) + ref_transform = prev_tile._transform * Affine.translation(prev_tile.window.width, 0) else: assert tile.window.row_off == (prev_tile.window.row_off + prev_tile.window.height) - assert tile._transform == pytest.approx( - prev_tile._transform * Affine.translation(-prev_tile.window.col_off, prev_tile.window.height), rel=0.001 + ref_transform = prev_tile._transform * Affine.translation( + -prev_tile.window.col_off, prev_tile.window.height ) + + assert tile._transform == pytest.approx(ref_transform, abs=1e-9) prev_tile = tile + + # test exp_image is fully covered by tiles assert (accum_window.height, accum_window.width) == exp_image.shape -def test_download_transform_shape(user_base_image: str, tmp_path: pathlib.Path, request: pytest.FixtureRequest): - """Test download file properties and pixel data with crs_transform and shape arguments.""" - tgt_prof = dict(crs='EPSG:3857', transform=Affine(1, 0, 0, 0, -1, 0), width=10, height=10, dtype='uint16', count=3) +def test_download_transform_shape(user_base_image: BaseImage, tmp_path: pathlib.Path): + """Test ``BaseImage.download()`` file properties and contents with ``crs_transform`` and ``shape`` arguments.""" + # reference profile to test against + ref_profile = dict( + crs='EPSG:3857', transform=Affine(1, 0, 0, 0, -1, 0), width=10, height=10, dtype='uint16', count=3 + ) - # form download parameters from tgt_prof - shape = (tgt_prof['height'], tgt_prof['width']) - tgt_bounds = windows.bounds(windows.Window(0, 0, *shape[::-1]), tgt_prof['transform']) - download_params = dict( - crs=tgt_prof['crs'], crs_transform=tgt_prof['transform'], shape=shape, dtype=tgt_prof['dtype'] + # form export kwargs from ref_profile + shape = (ref_profile['height'], ref_profile['width']) + exp_kwargs = dict( + crs=ref_profile['crs'], crs_transform=ref_profile['transform'], shape=shape, dtype=ref_profile['dtype'] ) + + # download filename = tmp_path.joinpath('test.tif') - user_base_image.download(filename, **download_params) + user_base_image.download(filename, **exp_kwargs) assert filename.exists() + + # test file format and contents with rio.open(filename, 'r') as ds: - _test_export_profile(ds.profile, tgt_prof, 'crs_transform' in download_params) + for key in ref_profile: + assert ds.profile[key] == ref_profile[key] + array = ds.read() for i in range(ds.count): assert np.all(array[i] == i + 1) -def test_download_region_scale(user_base_image: str, tmp_path: pathlib.Path, request: pytest.FixtureRequest): - """Test download file properties and pixel data with region and scale arguments.""" - tgt_prof = dict(crs='EPSG:3857', transform=Affine(1, 0, 0, 0, -1, 0), width=10, height=10, dtype='uint16', count=3) +def test_download_region_scale(user_base_image: BaseImage, tmp_path: pathlib.Path): + """Test ``BaseImage.download()`` file properties and contents with ``region`` and ``scale`` arguments.""" + # reference profile to test against + ref_profile = dict( + crs='EPSG:3857', transform=Affine(1, 0, 0, 0, -1, 0), width=10, height=10, dtype='uint16', count=3 + ) + + # form export kwargs from ref_profile + shape = (ref_profile['height'], ref_profile['width']) + bounds = windows.bounds(windows.Window(0, 0, *shape[::-1]), ref_profile['transform']) + region = bounds_polygon(*bounds, crs=ref_profile['crs']) + exp_kwargs = dict( + crs=ref_profile['crs'], region=region, scale=ref_profile['transform'][0], dtype=ref_profile['dtype'] + ) - # form download parameters from tgt_prof - shape = (tgt_prof['height'], tgt_prof['width']) - tgt_bounds = windows.bounds(windows.Window(0, 0, *shape[::-1]), tgt_prof['transform']) - region = bounds_polygon(*tgt_bounds, crs=tgt_prof['crs']) - download_params = dict(crs=tgt_prof['crs'], region=region, scale=tgt_prof['transform'][0], dtype=tgt_prof['dtype']) + # download filename = tmp_path.joinpath('test.tif') - user_base_image.download(filename, **download_params) + user_base_image.download(filename, **exp_kwargs) assert filename.exists() + + # test file format and contents with rio.open(filename, 'r') as ds: - _test_export_profile(ds.profile, tgt_prof, 'crs_transform' in download_params) + for key in ref_profile: + assert ds.profile[key] == ref_profile[key] array = ds.read() for i in range(ds.count): assert np.all(array[i] == i + 1) def test_overviews(user_base_image: BaseImage, region_25ha: Dict, tmp_path: pathlib.Path): - """Test overviews get built on download.""" + """Test overviews get built by ``BaseImage.download()``.""" filename = tmp_path.joinpath('test_user_download.tif') user_base_image.download(filename, region=region_25ha, crs='EPSG:3857', scale=1) assert filename.exists() with rio.open(filename, 'r') as ds: - for band_i in range(ds.count): - assert len(ds.overviews(band_i + 1)) > 0 - assert ds.overviews(band_i + 1)[0] == 2 + for bi in ds.indexes: + assert len(ds.overviews(bi)) > 0 + assert ds.overviews(bi)[0] == 2 -def test_metadata(s2_sr_base_image: BaseImage, region_25ha: Dict, tmp_path: pathlib.Path): - """Test metadata is written to a downloaded file.""" +def test_metadata(s2_sr_hm_base_image: BaseImage, region_25ha: Dict, tmp_path: pathlib.Path): + """Test metadata is written by ``BaseImage.download()``.""" filename = tmp_path.joinpath('test_s2_band_subset_download.tif') - s2_sr_base_image.download(filename, region=region_25ha, crs='EPSG:3857', scale=60, bands=['B9']) + s2_sr_hm_base_image.download(filename, region=region_25ha, crs='EPSG:3857', scale=60, bands=['B9']) assert filename.exists() with rio.open(filename, 'r') as ds: assert 'LICENSE' in ds.tags() @@ -630,9 +665,9 @@ def test_metadata(s2_sr_base_image: BaseImage, region_25ha: Dict, tmp_path: path assert key in band_dict -@pytest.mark.parametrize('type', [ExportType.drive, ExportType.asset, ExportType.cloud]) # yapf: disable -def test_start_export(type, user_fix_base_image: BaseImage, region_25ha: Dict): - """Test start of a small export.""" +@pytest.mark.parametrize('type', ExportType) +def test_start_export(type: ExportType, user_fix_base_image: BaseImage, region_25ha: Dict): + """Test ``BaseImage.export()`` starts a small export.""" # Note that this export should start successfully, but will ultimately fail for the asset and cloud options. For # the asset option, there will be an overwrite issue. For cloud storage, there is no 'geedim' bucket. task = user_fix_base_image.export( @@ -667,16 +702,18 @@ def __test_export_asset(user_fix_base_image: BaseImage, region_25ha: Dict): pass -def test_download_bigtiff(s2_sr_base_image: BaseImage, tmp_path: pathlib.Path): - """Test that BIGTIFF gets set in the profile of images larger than 4GB.""" - exp_image, profile = s2_sr_base_image._prepare_for_download() +def test_download_bigtiff(s2_sr_hm_base_image: BaseImage, tmp_path: pathlib.Path): + """Test ``BaseImage._prepare_for_download()`` sets the ``bigtiff`` profile item for images larger than 4GB.""" + exp_image, profile = s2_sr_hm_base_image._prepare_for_download() assert exp_image.size >= 4e9 assert 'bigtiff' in profile assert profile['bigtiff'] def test_prepare_ee_geom(l9_base_image: BaseImage, tmp_path: pathlib.Path): - """Test that _prepare_for_export works with an ee.Geometry region at native crs and scale (Issue #6).""" + """Test that ``BaseImage._prepare_for_export()`` works with an ee.Geometry region at native CRS and scale (Issue + #6). + """ region = l9_base_image.ee_image.geometry() exp_image = l9_base_image._prepare_for_export(region=region) assert exp_image.scale == l9_base_image.scale @@ -685,23 +722,18 @@ def test_prepare_ee_geom(l9_base_image: BaseImage, tmp_path: pathlib.Path): @pytest.mark.parametrize( 'base_image, exp_value', [ - ('s2_sr_base_image', True), + ('s2_sr_hm_base_image', True), ('l9_base_image', True), ('modis_nbar_base_image_unbnd', False), ('user_base_image', False), ('user_fix_base_image', False), ], -) # yapf: disable +) def test_bounded(base_image: str, exp_value: bool, request: pytest.FixtureRequest): - """Test BaseImage.bounded has correct value for different images.""" + """Test ``BaseImage.bounded`` for different images.""" base_image: BaseImage = request.getfixturevalue(base_image) assert base_image.bounded == exp_value # TODO: -# - export(): test an export of small file -# - different generic collection images are downloaded ok (perhaps this goes with MaskedImage more than BaseImage) -# - test float mask/nodata in downloaded image -# - test mult tile download has no discontinuities - -## +# - test float mask/nodata in downloaded image diff --git a/tests/test_mask.py b/tests/test_mask.py index 6f530ef..9fd5e0d 100644 --- a/tests/test_mask.py +++ b/tests/test_mask.py @@ -21,8 +21,9 @@ import pytest import rasterio as rio -from geedim.enums import CloudMaskMethod -from geedim.mask import class_from_id, CloudMaskedImage, MaskedImage, Sentinel2SrClImage +from geedim import CloudMaskMethod +from geedim.enums import CloudScoreBand +from geedim.mask import class_from_id, CloudMaskedImage, MaskedImage def test_class_from_id(landsat_image_ids, s2_sr_image_id, s2_toa_hm_image_id, generic_image_ids): @@ -79,9 +80,8 @@ def test_cloud_mask_aux_bands_exist(masked_image: str, request: pytest.FixtureRe """Test the presence of auxiliary bands in cloud masked images.""" masked_image: MaskedImage = request.getfixturevalue(masked_image) band_names = masked_image.ee_image.bandNames().getInfo() - exp_band_names = ['CLOUD_MASK', 'SHADOW_MASK', 'FILL_MASK', 'CLOUDLESS_MASK', 'CLOUD_DIST'] - for exp_band_name in exp_band_names: - assert exp_band_name in band_names + exp_band_names = {'FILL_MASK', 'CLOUDLESS_MASK', 'CLOUD_DIST'} + assert exp_band_names.intersection(band_names) == exp_band_names @pytest.mark.parametrize( @@ -125,9 +125,9 @@ def test_set_region_stats(masked_image: str, region_100ha, request: pytest.Fixtu ('s1_sar_masked_image', 10), ('gedi_agb_masked_image', 1000), # include fixtures with bands that have no fixed projection - ('s2_sr_hm_qa_mask_masked_image', 60), ('s2_sr_hm_qa_zero_masked_image', 60), ('s2_sr_hm_nocp_masked_image', 60), + ('s2_sr_hm_nocs_masked_image', 60), ], ) def test_ee_proj(masked_image: str, exp_scale: float, request: pytest.FixtureRequest): @@ -145,22 +145,23 @@ def test_landsat_cloudless_portion(image_id: str, request: pytest.FixtureRequest image_id: MaskedImage = request.getfixturevalue(image_id) masked_image = MaskedImage.from_id(image_id, mask_shadows=False, mask_cirrus=False) masked_image._set_region_stats() - # the `geedim` cloudless portion of the filled portion - cloudless_portion = masked_image.properties['CLOUDLESS_PORTION'] + # landsat provided cloudless portion landsat_cloudless_portion = 100 - float(masked_image.properties['CLOUD_COVER']) - assert cloudless_portion == pytest.approx(landsat_cloudless_portion, abs=5) + assert masked_image.properties['CLOUDLESS_PORTION'] == pytest.approx(landsat_cloudless_portion, abs=5) @pytest.mark.parametrize('image_id', ['s2_toa_image_id', 's2_sr_image_id', 's2_toa_hm_image_id', 's2_sr_hm_image_id']) def test_s2_cloudless_portion(image_id: str, request: pytest.FixtureRequest): """Test `geedim` CLOUDLESS_PORTION for the whole image against CLOUDY_PIXEL_PERCENTAGE Sentinel-2 property.""" + # Note that CLOUDY_PIXEL_PERCENTAGE does not use Cloud Score+ data and does not include shadows, which Cloud Score+ + # does. So CLOUDLESS_PORTION (with cloud-score method) will only roughly match CLOUDY_PIXEL_PERCENTAGE. image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, mask_method='qa', mask_shadows=False, mask_cirrus=False) + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-score') masked_image._set_region_stats() + # S2 provided cloudless portion s2_cloudless_portion = 100 - float(masked_image.properties['CLOUDY_PIXEL_PERCENTAGE']) - # CLOUDLESS_MASK is eroded and dilated, so allow 10% difference to account for that assert masked_image.properties['CLOUDLESS_PORTION'] == pytest.approx(s2_cloudless_portion, abs=10) @@ -171,51 +172,79 @@ def test_landsat_cloudmask_params(image_id: str, request: pytest.FixtureRequest) masked_image = MaskedImage.from_id(image_id, mask_shadows=False, mask_cirrus=False) masked_image._set_region_stats() # cloud-free portion - cloud_only_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cloud_only_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] masked_image = MaskedImage.from_id(image_id, mask_shadows=True, mask_cirrus=False) masked_image._set_region_stats() # cloud and shadow-free portion - cloud_shadow_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cloud_shadow_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] masked_image = MaskedImage.from_id(image_id, mask_shadows=True, mask_cirrus=True) masked_image._set_region_stats() # cloud, cirrus and shadow-free portion - cloudless_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cloudless_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] # test `mask_shadows` and `mask_cirrus` affect CLOUDLESS_PORTION as expected assert cloud_only_portion > cloud_shadow_portion assert cloud_shadow_portion > cloudless_portion -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_mask_shadows(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): """Test S2 cloud/shadow masking `mask_shadows` parameter.""" image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, mask_shadows=False) + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', mask_shadows=False) masked_image._set_region_stats(region_10000ha) # cloud-free portion - cloud_only_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] - masked_image = MaskedImage.from_id(image_id, mask_shadows=True) + cloud_only_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', mask_shadows=True) masked_image._set_region_stats(region_10000ha) # cloud and shadow-free portion - cloudless_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cloudless_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] assert cloud_only_portion > cloudless_portion -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_prob(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): - """Test S2 cloud/shadow masking `prob` parameter.""" + """Test S2 cloud/shadow masking `prob` parameter with the `cloud-prob` method.""" image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, mask_shadows=True, prob=80) - masked_image._set_region_stats(region_10000ha) - prob80_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] - masked_image = MaskedImage.from_id(image_id, mask_shadows=True, prob=40) - masked_image._set_region_stats(region_10000ha) - prob40_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cl_portions = [] + for prob in [80, 40]: + masked_image = MaskedImage.from_id(image_id, mask_shadows=True, prob=prob, mask_method='cloud-prob') + masked_image._set_region_stats(region_10000ha) + cl_portions.append(100 * masked_image.properties['CLOUDLESS_PORTION']) # test there is more cloud (less CLOUDLESS_PORTION) with prob=40 as compared to prob=80 - assert prob80_portion > prob40_portion > 0 + assert cl_portions[0] > cl_portions[1] > 0 + + +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) +def test_s2_cloudmask_score(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): + """Test S2 cloud/shadow masking `score` parameter with the `cloud-score` method.""" + image_id: str = request.getfixturevalue(image_id) + cl_portions = [] + for score in [0.6, 0.3]: + masked_image = MaskedImage.from_id(image_id, mask_shadows=True, score=score, mask_method='cloud-score') + masked_image._set_region_stats(region_10000ha) + cl_portions.append(100 * masked_image.properties['CLOUDLESS_PORTION']) + # test there is more cloud (less CLOUDLESS_PORTION) with score=0.3 as compared to score=0.6 + assert cl_portions[0] < cl_portions[1] > 0 + + +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) +def test_s2_cloudmask_cs_band(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): + """Test S2 cloud/shadow masking `cs_band` parameter with the `cloud-score` method.""" + image_id: str = request.getfixturevalue(image_id) + cl_portions = [] + for cs_band in CloudScoreBand: + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-score', cs_band=cs_band) + masked_image._set_region_stats(region_10000ha) + cl_portions.append(100 * masked_image.properties['CLOUDLESS_PORTION']) + # test `cs_band` changes CLOUDLESS_PORTION but not by much + assert len(set(cl_portions)) == len(cl_portions) + assert all([cl_portions[0] != pytest.approx(cp, abs=10) for cp in cl_portions[1:]]) + assert all([cp != pytest.approx(0, abs=1) for cp in cl_portions]) -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) + +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_method(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): """Test S2 cloud/shadow masking `mask_method` parameter.""" image_id: str = request.getfixturevalue(image_id) @@ -225,74 +254,74 @@ def test_s2_cloudmask_method(image_id: str, region_10000ha: Dict, request: pytes masked_image._set_region_stats(region_10000ha) cl_portions.append(100 * masked_image.properties['CLOUDLESS_PORTION']) - # test `mask_method` changes CLOUDLESS_PORTION but not by too much + # test `mask_method` changes CLOUDLESS_PORTION but not by much assert len(set(cl_portions)) == len(cl_portions) assert all([cl_portions[0] != pytest.approx(cp, abs=10) for cp in cl_portions[1:]]) assert all([cp != pytest.approx(0, abs=1) for cp in cl_portions]) -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_mask_cirrus(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): - """Test S2 cloud/shadow masking `mask_cirrus` parameter.""" + """Test S2 cloud/shadow masking `mask_cirrus` parameter with the `qa` method.""" image_id: str = request.getfixturevalue(image_id) masked_image = MaskedImage.from_id(image_id, mask_method='qa', mask_cirrus=False) # cloud and shadow free portion masked_image._set_region_stats(region_10000ha) - non_cirrus_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + non_cirrus_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] masked_image = MaskedImage.from_id(image_id, mask_method='qa', mask_cirrus=True) masked_image._set_region_stats(region_10000ha) # cloud, cirrus and shadow free portion - cirrus_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cirrus_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] assert non_cirrus_portion >= cirrus_portion -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_dark(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): """Test S2 cloud/shadow masking `dark` parameter.""" image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, dark=0.5) + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', dark=0.5) masked_image._set_region_stats(region_10000ha) - dark_pt5_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] - masked_image = MaskedImage.from_id(image_id, dark=0.1) + dark_pt5_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', dark=0.1) masked_image._set_region_stats(region_10000ha) - datk_pt1_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + dark_pt1_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] # test that increasing `dark` results in an increase in detected shadow and corresponding decrease in # CLOUDLESS_PORTION - assert datk_pt1_portion > dark_pt5_portion + assert dark_pt1_portion > dark_pt5_portion -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_shadow_dist(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): """Test S2 cloud/shadow masking `shadow_dist` parameter.""" image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, shadow_dist=200) + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', shadow_dist=200) masked_image._set_region_stats(region_10000ha) - sd200_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] - masked_image = MaskedImage.from_id(image_id, shadow_dist=1000) + sd200_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', shadow_dist=1000) masked_image._set_region_stats(region_10000ha) - sd1000_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + sd1000_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] # test that increasing `shadow_dist` results in an increase in detected shadow and corresponding decrease in # CLOUDLESS_PORTION assert sd200_portion > sd1000_portion -@pytest.mark.parametrize('image_id', ['s2_sr_image_id', 's2_toa_image_id']) +@pytest.mark.parametrize('image_id', ['s2_sr_hm_image_id', 's2_toa_hm_image_id']) def test_s2_cloudmask_cdi_thresh(image_id: str, region_10000ha: Dict, request: pytest.FixtureRequest): """Test S2 cloud/shadow masking `cdi_thresh` parameter.""" image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, cdi_thresh=0.5) + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', cdi_thresh=0.5) masked_image._set_region_stats(region_10000ha) - cdi_pt5_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] - masked_image = MaskedImage.from_id(image_id, cdi_thresh=-0.5) + cdi_pt5_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] + masked_image = MaskedImage.from_id(image_id, mask_method='cloud-prob', cdi_thresh=-0.5) masked_image._set_region_stats(region_10000ha) - cdi_negpt5_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] / masked_image.properties['FILL_PORTION'] + cdi_negpt5_portion = 100 * masked_image.properties['CLOUDLESS_PORTION'] # test that increasing `cdi_thresh` results in an increase in detected cloud and corresponding decrease in # CLOUDLESS_PORTION assert cdi_negpt5_portion > cdi_pt5_portion -@pytest.mark.parametrize('image_id, max_cloud_dist', [('s2_sr_image_id', 100), ('s2_sr_hm_image_id', 500)]) -def test_s2_clouddist_max(image_id: str, max_cloud_dist: int, region_10000ha: Dict, request: pytest.FixtureRequest): +@pytest.mark.parametrize('image_id, max_cloud_dist', [('s2_sr_hm_image_id', 100), ('s2_sr_hm_image_id', 400)]) +def test_s2_cloud_dist_max(image_id: str, max_cloud_dist: int, region_10000ha: Dict, request: pytest.FixtureRequest): """Test S2 cloud distance `max_cloud_dist` parameter.""" def get_max_cloud_dist(cloud_dist: ee.Image): @@ -301,14 +330,15 @@ def get_max_cloud_dist(cloud_dist: ee.Image): return mcd.get('CLOUD_DIST').getInfo() * 10 image_id: str = request.getfixturevalue(image_id) - masked_image = MaskedImage.from_id(image_id, max_cloud_dist=max_cloud_dist) + masked_image = MaskedImage.from_id(image_id, max_cloud_dist=max_cloud_dist, mask_method='cloud-score') cloud_dist = masked_image.ee_image.select('CLOUD_DIST') meas_max_cloud_dist = get_max_cloud_dist(cloud_dist) assert meas_max_cloud_dist == pytest.approx(max_cloud_dist, rel=0.1) @pytest.mark.parametrize( - 'masked_image', ['s2_sr_hm_qa_mask_masked_image', 's2_sr_hm_qa_zero_masked_image', 's2_sr_hm_nocp_masked_image'] + 'masked_image', + ['s2_sr_hm_qa_zero_masked_image', 's2_sr_hm_nocp_masked_image', 's2_sr_hm_nocs_masked_image'], ) def test_s2_region_stats_missing_data(masked_image: str, region_10000ha: dict, request: pytest.FixtureRequest): """Test S2 region stats for unmasked images missing required cloud data.""" @@ -373,12 +403,11 @@ def test_landsat_aux_bands(masked_image: str, region_10000ha: Dict, request: pyt @pytest.mark.parametrize( 'image_id, mask_methods', [ - ('s2_sr_image_id', CloudMaskMethod), - ('s2_toa_image_id', CloudMaskMethod), - ('s2_sr_hm_image_id', CloudMaskMethod), - ('s2_toa_hm_image_id', CloudMaskMethod), - # images missing QA60 so do cloud-prob method only - ('s2_sr_hm_qa_mask_image_id', ['cloud-prob']), + ('s2_sr_image_id', ['cloud-prob', 'qa']), + ('s2_toa_image_id', ['cloud-prob', 'qa']), + ('s2_sr_hm_image_id', ['cloud-prob', 'qa']), + ('s2_toa_hm_image_id', ['cloud-prob', 'qa']), + # missing QA60 so do cloud-prob method only ('s2_sr_hm_qa_zero_image_id', ['cloud-prob']), ], ) @@ -390,20 +419,9 @@ def test_s2_aux_bands(image_id: str, mask_methods: Iterable, region_10000ha: Dic _test_aux_stats(masked_image, region_10000ha) -def test_s2_aux_bands_unlink(s2_sr_hm_image_id: str, region_10000ha: Dict): - """Test Sentinel-2 auxiliary band values for sanity on an image without linked cloud data.""" - # TODO: include the cloud score+ method in this test when that method is added - # create an image with unknown id to prevent linking to cloud data - ee_image = ee.Image(s2_sr_hm_image_id) - ee_image = ee_image.set('system:index', 'COPERNICUS/S2_HARMONIZED/unknown') - - for mask_method in ['qa']: - masked_image = Sentinel2SrClImage(ee_image, mask_method=mask_method) - _test_aux_stats(masked_image, region_10000ha) - - @pytest.mark.parametrize( - 'masked_image', ['s2_sr_hm_nocp_masked_image', 's2_sr_hm_qa_mask_masked_image', 's2_sr_hm_qa_zero_masked_image'] + 'masked_image', + ['s2_sr_hm_nocp_masked_image', 's2_sr_hm_qa_zero_masked_image', 's2_sr_hm_nocs_masked_image'], ) def test_s2_aux_bands_missing_data(masked_image: str, region_10000ha: Dict, request: pytest.FixtureRequest): """Test Sentinel-2 auxiliary band masking / transparency for unmasked images missing required cloud data.""" @@ -420,17 +438,28 @@ def test_s2_aux_bands_missing_data(masked_image: str, region_10000ha: Dict, requ # test auxiliary masks are transparent assert stats['FILL_MASK'] > 0 - for band_name in ['CLOUDLESS_MASK', 'CLOUD_MASK', 'SHADOW_MASK', 'CLOUD_DIST']: - assert stats[band_name] == 0 + # s2_sr_hm_nocs_masked_image is missing CLOUD_MASK and SHADOW_MASK bands, so only include these when they exist + band_names = ['CLOUDLESS_MASK', 'CLOUD_DIST'] + list({'CLOUD_MASK', 'SHADOW_MASK'}.intersection(stats.keys())) + for band_name in band_names: + assert stats[band_name] == 0, band_name -@pytest.mark.parametrize('masked_image', ['gedi_cth_masked_image', 's2_sr_masked_image', 'l9_masked_image']) +@pytest.mark.parametrize( + 'masked_image', + [ + 'gedi_cth_masked_image', + # use s2_sr_masked_image rather than s2_sr_hm_masked_image which complicates testing due to fully masked + # MSK_CLASSI* bands + 's2_sr_masked_image', + 'l9_masked_image', + ], +) def test_mask_clouds(masked_image: str, region_100ha: Dict, tmp_path, request: pytest.FixtureRequest): """Test MaskedImage.mask_clouds() masks the fill or cloudless portion by downloading and examining dataset masks.""" masked_image: MaskedImage = request.getfixturevalue(masked_image) filename = tmp_path.joinpath(f'test_image.tif') masked_image.mask_clouds() - proj_scale = masked_image._ee_proj.nominalScale() + proj_scale = masked_image._ee_proj.nominalScale().getInfo() masked_image.download(filename, region=region_100ha, dtype='float32', scale=proj_scale) assert filename.exists() @@ -448,7 +477,8 @@ def test_mask_clouds(masked_image: str, region_100ha: Dict, tmp_path, request: p @pytest.mark.parametrize( - 'masked_image', ['s2_sr_hm_nocp_masked_image', 's2_sr_hm_qa_mask_masked_image', 's2_sr_hm_qa_zero_masked_image'] + 'masked_image', + ['s2_sr_hm_nocp_masked_image', 's2_sr_hm_qa_zero_masked_image', 's2_sr_hm_nocs_masked_image'], ) def test_s2_mask_clouds_missing_data(masked_image: str, region_100ha: Dict, tmp_path, request: pytest.FixtureRequest): """Test Sentinel2SrClImage.mask_clouds() masks the entire image when it is missing required cloud data. Downloads @@ -457,7 +487,7 @@ def test_s2_mask_clouds_missing_data(masked_image: str, region_100ha: Dict, tmp_ masked_image: MaskedImage = request.getfixturevalue(masked_image) filename = tmp_path.joinpath(f'test_image.tif') masked_image.mask_clouds() - proj_scale = masked_image._ee_proj.nominalScale() + proj_scale = masked_image._ee_proj.nominalScale().getInfo() masked_image.download(filename, region=region_100ha, dtype='float32', scale=proj_scale) assert filename.exists() diff --git a/tests/test_stac.py b/tests/test_stac.py index 7d5e40f..23061b7 100644 --- a/tests/test_stac.py +++ b/tests/test_stac.py @@ -13,27 +13,23 @@ See the License for the specific language governing permissions and limitations under the License. """ + import re import pytest -from geedim.stac import StacCatalog, StacItem + +from geedim.stac import StacCatalog from geedim.utils import split_id @pytest.fixture(scope='session') def stac_catalog() -> StacCatalog: - """ The StacCatalog instance. """ + """The StacCatalog instance.""" return StacCatalog() -@pytest.fixture(scope='session') -def s2_sr_stac_item(stac_catalog, s2_sr_image_id) -> StacItem: - """ A StacItem for the Sentinel-2 SR collection. """ - return stac_catalog.get_item(s2_sr_image_id) - - def test_singleton(landsat_ndvi_image_id: str): - """ Test StacCatalog is a singleton. """ + """Test StacCatalog is a singleton.""" coll_name, _ = split_id(landsat_ndvi_image_id) stac1 = StacCatalog() stac2 = StacCatalog() @@ -44,23 +40,33 @@ def test_singleton(landsat_ndvi_image_id: str): def test_traverse_stac(stac_catalog: StacCatalog): - """ Test _traverse_stac() on the root of the COPERNICUS subtree. """ + """Test _traverse_stac() on the root of the COPERNICUS subtree.""" url_dict = {} url_dict = stac_catalog._traverse_stac( 'https://storage.googleapis.com/earthengine-stac/catalog/COPERNICUS/catalog.json', url_dict ) assert len(url_dict) > 0 - assert 'COPERNICUS/S2_SR' in url_dict + assert 'COPERNICUS/S2_SR_HARMONIZED' in url_dict @pytest.mark.parametrize( - 'image_id', [ - 'l4_image_id', 'l5_image_id', 'l7_image_id', 'l8_image_id', 'l9_image_id', 'landsat_ndvi_image_id', - 's2_sr_image_id', 's2_toa_image_id', 's1_sar_image_id', 'modis_nbar_image_id', 'gedi_cth_image_id', - ] + 'image_id', + [ + 'l4_image_id', + 'l5_image_id', + 'l7_image_id', + 'l8_image_id', + 'l9_image_id', + 'landsat_ndvi_image_id', + 's2_sr_hm_image_id', + 's2_toa_hm_image_id', + 's1_sar_image_id', + 'modis_nbar_image_id', + 'gedi_cth_image_id', + ], ) def test_known_get_item(image_id: str, stac_catalog: StacCatalog, request: pytest.FixtureRequest): - """ Test that stac_catalog contains expected 'items'. """ + """Test that stac_catalog contains expected 'items'.""" image_id = request.getfixturevalue(image_id) coll_name, _ = split_id(image_id) assert coll_name in stac_catalog.url_dict @@ -69,19 +75,28 @@ def test_known_get_item(image_id: str, stac_catalog: StacCatalog, request: pytes def test_unknown_get_item(stac_catalog: StacCatalog): - """ Test that stac_catalog returns None for unknown entries. """ + """Test that stac_catalog returns None for unknown entries.""" assert stac_catalog.get_item_dict('unknown') is None assert stac_catalog.get_item('unknown') is None @pytest.mark.parametrize( - 'image_id', [ - 'l4_image_id', 'l5_image_id', 'l7_image_id', 'l8_image_id', 'l9_image_id', 's2_sr_image_id', 's2_toa_image_id', - 's2_sr_hm_image_id', 's2_toa_hm_image_id', 'modis_nbar_image_id', - ] + 'image_id', + [ + 'l4_image_id', + 'l5_image_id', + 'l7_image_id', + 'l8_image_id', + 'l9_image_id', + 's2_sr_hm_image_id', + 's2_toa_hm_image_id', + 's2_sr_hm_image_id', + 's2_toa_hm_image_id', + 'modis_nbar_image_id', + ], ) def test_refl_stac_item(image_id: str, stac_catalog: StacCatalog, request: pytest.FixtureRequest): - """ Test reflectance collectionStacItem properties are as expected. """ + """Test reflectance collectionStacItem properties are as expected.""" image_id = request.getfixturevalue(image_id) coll_name, _ = split_id(image_id) stac_item = stac_catalog.get_item(coll_name) @@ -101,9 +116,9 @@ def test_refl_stac_item(image_id: str, stac_catalog: StacCatalog, request: pytes assert 'scale' in band_dict -@pytest.mark.parametrize('image_id', ['l4_image_id', 's2_sr_image_id', 's1_sar_image_id']) +@pytest.mark.parametrize('image_id', ['l4_image_id', 's2_sr_hm_image_id', 's1_sar_image_id']) def test_stac_item_descriptions(image_id: str, stac_catalog: StacCatalog, request: pytest.FixtureRequest): - """ Test StacItem.descriptions. """ + """Test StacItem.descriptions.""" image_id = request.getfixturevalue(image_id) coll_name, _ = split_id(image_id) stac_item = stac_catalog.get_item(coll_name) diff --git a/tests/test_tile.py b/tests/test_tile.py index 3fb49d7..bd1633e 100644 --- a/tests/test_tile.py +++ b/tests/test_tile.py @@ -17,7 +17,6 @@ import io import json import logging -import zipfile from collections import namedtuple import ee @@ -64,23 +63,23 @@ def getDownloadURL(*args, **kwargs): @pytest.fixture(scope='module') -def zipped_gtiff_bytes(mock_base_image: BaseImageLike) -> bytes: - """Zipped GeoTIFF bytes for ``mock_base_image``.""" - zip_buffer = io.BytesIO() +def gtiff_bytes(mock_base_image: BaseImageLike) -> bytes: + """GeoTIFF bytes for ``mock_base_image``.""" array = np.ones((mock_base_image.count, *mock_base_image.shape)) * np.array([1, 2, 3]).reshape(-1, 1, 1) - with rio.MemoryFile() as mem_file: - with mem_file.open( - **rio.default_gtiff_profile, - width=mock_base_image.shape[1], - height=mock_base_image.shape[0], - count=mock_base_image.count, - ) as ds: - ds.write(array) - with zipfile.ZipFile(zip_buffer, 'a', zipfile.ZIP_DEFLATED, False) as zf: - zf.writestr('test.tif', mem_file.read()) + buf = io.BytesIO() + with rio.open( + buf, + 'w', + **rio.default_gtiff_profile, + width=mock_base_image.shape[1], + height=mock_base_image.shape[0], + count=mock_base_image.count, + ) as ds: + ds.write(array) - return zip_buffer.getvalue() + buf.seek(0) + return buf.read() def test_create(mock_base_image: BaseImageLike): @@ -129,7 +128,7 @@ def get(url, **kwargs): assert msg in str(ex.value) -def test_retry(synth_tile: Tile, mock_ee_image: None, zipped_gtiff_bytes: bytes, caplog: pytest.LogCaptureFixture): +def test_retry(synth_tile: Tile, mock_ee_image: None, gtiff_bytes: bytes, caplog: pytest.LogCaptureFixture): """Test downloading retries invalid tiles until it succeeds.""" # create progress bar dtype_size = np.dtype(synth_tile._exp_image.dtype).itemsize @@ -141,12 +140,12 @@ def test_retry(synth_tile: Tile, mock_ee_image: None, zipped_gtiff_bytes: bytes, for _ in range(5): response = requests.Response() response.status_code = 200 - response.headers = {'content-length': str(len(zipped_gtiff_bytes))} + response.headers = {'content-length': str(len(gtiff_bytes))} response.raw = io.BytesIO(b'error') responses.append(response) # make the last response valid - responses[-1].raw = io.BytesIO(zipped_gtiff_bytes) + responses[-1].raw = io.BytesIO(gtiff_bytes) # patch session.get() to pop and return a mocked response from the list session = retry_session() @@ -169,10 +168,10 @@ def get(url, **kwargs): assert bar.n == pytest.approx(raw_download_size, rel=0.01) # test retry logs - assert 'retry' in caplog.text and 'zip' in caplog.text + assert 'retry' in caplog.text and 'not recognized' in caplog.text -def test_retry_error(synth_tile: Tile, mock_ee_image: None, zipped_gtiff_bytes: bytes): +def test_retry_error(synth_tile: Tile, mock_ee_image: None, gtiff_bytes: bytes): """Test downloading raises an error when the maximum retries are reached.""" # create progress bar dtype_size = np.dtype(synth_tile._exp_image.dtype).itemsize diff --git a/tests/test_utils.py b/tests/test_utils.py index 983aaf4..cb26821 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -19,29 +19,28 @@ import ee import pytest -from geedim import MaskedImage -from geedim.enums import ResamplingMethod -from geedim.utils import split_id, get_projection, get_bounds, Spinner, resample, asset_id from rasterio.features import bounds -from .conftest import get_image_std +from geedim import MaskedImage +from geedim.enums import ResamplingMethod +from geedim.utils import asset_id, get_bounds, get_projection, resample, Spinner, split_id @pytest.mark.parametrize('id, exp_split', [('A/B/C', ('A/B', 'C')), ('ABC', ('', 'ABC')), (None, (None, None))]) def test_split_id(id, exp_split): - """ Test split_id(). """ + """Test split_id().""" assert split_id(id) == exp_split def test_get_bounds(const_image_25ha_file, region_25ha): - """ Test get_bounds(). """ + """Test get_bounds().""" raster_bounds = bounds(get_bounds(const_image_25ha_file, expand=0)) test_bounds = bounds(region_25ha) - assert raster_bounds == pytest.approx(test_bounds, abs=.001) + assert raster_bounds == pytest.approx(test_bounds, abs=0.001) def test_get_projection(s2_sr_masked_image): - """ Test get_projection(). """ + """Test get_projection().""" min_proj = get_projection(s2_sr_masked_image.ee_image, min_scale=True) min_crs = min_proj.crs().getInfo() min_scale = min_proj.nominalScale().getInfo() @@ -56,7 +55,7 @@ def test_get_projection(s2_sr_masked_image): def test_spinner(): - """ Test Spinner class. """ + """Test Spinner class.""" spinner = Spinner(label='test', interval=0.1) assert not spinner.is_alive() with spinner: @@ -67,57 +66,74 @@ def test_spinner(): assert not spinner.is_alive() -# yapf: disable @pytest.mark.parametrize( - 'image_id, method, std_scale', [ - ('l9_image_id', ResamplingMethod.bilinear, 30), - ('s2_sr_image_id', ResamplingMethod.average, 60), - ('modis_nbar_image_id', ResamplingMethod.bicubic, 500), - ] + 'image_id, method, scale', + [ + ('l9_image_id', ResamplingMethod.bilinear, 15), + ('s2_sr_hm_image_id', ResamplingMethod.average, 25), + ('modis_nbar_image_id', ResamplingMethod.bicubic, 100), + ], ) -# yapf: enable def test_resample_fixed( - image_id: str, method: ResamplingMethod, std_scale: float, region_10000ha: Dict, request: pytest.FixtureRequest + image_id: str, method: ResamplingMethod, scale: float, region_100ha: Dict, request: pytest.FixtureRequest ): - """ Test that resample() smooths images with a fixed projection. """ + """Test that resample() smooths images with a fixed projection.""" image_id = request.getfixturevalue(image_id) - before_image = ee.Image(image_id) - after_image = resample(before_image, method) + source_im = ee.Image(image_id) + resampled_im = resample(source_im, method) + + # find mean of std deviations of bands for each image + crs = source_im.select(0).projection().crs() + stds = [] + for im in [source_im, resampled_im]: + im = im.reproject(crs=crs, scale=scale) # required to resample at scale + std = im.reduceRegion('stdDev', geometry=region_100ha).values().reduce('mean') + stds.append(std) + stds = ee.List(stds).getInfo() - assert ( - get_image_std(after_image, region_10000ha, std_scale) < get_image_std(before_image, region_10000ha, std_scale) - ) + # test resampled_im is smoother than source_im + assert stds[1] < stds[0] @pytest.mark.parametrize( - 'masked_image, method, std_scale', [ - ('user_masked_image', ResamplingMethod.bilinear, 100), - ('landsat_ndvi_masked_image', ResamplingMethod.average, 60) - ] + 'masked_image, method, scale', + [ + ('user_masked_image', ResamplingMethod.bilinear, 50), + ('landsat_ndvi_masked_image', ResamplingMethod.average, 50), + ], ) def test_resample_comp( - masked_image: str, method: ResamplingMethod, std_scale: float, region_10000ha: Dict, request: pytest.FixtureRequest + masked_image: str, method: ResamplingMethod, scale: float, region_100ha: Dict, request: pytest.FixtureRequest ): - """ Test that resample() leaves composite images unaltered. """ + """Test that resample() leaves composite images unaltered.""" masked_image: MaskedImage = request.getfixturevalue(masked_image) - before_image = masked_image.ee_image - after_image = resample(before_image, method) + source_im = masked_image.ee_image + resampled_im = resample(source_im, method) + + # find mean of std deviations of bands for each image + crs = source_im.select(0).projection().crs() + stds = [] + for im in [source_im, resampled_im]: + im = im.reproject(crs=crs, scale=scale) # required to resample at scale + std = im.reduceRegion('stdDev', geometry=region_100ha).values().reduce('mean') + stds.append(std) + stds = ee.List(stds).getInfo() - assert ( - get_image_std(after_image, region_10000ha, std_scale) == get_image_std(before_image, region_10000ha, std_scale) - ) + # test no change between resampled_im and source_im + assert stds[1] == stds[0] @pytest.mark.parametrize( - 'filename, folder, exp_id', [ + 'filename, folder, exp_id', + [ ('file', 'folder', 'projects/folder/assets/file'), ('fp1/fp2/fp3', 'folder', 'projects/folder/assets/fp1-fp2-fp3'), ('file', 'folder/sub-folder', 'projects/folder/assets/sub-folder/file'), ('file', None, 'file'), ('projects/folder/assets/file', None, 'projects/folder/assets/file'), - ] + ], ) def test_asset_id(filename: str, folder: str, exp_id: str): - """ Test asset_id() works as expected. """ + """Test asset_id() works as expected.""" id = asset_id(filename, folder) assert id == exp_id