nakas commited on
Commit
960f12c
·
verified ·
1 Parent(s): 0ca5001

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +92 -0
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()