demo_isochrones / app.py
alihmaou's picture
Update app.py
b40a27c verified
import streamlit as st
import geopandas as gpd
from shapely.geometry import Point, Polygon
import folium
from streamlit_folium import st_folium
# Fonction pour calculer les informations et le polygone autour du point cliqué
def getinfo(lat, lon):
# Exemple de calcul pour l'attribut en fonction de la position
info = f"Attribut calculé pour la position ({lat}, {lon})"
# Création d'un polygone autour du point cliqué
polygon = Polygon([
(lon - 0.01, lat - 0.01),
(lon + 0.01, lat - 0.01),
(lon + 0.01, lat + 0.01),
(lon - 0.01, lat + 0.01),
(lon - 0.01, lat - 0.01)
])
# Création du GeoDataFrame
gdf = gpd.GeoDataFrame({
'info': [info],
'geometry': [polygon]
})
return gdf
# Initialisation de l'application Streamlit
st.set_page_config(layout="wide")
# Sidebar pour les informations
st.sidebar.title("Informations sur le point")
point_info = st.sidebar.empty()
# Création de la carte avec Folium
map_center = [48.8566, 2.3522]
m = folium.Map(location=map_center, zoom_start=13)
# Ajout d'un callback sur les clics de la carte
m.add_child(folium.LatLngPopup())
# Affichage de la carte
st_map = st_folium(m, width=700, height=500)
# Fonction pour ajouter un marqueur et un polygone sur la carte
def add_marker_and_polygon(lat, lon):
gdf = getinfo(lat, lon)
info = gdf['info'].iloc[0]
polygon_coords = list(gdf['geometry'].iloc[0].exterior.coords)
# Ajouter le marqueur
folium.Marker([lat, lon], tooltip=info).add_to(m)
# Ajouter le polygone
folium.Polygon(polygon_coords, color="blue", fill=True, fill_opacity=0.5).add_to(m)
# Afficher les informations dans la sidebar
point_info.markdown(f"""
**Coordonnées**
Latitude: {lat:.5f}
Longitude: {lon:.5f}
**Information**
{info}
""")
# Si un clic est détecté, mettre à jour la carte et les informations
if st_map and 'last_clicked' in st_map and st_map['last_clicked']:
lat = st_map['last_clicked']['lat']
lon = st_map['last_clicked']['lng']
add_marker_and_polygon(lat, lon)
# Afficher la carte mise à jour
st_map = st_folium(m, width=700, height=500)