Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import folium
|
3 |
+
|
4 |
+
# Dictionary of radar sites with their center coordinates (latitude, longitude)
|
5 |
+
RADAR_SITES = {
|
6 |
+
"KTLX": {"name": "KTLX (Oklahoma City)", "lat": 35.333, "lon": -97.277},
|
7 |
+
"KFWS": {"name": "KFWS (Fort Worth)", "lat": 32.847, "lon": -97.276},
|
8 |
+
"KHGX": {"name": "KHGX (Houston)", "lat": 29.757, "lon": -95.389}
|
9 |
+
}
|
10 |
+
|
11 |
+
# Dictionary of radar product tile URLs (from Iowa State Mesonet)
|
12 |
+
RADAR_PRODUCT_TILES = {
|
13 |
+
"Reflectivity": "https://mesonet.agron.iastate.edu/tiles/nexrad-base/{z}/{x}/{y}.png",
|
14 |
+
"Velocity": "https://mesonet.agron.iastate.edu/tiles/nexrad-velo/{z}/{x}/{y}.png"
|
15 |
+
}
|
16 |
+
|
17 |
+
# Function to build the base map tile URL for non-OSM providers
|
18 |
+
def get_base_map_tiles(provider, api_key):
|
19 |
+
if provider == "OpenStreetMap":
|
20 |
+
# OpenStreetMap is the default; no API key required.
|
21 |
+
return None
|
22 |
+
elif provider == "MapTiler":
|
23 |
+
# MapTiler Streets style URL – replace YOUR_KEY with the provided API key.
|
24 |
+
return f"https://api.maptiler.com/maps/streets/{{z}}/{{x}}/{{y}}.png?key={api_key}"
|
25 |
+
elif provider == "Mapbox":
|
26 |
+
# Mapbox Streets style URL – replace YOUR_TOKEN with the provided API key.
|
27 |
+
return f"https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/{{z}}/{{x}}/{{y}}?access_token={api_key}"
|
28 |
+
else:
|
29 |
+
return None
|
30 |
+
|
31 |
+
# Function to generate the HTML map with a radar overlay.
|
32 |
+
def generate_map(radar_site, product, map_provider, api_key):
|
33 |
+
# Retrieve the selected radar site coordinates; default to center of USA if not found.
|
34 |
+
site = RADAR_SITES.get(radar_site, {"lat": 39.8283, "lon": -98.5795})
|
35 |
+
center_lat = site["lat"]
|
36 |
+
center_lon = site["lon"]
|
37 |
+
|
38 |
+
# Create a folium map centered on the radar site.
|
39 |
+
m = folium.Map(location=[center_lat, center_lon], zoom_start=6, control_scale=True)
|
40 |
+
|
41 |
+
# If a provider other than OpenStreetMap is selected, add its tile layer.
|
42 |
+
if map_provider != "OpenStreetMap":
|
43 |
+
base_tile_url = get_base_map_tiles(map_provider, api_key)
|
44 |
+
if base_tile_url:
|
45 |
+
folium.TileLayer(
|
46 |
+
tiles=base_tile_url,
|
47 |
+
attr=f"{map_provider} Map",
|
48 |
+
name=f"{map_provider} Map",
|
49 |
+
overlay=False,
|
50 |
+
control=True
|
51 |
+
).add_to(m)
|
52 |
+
# Otherwise, OpenStreetMap is used by default.
|
53 |
+
|
54 |
+
# Add the radar overlay tile layer based on the selected product.
|
55 |
+
radar_tile_url = RADAR_PRODUCT_TILES.get(product)
|
56 |
+
if radar_tile_url:
|
57 |
+
folium.raster_layers.TileLayer(
|
58 |
+
tiles=radar_tile_url,
|
59 |
+
attr="NOAA NEXRAD",
|
60 |
+
name=f"Radar {product}",
|
61 |
+
overlay=True,
|
62 |
+
control=True,
|
63 |
+
opacity=0.7
|
64 |
+
).add_to(m)
|
65 |
+
|
66 |
+
# Add a layer control so users can toggle layers.
|
67 |
+
folium.LayerControl().add_to(m)
|
68 |
+
|
69 |
+
# Render the map as an HTML string.
|
70 |
+
map_html = m.get_root().render()
|
71 |
+
return map_html
|
72 |
+
|
73 |
+
# Define the choices for each input.
|
74 |
+
site_choices = list(RADAR_SITES.keys())
|
75 |
+
product_choices = list(RADAR_PRODUCT_TILES.keys())
|
76 |
+
map_provider_choices = ["OpenStreetMap", "MapTiler", "Mapbox"]
|
77 |
+
|
78 |
+
# Create the Gradio interface.
|
79 |
+
iface = gr.Interface(
|
80 |
+
fn=generate_map,
|
81 |
+
inputs=[
|
82 |
+
gr.inputs.Dropdown(choices=site_choices, label="Radar Site"),
|
83 |
+
gr.inputs.Dropdown(choices=product_choices, label="Radar Product"),
|
84 |
+
gr.inputs.Dropdown(choices=map_provider_choices, label="Map Provider"),
|
85 |
+
gr.inputs.Textbox(lines=1, placeholder="Enter API key if required", label="API Key")
|
86 |
+
],
|
87 |
+
outputs=gr.outputs.HTML(label="Radar Map"),
|
88 |
+
title="Radar Viewer",
|
89 |
+
description="A simplified radar viewer mimicking some functionality of Supercell Wx. Select a radar site and product, choose a base map provider (enter an API key if needed), and view the radar overlay."
|
90 |
+
)
|
91 |
+
|
92 |
+
iface.launch()
|