# hlnug-hochwasser
Produziert aus den Wasserstands- und Prognosedaten des HLNUG eine Hochwasserkarte. 

Simples und schnell gestricktes R-Skript, das als CRON-Job alle zehn Minuten aufgerufen wird und eine Datawrapper-Karte aktualisiert - indem sie eine Tabelle der 183 bekannten Messstationen übergibt. 

Stand: 22.12.2023

Karte zum Embedden: 
```
<iframe title="Live-Hochwasserkarte für Hessen" aria-label="Karte" id="datawrapper-chart-qcSxx" src="https://datawrapper.dwcdn.net/qcSxx/1636/" scrolling="no" frameborder="0" style="width: 0; min-width: 100% !important; border: none;" height="788" data-external="1"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(a){if(void 0!==a.data["datawrapper-height"]){var e=document.querySelectorAll("iframe");for(var t in a.data["datawrapper-height"])for(var r=0;r<e.length;r++)if(e[r].contentWindow===a.source){var i=a.data["datawrapper-height"][t]+"px";e[r].style.height=i}}}))}();</script>
```

## Was es tut

Das Skript zapft die JSON-Dateien an, die die Webseite der HLNUG selbst nutzt - da es keine richtige API gibt. Es nutzt dabei [eine Datei index.json](https://www.hlnug.de/static/pegel/wiskiweb3/data/internet/layers/10/index.json), die die Wasserstände für alle 183 Messpunkte enthält, und [eine weitere Datei stations.json](https://www.hlnug.de/static/pegel/wiskiweb3/data/internet/stations/stations.json), die Details zu den Messstationen enthält, unter anderem auch die Flüsse, die sie messen. Außerdem werden nach dem Schema der HLNUG-Website URLs generiert, die auf die Einzelseite und eine Thumbnail-Grafik für die jeweilige Messstation verweisen.

Diese Werte werden ausgelesen und in eine Tabelle/ein Dataframe geschrieben, das an eine [Datawrapper-Symbol-Karte](https://academy.datawrapper.de/article/114-how-to-create-a-symbol-map-in-datawrapper) übertragen wird. Jedes Symbol enthält neben den Koordinaten zwei Informationen: den Wasserstand (Größe) und die Warnstufe (Farbe: grün, gelb, orange, purpur)

Weitere Informationen - welcher Fluss, werden in den Tooltipps der Karte angezeigt; den Code für diese Datawrapper-Tooltipps findest du unten. 

## Was es noch nicht tut

Technisch einfach umzusetzen, aber in der Eile noch nicht geschrieben: 
- Informationen über die festgesetzten Warnstufen an der jeweiligen Messstation (geschrieben, aber noch nicht zu Ende korrigiert; einige Messstationen melden unvollständige Daten)
- Historie und (wo vorhanden) Prognose der jeweiligen Messsstation aus der "week.json"-Datei für jede Station (Beispiel: https://www.hlnug.de/static/pegel/wiskiweb3/data/internet/stations/0/42710050/W/week.json). Ein Teil der Stationen berechnet in diesem Datensatz eine Prognose für die nächsten 6 Stunden - für eine Warnkarte ist das der möglicherweise wichtigste Datenpunkt. 
- Die "Abschätzung" für die nächsten 7 Tage ist eine Trendberechnung, die ermöglicht zu sagen, wann der schlimmste Tag am jeweiligen Ort zu erwarten ist.

(Noch nicht umgesetztes Konzept: die deutlich schwieriger zu bestückende [Locator-Karte](https://academy.datawrapper.de/article/161-how-to-create-a-locator-map); Symbole verdeutlichen Trend und zu erwartende Gefahren: Pfeil hoch/gleich/runter mit Tendenz, Farbe verdeutlicht Warnstufe in 6h. Dazu als Text: Wann wird der Höchstwert erwartet)

## Datenquelle

Das HLNUG bietet die Wasserstände und Prognosen über diese Karte an: 

https://www.hlnug.de/static/pegel/wiskiweb3/webpublic/#/overview/Wasserstand

Eine richtige API gibt es (noch) nicht - nur Downloads der Pegel-Historien und die Möglichkeit, Daten aus statisch abgelegten JSON-Dateien vom Server zu lesen. 

## Datenpunkte

Variable | Typ | Beschreibung | Beispiel
---------|-----|--------------|--------
Stationsname | String | Eindeutiger Name | Dillenburg1
Gebiet | String | Hydrologische Zuordnung | Lahn
Fluss | String | Bezeichnung des Gewässers | Dill
station_id | int | 5-stellige Stationsbezeichnung | 42455
station_no | int | 8-stellige Stationsnummer (manchmal wird die ID verwendet, manchmal die Nr.) | 25840708
LAT | float | Geokoordinate: Breitengrad | 50.741453
LON | float | Geokoordinate: Längengrad | 8.280537
Wasserstand | int | Aktuell gemessener Wasserstand in cm | 54
Warnstufe | String | Meldestufe: "MS1". "MS2" oder "MS3" - wenn keine Meldestufe erreicht ist, NA | NA
Warnstufe_num | int | Meldestufe numerisch (0-3) | 0
timestamp | Date | Zeitstempel der letzten Messung (i.d.R. alle 15min) | 2023-12-29T13:45:00.000+01:00
prog_yes | String | Existiert Prognose für diese Messstelle? "yes" oder "no" | yes
png_url | String | URL einer Thumbnail-Grafik (200x100px) des HLNUG mit Historie und evtl. Prognose | https://www.hlnug.de/static/pegel/wiskiweb3/data/internet/stations/0/25800600/W/small_wasserstand_vhs.png
page_url | String | URL der Einzelseite für diese Messstelle beim HLNUG | https://www.hlnug.de/static/pegel/wiskiweb3/webpublic/#/overview/Wasserstand/station/42482/AßlarWVorhersage

## Funktionen

- **get_index()** gibt ein Dataframe mit den oben erwähnten Werten zurück
- **get_alarmlevel(station_no)** - holt die Wasserstände der drei Meldestufen bzw. gibt leeres df zurück, falls nicht zu bekommen
- **calling_all_stations_index()** - erstellt eine Tabelle mit allen Meldestufen und Basisdaten

## Datawrapper-Tooltipp

(lädt die Thumbnail-Grafik des HLNUG in den Tooltipp und bietet einen Link zur Einzelseite der jeweiligen Messstation)

```Gebiet: {{ fluss }} (bei {{ stationsname }}): {{ wasserstand }}cm```

```
Meldestufe: {{ warnstufe_num }}
<a href="{{ page_url }}" target="_blank"><img src="{{ png_url }}" alt="Prognosekarte HLNUG - nutzen Sie die Tabelle auf der unten verlinkten Seite" width="225px"></a>
<br><strong>Weitere Informationen: <a href="{{ page_url }}" target="_blank">{{ stationsname }}-Seite beim HLNUG</a></strong><br><br><small>aktualisiert: {{ FORMAT(timestamp, "DD. MMM. YY") }} um {{ FORMAT(timestamp, "HH:mm") }} Uhr
```