folium.Map:
+ """
+ Create a Folium map with side-by-side layer comparison using a draggable slider.
+
+ Uses the Leaflet leaflet-side-by-side plugin to create an interactive comparison
+ between two tile layers. The user can drag a vertical slider to reveal more of
+ either layer.
+
+ Parameters
+ ----------
+ tiles_url_left : str
+ Tile URL template for the left layer (with {z}, {x}, {y} placeholders)
+ tiles_url_right : str
+ Tile URL template for the right layer (with {z}, {x}, {y} placeholders)
+ center_coords : list
+ [latitude, longitude] for map center
+ zoom_level : int, optional
+ Initial zoom level (default 14)
+ title : str, optional
+ Main title displayed at top of map (default "Side-by-Side Comparison")
+ label_left : str, optional
+ Label for left layer, e.g., "Reflectivity (-10 to 50 dBZ)" (default "Left Layer")
+ label_right : str, optional
+ Label for right layer, e.g., "Velocity (-75 to 75 m/s)" (default "Right Layer")
+ layer_name_left : str, optional
+ Name for left layer in layer control (default "Left Layer")
+ layer_name_right : str, optional
+ Name for right layer in layer control (default "Right Layer")
+ opacity : float, optional
+ Opacity for both layers, between 0 and 1 (default 0.8)
+ basemap_style : str, optional
+ Basemap style to use. Options: 'openstreetmap', 'cartodb-positron',
+ 'cartodb-dark', 'esri-satellite', 'esri-satellite-labels', None
+ (default 'esri-satellite-labels')
+ height : str, optional
+ Map height as CSS string (default "800px")
+ width : str, optional
+ Map width as CSS string (default "100%")
+
+ Returns
+ -------
+ folium.Map
+ The configured Folium map object with side-by-side layers
+
+ Examples
+ --------
+ >>> # Create a comparison of two radar products
+ >>> m = create_side_by_side_map(
+ ... tiles_url_left="https://example.com/reflectivity/{z}/{x}/{y}.png",
+ ... tiles_url_right="https://example.com/velocity/{z}/{x}/{y}.png",
+ ... center_coords=[41.668, -95.372],
+ ... zoom_level=14,
+ ... title="DOW7 Radar Comparison",
+ ... label_left="β Reflectivity (dBZ)",
+ ... label_right="Velocity (m/s) β"
+ ... )
+ >>> m
+
+ Notes
+ -----
+ - Both tile layers must be added to the map before being passed to SideBySideLayers
+ - The slider divides the view vertically; left layer shows on left, right layer on right
+ - Basemap is added beneath both comparison layers for context
+ - HTML elements are used for title, labels, and description positioning
+ """
+
+ # Create the base map
+ m = folium.Map(
+ location=center_coords,
+ zoom_start=zoom_level,
+ control_scale=True,
+ width=width,
+ height=height,
+ tiles=None # We'll add basemap separately
+ )
+
+ # Add basemap if specified
+ if basemap_style:
+ try:
+ add_basemap_to_map(m, basemap_style)
+ except Exception as e:
+ print(f"Warning: Could not add basemap '{basemap_style}': {e}. Continuing without basemap.")
+
+ # Create left layer
+ layer_left = folium.TileLayer(
+ tiles=tiles_url_left,
+ attr=layer_name_left,
+ name=layer_name_left,
+ overlay=True,
+ control=True,
+ opacity=opacity,
+ tms=False
+ )
+
+ # Create right layer
+ layer_right = folium.TileLayer(
+ tiles=tiles_url_right,
+ attr=layer_name_right,
+ name=layer_name_right,
+ overlay=True,
+ control=True,
+ opacity=opacity,
+ tms=False
+ )
+
+ # IMPORTANT: Add layers to map BEFORE using in SideBySideLayers
+ # This is required by the plugin
+ layer_left.add_to(m)
+ layer_right.add_to(m)
+
+ # Create and add the SideBySideLayers plugin
+ sbs = SideBySideLayers(
+ layer_left=layer_left,
+ layer_right=layer_right
+ )
+ sbs.add_to(m)
+
+ # Add layer control for basemap options
+ folium.LayerControl().add_to(m)
+
+ # Add title to the map
+ title_html = f"""
+
+ {title}
+
+ """
+ m.get_root().html.add_child(Element(title_html))
+
+ # Add labels for left and right panels
+ labels_html = f"""
+
+ {label_left}
+
+
+ {label_right}
+
+ """
+ m.get_root().html.add_child(Element(labels_html))
+
+ # Add description text at the bottom if provided
+ description_html = f"""
+
+ Drag the slider to compare rendered tiles.
+
+ """
+ m.get_root().html.add_child(Element(description_html))
+
+ return m
+
diff --git a/user-guide/notebooks/stories/tornadoes_2024_notebook.ipynb b/user-guide/notebooks/stories/tornadoes_2024_notebook.ipynb
index 23f5ffc9..502154a4 100644
--- a/user-guide/notebooks/stories/tornadoes_2024_notebook.ipynb
+++ b/user-guide/notebooks/stories/tornadoes_2024_notebook.ipynb
@@ -14,7 +14,7 @@
"description: A detailed overview of the historic season.\n",
"author:\n",
" - Andrew Blackford (UAH), Trent Cowan (UAH), Udaysankar Nair (UAH), Josh Wurman (CSU), Karen Kosiba (CSU), David Roueche (AU), Catherine Finley (UND), and Jana Houser (OSU)\n",
- " - Andrew Blackford (editor)\n",
+ " - Andrew Blackford and Kyle Lesinger (editors)\n",
"date: August 13, 2025\n",
"execute:\n",
" freeze: true\n",
@@ -73,32 +73,53 @@
"outputs": [],
"source": [
"# Load libraries\n",
- "#!pip install -q earthaccess pandas xarray fsspec requests branca pystac_client\n",
+ "#!pip install -q earthaccess pandas xarray fsspec requests branca pystac_client matplotlib\n",
"\n",
- "import datetime\n",
"import glob\n",
"import os\n",
- "import folium\n",
- "from branca.element import Template, MacroElement\n",
- "import earthaccess\n",
- "import pandas as pd\n",
- "import plotutils as putils\n",
"import requests\n",
- "import xarray as xr\n",
- "from earthaccess import Store\n",
- "from pystac_client import Client"
+ "import matplotlib as mpl\n",
+ "import matplotlib.pyplot as plt\n",
+ "import plotutils as putils\n",
+ "from pystac_client import Client\n",
+ "import folium"
]
},
{
"cell_type": "code",
"execution_count": 2,
+ "id": "1aafe340",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "
"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import importlib\n",
+ "importlib.reload(putils)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
"id": "8fc9234c-975b-485d-bfb3-d9100ff3b12d",
"metadata": {},
"outputs": [],
"source": [
"# For retrieving data already catalogued in VEDA STAC\n",
"STAC_API_URL = \"https://openveda.cloud/api/stac\"\n",
- "RASTER_API_URL = \"https://openveda.cloud/api/raster\""
+ "RASTER_API_URL = \"https://openveda.cloud/api/raster\"\n",
+ "\n",
+ "# Open STAC client designed for interacting with SpatioTemporal Asset Catalog (STAC) APIs and Catalogs\n",
+ "client_STAC = Client.open(STAC_API_URL)"
]
},
{
@@ -151,7 +172,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 4,
"id": "f1ef497a-4fa7-499c-8237-21f4cad1d45b",
"metadata": {},
"outputs": [
@@ -1009,15 +1030,13 @@
""
]
},
- "execution_count": 3,
+ "execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# TODO: Change collection_ID and date\n",
- "client_STAC = Client.open(STAC_API_URL)\n",
- "\n",
"collection_id = \"tornadoes-2024-paths\"\n",
"date = \"2024-05-31\"\n",
"\n",
@@ -1034,15 +1053,15 @@
"dashboard_render = collection.extra_fields[\"renders\"][\"dashboard\"]\n",
"\n",
"assets = dashboard_render[\"assets\"][0]\n",
- "#((vmin, vmax),) = dashboard_render[\"rescale\"]\n",
- "((vmin, vmax),) = ((0,5),)\n",
+ "# Use the same information as tornado paths for vmin and vmax range\n",
+ "(vmin, vmax) = (0,6)\n",
"\n",
"collection"
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 5,
"id": "b3bafa71-607c-49cc-9e5f-8f3d2f882410",
"metadata": {},
"outputs": [
@@ -1050,22 +1069,20 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "{'tilejson': '2.2.0', 'version': '1.0.0', 'scheme': 'xyz', 'tiles': ['https://openveda.cloud/api/raster/collections/tornadoes-2024-paths/items/Tornado_Tracks_cog_2024-05-31/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog_default&color_formula=gamma+r+1.05&colormap_name=turbo&rescale=0%2C5'], 'minzoom': 0, 'maxzoom': 24, 'bounds': [-103.501720443, 18.467731627, -66.701720443, 46.592731627], 'center': [-85.101720443, 32.530231627, 0]}\n"
+ "{'tilejson': '2.2.0', 'version': '1.0.0', 'scheme': 'xyz', 'tiles': ['https://openveda.cloud/api/raster/collections/tornadoes-2024-paths/items/Tornado_Tracks_cog_2024-05-31/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog_default&colormap_name=tornado_ef_scale'], 'minzoom': 0, 'maxzoom': 24, 'bounds': [-103.501720443, 18.467731627, -66.701720443, 46.592731627], 'center': [-85.101720443, 32.530231627, 0]}\n"
]
}
],
"source": [
- "# ββ VEDA Tile Request βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n",
- "#colormap_name = \"tornado_ef_scale\"\n",
- "colormap_name = \"turbo\"\n",
+ "# ββ VEDA Tile Request βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n",
+ "colormap_name = \"tornado_ef_scale\"\n",
"\n",
- "# Build endpoint URL without worrying about trailing slashes\n",
+ "# Build endpoint URL. Do not add rescale parameters with discrete data\n",
"response = requests.get(\n",
" f\"{RASTER_API_URL.rstrip('/')}/collections/{collection_id}\"\n",
" f\"/items/{item.id}/WebMercatorQuad/tilejson.json?\"\n",
" f\"&assets={assets}\"\n",
- " f\"&color_formula=gamma+r+1.05&colormap_name={colormap_name}\"\n",
- " f\"&rescale={vmin},{vmax}\",\n",
+ " f\"&colormap_name={colormap_name}\"\n",
")\n",
"\n",
"response.raise_for_status()\n",
@@ -1084,7 +1101,35 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 6,
+ "id": "9d17e195",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'openstreetmap': 'OpenStreetMap standard tiles',\n",
+ " 'cartodb-positron': 'Light gray CartoDB basemap (subtle, good for data visualization)',\n",
+ " 'cartodb-dark': 'Dark CartoDB basemap (good for bright data)',\n",
+ " 'esri-satellite': 'ESRI satellite imagery without labels',\n",
+ " 'esri-satellite-labels': 'ESRI satellite imagery with place labels overlay',\n",
+ " None: 'No basemap (transparent background)'}"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# First we will present the different basemaps that we have access to underlay beneath our tile requests\n",
+ "# For the first map, we will utilize the 'esri-satellite-labels' map layer\n",
+ "putils.get_available_basemaps()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
"id": "9af1c710-0423-4d3e-9c93-4fff13d1dab5",
"metadata": {},
"outputs": [
@@ -1110,10 +1155,10 @@
" <meta name="viewport" content="width=device-width,\n",
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n",
" <style>\n",
- " #map_a549248a96f7ec8817728a7eddc8fc67 {\n",
+ " #map_b30f461f6cc6bc77374783c9b80a08bb {\n",
" position: relative;\n",
" width: 100.0%;\n",
- " height: 890.0px;\n",
+ " height: 800.0px;\n",
" left: 0.0%;\n",
" top: 0.0%;\n",
" }\n",
@@ -1163,116 +1208,154 @@
" </div>\n",
" \n",
" \n",
- " <div class="folium-map" id="map_a549248a96f7ec8817728a7eddc8fc67" ></div>\n",
+ " <div class="folium-map" id="map_b30f461f6cc6bc77374783c9b80a08bb" ></div>\n",
" \n",
" \n",
- "<div style="\n",
- " position: fixed; \n",
- " bottom: 150px; \n",
- " left: 1300px; \n",
- " width: 120px; \n",
- " height: auto; \n",
- " background-color: white; \n",
- " border:2px solid grey; \n",
- " z-index:9999; \n",
- " font-size:20px;\n",
- " padding: 10px;\n",
- " box-shadow: 2px 2px 6px rgba(0,0,0,0.3);\n",
- " ">\n",
- " <p style="margin: 0 0 10px 0; font-weight: bold; text-align: center;">EF Rating</p>\n",
- "\n",
- " <div style="margin-bottom: 5px; display: flex; align-items: center;">\n",
- " <span style="background-color: #573F5D; \n",
- " display: inline-block; \n",
- " width: 30px; \n",
- " height: 15px; \n",
- " margin-right: 8px;\n",
- " border: 1px solid #666;"></span>\n",
- " <span style="font-weight: 600;">EF0</span>\n",
- " </div>\n",
- " \n",
- " <div style="margin-bottom: 5px; display: flex; align-items: center;">\n",
- " <span style="background-color: #62B5F7; \n",
- " display: inline-block; \n",
- " width: 30px; \n",
- " height: 15px; \n",
- " margin-right: 8px;\n",
- " border: 1px solid #666;"></span>\n",
- " <span style="font-weight: 600;">EF1</span>\n",
- " </div>\n",
- " \n",
- " <div style="margin-bottom: 5px; display: flex; align-items: center;">\n",
- " <span style="background-color: #74F88E; \n",
- " display: inline-block; \n",
- " width: 30px; \n",
- " height: 15px; \n",
- " margin-right: 8px;\n",
- " border: 1px solid #666;"></span>\n",
- " <span style="font-weight: 600;">EF2</span>\n",
- " </div>\n",
- " \n",
- " <div style="margin-bottom: 5px; display: flex; align-items: center;">\n",
- " <span style="background-color: #E9DD61; \n",
- " display: inline-block; \n",
- " width: 30px; \n",
- " height: 15px; \n",
- " margin-right: 8px;\n",
- " border: 1px solid #666;"></span>\n",
- " <span style="font-weight: 600;">EF3</span>\n",
- " </div>\n",
- " \n",
- " <div style="margin-bottom: 5px; display: flex; align-items: center;">\n",
- " <span style="background-color: #EE7545; \n",
- " display: inline-block; \n",
- " width: 30px; \n",
- " height: 15px; \n",
- " margin-right: 8px;\n",
- " border: 1px solid #666;"></span>\n",
- " <span style="font-weight: 600;">EF4</span>\n",
- " </div>\n",
- " \n",
- " <div style="margin-bottom: 5px; display: flex; align-items: center;">\n",
- " <span style="background-color: #FF0000; \n",
- " display: inline-block; \n",
- " width: 30px; \n",
- " height: 15px; \n",
- " margin-right: 8px;\n",
- " border: 1px solid #666;"></span>\n",
- " <span style="font-weight: 600;">EF5</span>\n",
+ " <div style="\n",
+ " \n",
+ " position: fixed; \n",
+ " top: 50px; \n",
+ " left: 50%;\n",
+ " transform: translateX(-50%);\n",
+ " \n",
+ " width: auto;\n",
+ " max-width: 90%;\n",
+ " height: auto; \n",
+ " background-color: white; \n",
+ " border: 2px solid grey; \n",
+ " z-index: 9999; \n",
+ " font-size: 14px;\n",
+ " padding: 8px 15px;\n",
+ " box-shadow: 2px 2px 6px rgba(0,0,0,0.3);\n",
+ " border-radius: 4px;\n",
+ " ">\n",
+ " <p style="margin: 0 0 8px 0; font-weight: bold; text-align: center; font-size: 16px;">EF Rating</p>\n",
+ " <div style="display: flex; justify-content: center; align-items: center; gap: 15px; flex-wrap: wrap;">\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #add8e6; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EF0</span>\n",
+ " </div>\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #90ee90; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EF1</span>\n",
+ " </div>\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #ffe71f; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EF2</span>\n",
+ " </div>\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #ffa500; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EF3</span>\n",
+ " </div>\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #ff0000; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EF4</span>\n",
+ " </div>\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #ff00ff; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EF5</span>\n",
+ " </div>\n",
+ " \n",
+ " <div style="display: flex; align-items: center;">\n",
+ " <span style="background-color: #b3bcc9; \n",
+ " display: inline-block; \n",
+ " width: 25px; \n",
+ " height: 20px; \n",
+ " margin-right: 5px;\n",
+ " border: 1px solid #333;"></span>\n",
+ " <span style="font-weight: 600;">EFU</span>\n",
+ " </div>\n",
+ " \n",
+ " </div>\n",
" </div>\n",
" \n",
- "</div>\n",
"</body>\n",
"<script>\n",
" \n",
" \n",
- " var map_a549248a96f7ec8817728a7eddc8fc67 = L.map(\n",
- " "map_a549248a96f7ec8817728a7eddc8fc67",\n",
+ " var map_b30f461f6cc6bc77374783c9b80a08bb = L.map(\n",
+ " "map_b30f461f6cc6bc77374783c9b80a08bb",\n",
" {\n",
" center: [41.31, -94.46],\n",
" crs: L.CRS.EPSG3857,\n",
" ...{\n",
- " "zoom": 9,\n",
+ " "zoom": 10,\n",
" "zoomControl": true,\n",
" "preferCanvas": false,\n",
"}\n",
"\n",
" }\n",
" );\n",
- " L.control.scale().addTo(map_a549248a96f7ec8817728a7eddc8fc67);\n",
+ " L.control.scale().addTo(map_b30f461f6cc6bc77374783c9b80a08bb);\n",
"\n",
" \n",
"\n",
" \n",
" \n",
- " var tile_layer_92294d2f33dce1f495a2347692aa6767 = L.tileLayer(\n",
- " "https://tile.openstreetmap.org/{z}/{x}/{y}.png",\n",
+ " var tile_layer_c29c12631f1d677ab68fb3f8882e6170 = L.tileLayer(\n",
+ " "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",\n",
+ " {\n",
+ " "minZoom": 0,\n",
+ " "maxZoom": 18,\n",
+ " "maxNativeZoom": 18,\n",
+ " "noWrap": false,\n",
+ " "attribution": "Esri",\n",
+ " "subdomains": "abc",\n",
+ " "detectRetina": false,\n",
+ " "tms": false,\n",
+ " "opacity": 1,\n",
+ "}\n",
+ "\n",
+ " );\n",
+ " \n",
+ " \n",
+ " tile_layer_c29c12631f1d677ab68fb3f8882e6170.addTo(map_b30f461f6cc6bc77374783c9b80a08bb);\n",
+ " \n",
+ " \n",
+ " var tile_layer_2919f1d487feaf5c0c2a8cde2eef32ce = L.tileLayer(\n",
+ " "https://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}",\n",
" {\n",
" "minZoom": 0,\n",
- " "maxZoom": 19,\n",
- " "maxNativeZoom": 19,\n",
+ " "maxZoom": 18,\n",
+ " "maxNativeZoom": 18,\n",
" "noWrap": false,\n",
- " "attribution": "\\u0026copy; \\u003ca href=\\"https://www.openstreetmap.org/copyright\\"\\u003eOpenStreetMap\\u003c/a\\u003e contributors",\n",
+ " "attribution": "Esri",\n",
" "subdomains": "abc",\n",
" "detectRetina": false,\n",
" "tms": false,\n",
@@ -1282,11 +1365,11 @@
" );\n",
" \n",
" \n",
- " tile_layer_92294d2f33dce1f495a2347692aa6767.addTo(map_a549248a96f7ec8817728a7eddc8fc67);\n",
+ " tile_layer_2919f1d487feaf5c0c2a8cde2eef32ce.addTo(map_b30f461f6cc6bc77374783c9b80a08bb);\n",
" \n",
" \n",
- " var tile_layer_e6f1f5193e3692db64acdc8d45bb1e98 = L.tileLayer(\n",
- " "https://openveda.cloud/api/raster/collections/tornadoes-2024-paths/items/Tornado_Tracks_cog_2024-05-31/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog_default\\u0026color_formula=gamma+r+1.05\\u0026colormap_name=turbo\\u0026rescale=0%2C5",\n",
+ " var tile_layer_2feddf7d2f500fbc92b313060e8294af = L.tileLayer(\n",
+ " "https://openveda.cloud/api/raster/collections/tornadoes-2024-paths/items/Tornado_Tracks_cog_2024-05-31/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog_default\\u0026colormap_name=tornado_ef_scale",\n",
" {\n",
" "minZoom": 0,\n",
" "maxZoom": 18,\n",
@@ -1302,60 +1385,76 @@
" );\n",
" \n",
" \n",
- " tile_layer_e6f1f5193e3692db64acdc8d45bb1e98.addTo(map_a549248a96f7ec8817728a7eddc8fc67);\n",
+ " tile_layer_2feddf7d2f500fbc92b313060e8294af.addTo(map_b30f461f6cc6bc77374783c9b80a08bb);\n",
" \n",
" \n",
- " var layer_control_04ce080c0634bab1301d1ec08affd806_layers = {\n",
+ " var layer_control_58b8c099aa8503abd3eb661e50747428_layers = {\n",
" base_layers : {\n",
- " "openstreetmap" : tile_layer_92294d2f33dce1f495a2347692aa6767,\n",
+ " "ESRI Satellite" : tile_layer_c29c12631f1d677ab68fb3f8882e6170,\n",
" },\n",
" overlays : {\n",
- " "Tornado Tracks (March-May 2024)" : tile_layer_e6f1f5193e3692db64acdc8d45bb1e98,\n",
+ " "Place Labels" : tile_layer_2919f1d487feaf5c0c2a8cde2eef32ce,\n",
+ " "Tornado Tracks (March-May 2024)" : tile_layer_2feddf7d2f500fbc92b313060e8294af,\n",
" },\n",
" };\n",
- " let layer_control_04ce080c0634bab1301d1ec08affd806 = L.control.layers(\n",
- " layer_control_04ce080c0634bab1301d1ec08affd806_layers.base_layers,\n",
- " layer_control_04ce080c0634bab1301d1ec08affd806_layers.overlays,\n",
+ " let layer_control_58b8c099aa8503abd3eb661e50747428 = L.control.layers(\n",
+ " layer_control_58b8c099aa8503abd3eb661e50747428_layers.base_layers,\n",
+ " layer_control_58b8c099aa8503abd3eb661e50747428_layers.overlays,\n",
" {\n",
" "position": "topright",\n",
" "collapsed": true,\n",
" "autoZIndex": true,\n",
"}\n",
- " ).addTo(map_a549248a96f7ec8817728a7eddc8fc67);\n",
+ " ).addTo(map_b30f461f6cc6bc77374783c9b80a08bb);\n",
"\n",
" \n",
"</script>\n",
"</html>\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen> "
],
"text/plain": [
- "