RiverRadar / app.py
bsenst's picture
add basic pegel visualization map
46d36c6
import streamlit as st
import requests
import pandas as pd
import pydeck as pdk
# Streamlit App Titel
st.title("PegelOnline - Wasserstandskarten")
# API URL
API_URL = "https://pegelonline.wsv.de/webservices/rest-api/v2/stations.json"
@st.cache
def fetch_data():
"""Ruft die Pegel-Daten von der API ab und gibt sie als DataFrame zurück."""
response = requests.get(API_URL)
if response.status_code == 200:
data = response.json()
# Nur relevante Informationen extrahieren
stations = []
for station in data:
stations.append({
"uuid": station.get("uuid"),
"shortname": station.get("shortname"),
"longname": station.get("longname"),
"km": station.get("km"),
"agency": station.get("agency"),
"longitude": station.get("longitude"),
"latitude": station.get("latitude"),
"water_shortname": station.get("water", {}).get("shortname"),
"water_longname": station.get("water", {}).get("longname"),
})
return pd.DataFrame(stations)
else:
st.error("Fehler beim Abrufen der Daten.")
return pd.DataFrame()
# Daten abrufen
st.write("Rufe Pegel-Daten ab...")
data = fetch_data()
if not data.empty:
st.success("Daten erfolgreich geladen!")
# Kartenanzeige
st.write("### Pegelstationen auf der Karte")
# PyDeck Layer für Kartenanzeige
layer = pdk.Layer(
"ScatterplotLayer",
data=data,
get_position=["longitude", "latitude"],
get_radius=2000,
get_color=[255, 0, 0, 140],
pickable=True,
)
# Deck.gl Map
view_state = pdk.ViewState(
latitude=data["latitude"].mean(),
longitude=data["longitude"].mean(),
zoom=6,
pitch=0,
)
r = pdk.Deck(layers=[layer], initial_view_state=view_state, tooltip={"text": "{shortname}"})
st.pydeck_chart(r)
# Rohdaten anzeigen
st.write("### Rohdaten der Pegelstationen")
st.dataframe(data)
else:
st.warning("Keine Daten verfügbar.")