dashboard-temp / map-spike.py
nataliegref's picture
Switch to matplotlib
164d1c0
Raw
History Blame Contribute Delete
4.13 kB
# Example taken from here - https://shinylive.io/py/examples/#map
import os
from shiny import reactive
from shiny.express import input, render, ui
from shinywidgets import render_widget
import ipyleaflet as ipyl
import pandas as pd
import geopandas as gpd
from ipyleaflet import Map, Rectangle, basemaps, basemap_to_tiles, LayersControl, ColorMap, FeatureGroup
from branca.colormap import linear
from shapely.geometry import box
def point_to_square(row, size=0.0009):
x, y = row.geometry.x, row.geometry.y
half = size / 2
return box(x - half, y - half, x + half, y + half)
df = pd.read_csv("example.csv")
# Step 2: Create GeoDataFrame with UTM Zone 15N
gdf = gpd.GeoDataFrame(
df,
geometry=gpd.points_from_xy(df['x'], df['y']),
crs="EPSG:32615" # <- Your current system
)
# Step 3: Reproject to WGS84 (lat/lon)
gdf = gdf.to_crs("EPSG:4326")
# Convert points to small square polygons
gdf["geometry_box"] = gdf.apply(point_to_square, axis=1)
print(gdf.head())
# Step 4: Extract lat/lon columns for ipyleaflet
gdf["lat"] = gdf.geometry.y
gdf["lon"] = gdf.geometry.x
temp_colormap = linear.YlOrRd_09.scale(df['LST'].min(), df['LST'].max())
# def generate_temp_layer():
# rectangles = []
# for _, row in gdf.iterrows():
# lat = row['lat']
# lon = row['lon']
# size_deg = 0.0009 # Approx ~100m (latitude degrees)
# bounds = [
# (lat - size_deg / 2, lon - size_deg / 2),
# (lat + size_deg / 2, lon + size_deg / 2)
# ]
# color = temp_colormap(row['LST'])
# rect = Rectangle(
# bounds=bounds,
# color=color,
# fill_color=color,
# fill_opacity=0.5,
# weight=0
# )
# rectangles.append(rect)
# return rectangles
city_centers = {
"London": (51.5074, 0.1278),
"Paris": (48.8566, 2.3522),
"New York": (40.7128, -74.0060),
"Guatemala city": (14.6349149, -90.5068824),
"Zone 15": (14.61925, -90.49386)
}
ui.input_text("Text", "Some vector", "Zone 15")
@render_widget
def map():
city = use_in_model(input.Text())
center = city_centers.get(city, (0, 0))
m = Map(center=center, zoom=13, basemap=basemaps.OpenStreetMap.Mapnik)
# Add rectangle overlay
geo_data = ipyl.GeoData(
geo_dataframe=gdf,
style={
"color": "black",
"fillColor": "#3366cc",
"opacity": 0.05,
"weight": 1.9,
"dashArray": "2",
"fillOpacity": 0.6,
},
hover_style={"fillColor": "red", "fillOpacity": 0.2},
name="Temperature",
)
m.add(geo_data)
m.add(ipyl.LayersControl())
return m
# @render_widget
# def map():
# city = use_in_model(input.Text())
# center = city_centers.get(city, (0, 0))
# # m = Map(center=center, zoom=13, basemap=basemaps.OpenStreetMap.Mapnik)
# m = Map(center=city_centers["Guatemala city"], zoom=13, basemap=basemaps.OpenStreetMap.Mapnik)
# print(f"Centering on city: {city}")
# # Add rectangle overlay
# for rect in generate_temp_layer():
# m.add_layer(rect)
# # Optional: Add color legend
# # m.add_control(temp_colormap.legend(title= "Temp"))
# # Add controls
# m.add_control(LayersControl(position="topright"))
# return m
def use_in_model(x):
# TODO: Call some model loaded in huggingface_hub.
# Define the client once then just call the
# client from here.
# from huggingface_hub import InferenceClient
# client = InferenceClient(
# api_key=os.environ["HF_TOKEN"],
# provider="auto",
# )
#
# completion = client.chat.completions.create(
# model="deepseek-ai/DeepSeek-V3-0324",
# messages=[{"role": "user", "content": "A story about hiking in the mountains"}]
# )
return x
@render.text
def text():
return ("You entered: " + use_in_model(input.Text()))
@reactive.effect
def _():
try:
map.widget.center = city_centers[use_in_model(input.Text())]
except:
pass