NLWKN Pegelstand API
Hochwasser
Durch das Hochwasser stellt sich mir die Frage, ob es durch die Messstationen möglich ist, eine Vorhersage zu treffen, wann es für mich kritisch wird, bzw. wie lange es noch kritisch bleibt. Dafür kann ich mir die Zu- und Abflüsse der Wabe anschauen, und diese zunächst auf Korrelationen im Pegel untersuchen (Zeitversatz, Pegelerhöhung durch Zufluss von Wabe in Schunter, Rückstau…).
Da das NLWKN jedoch von sich aus keine REST-API zur Verfügung stellt, musste ich zunächst schauen, welche (REST)-API ich bedienen muss, um an die Daten zu gelangen, die von der NLWKN zum Erstellen der Graphen genutzt werden. Anschließend brauchte ich noch die Stationsnummern, um in der REST-API die Daten einer bestimmten Station abrufen zu können.
REST-API
Die Abfrage an die REST-API erfolgt über folgende URL, mit station
entsprechend der Stationsnummer sowie days
∈ {0,-1,-2,…}
api_url = "https://bis.azure-api.net/Pegelonline/REST/chart/station/{station}/datenspuren/parameter/1/tage/{days}/forecast/true?subscription-key=19094e54510d4e89b140ff2d3abf715f&_=1703543285723"
Zuordnung von StationsID zu Ort/Fluss
Die StationsID kann mit folgendem Snippet abgefragt werden und man erhält die Zuordnung aller Stationen zu einem Ort/Fluss.
import requests
from bs4 import BeautifulSoup
for id in range(1,999):
pegelonline_url = f"https://www.pegelonline.nlwkn.niedersachsen.de/Pegel/Binnenpegel/ID/{id}"
pegelonline_response = requests.get(pegelstand_url)
if pegelonline_response.status_code == 404:
continue
soup = BeautifulSoup(pegelonline_response.text, 'html.parser')
location = soup.find(id='MainContent_Page_Detail_Content1_fvPegel_PegelName')
waters = soup.find(id='MainContent_Page_Detail_Content1_fvPegel_Gewaesser')
print(f"{id:<3}\t{location.text:<40}\t{waters.text}")
JSON Schema
Um einen Überblick über das verwendete JSON-Schema zu bekommen, habe ich jede ID abgefragt und mit genson die JSON-Schemata der einzelnen JSON-Objekte aggregiert. Dabei werden Attribute, die in jedem JSON-Objekt (Schnittmenge) vorkommen als required vermerkt.
import json
import requests
from genson import SchemaBuilder
builder = SchemaBuilder()
days = -2
for id in range(100,999):
pegelonline_url = f"https://www.pegelonline.nlwkn.niedersachsen.de/Pegel/Binnenpegel/ID/{id}"
pegelonline_response = requests.get(pegelonline_url)
if pegelonline_response.status_code == 404:
continue
api_url = f"https://bis.azure-api.net/Pegelonline/REST/chart/station/{id}/datenspuren/parameter/1/tage/{days}/forecast/true?subscription-key=19094e54510d4e89b140ff2d3abf715f&_=1703543285723"
api_response = requests.get(api_url)
builder.add_object(api_response.json())
print(id)
result_schema = builder.to_schema()
print(json.dumps(result_schema, indent=4))
Und hier das JSON-Schema der Pegelonline-API.
Flussverlauf und Messstationen
Die für mich relevanten Stationen um für das östliche Stadtgebiet in Braunschweig eine Aussage treffen zu können sind einerseits der Zulauf der Wabe durch den Elm mit einer Messstation in Sickte, sowie andererseits der Ablauf durch die Schunter. An der Schunter gibt es zwei Messstationen: eine in Glentorf bevor die Wabe in die Schunter fließt, sowie eine in Harxbüttel, nachdem die Wabe in die Schunter geflossen ist. Die beiden Flüsse und deren Zusammenfluss, sowie die Orte mit den Messstationen sind auf dem Bild farblich hervorgehoben.
Tabelle aller Stationen
Fluss | Ort | Station |
---|---|---|
Ableiter zur Hase | Alfhausen-Rieste | 617 |
Abzucht | Oker | 794 |
Aller | Ahlden | 148 |
Aller | Brenneckenbrück | 213 |
Aller | Celle | 223 |
Aller | Grafhorst 1 | 281 |
Aller | Langlingen | 392 |
Aller | Marklendorf | 431 |
Aller | Rethem | 496 |
Aller | Eitze | 593 |
Aschau | Beedenbostel | 180 |
Aue | Klein Hollenbeck | 799 |
Außenweser | Leuchtturm Alte Weser | 419 |
Böhme | Brock | 214 |
Delme | Holzkamp | 344 |
Dinkel | Lage I | 388 |
Düte | Wersen | 116 |
Ecker | Gitterkopf | 277 |
Ecker | Eckertalsperre | 353 |
Elbe | Zollenspieker | 141 |
Elbe | Bleckede | 195 |
Elbe | Boizenburg | 200 |
Elbe | Cranz | 225 |
Elbe | Cuxhaven Steubenhöft | 226 |
Elbe | Damnatz | 228 |
Elbe | Dömitz | 238 |
Elbe | Geesthacht | 275 |
Elbe | Grauerort | 286 |
Elbe | Hitzacker | 334 |
Elbe | Hohnstorf | 337 |
Elbe | Lühort | 424 |
Elbe | Neu Darchau | 439 |
Elbe | Otterndorf - Hadelner Kanalschleuse | 479 |
Elbe | Schnackenburg | 518 |
Elbe | Lenzen | 597 |
Elbe | Artlenburg | 632 |
Elbe | Wehr Geesthacht UP | 633 |
Elbe | Altengamme | 634 |
Elbe | Over | 635 |
Elbe | Bunthaus | 636 |
Emmer | Welsede | 113 |
Emmer | Bad Pyrmont | 170 |
Ems | Dalum | 227 |
Ems | Lingen-Darme | 413 |
Ems | Rheine Unterschleuse | 497 |
Ems | Versen-Wehrdurchstich | 574 |
Ems | Gandersum | 631 |
Este | Buxtehude | 222 |
Este | Emmen | 259 |
Exter | Uchtdorf | 565 |
Fintau | Lauenbrück F | 395 |
Fladderkanal | Addrup | 145 |
Fuhse | Wathlingen | 106 |
Fuhse | Peine | 482 |
Fulda | Bonaforth | 202 |
Gande | Gandersheim | 272 |
Gerdau | Hansen | 304 |
Grane | Granetalsperre | 354 |
Grane | Margarethenklippe | 427 |
Große Aa | Beesten | 182 |
Große Aue | Heide OP | 318 |
Große Aue | Steyerberg | 537 |
Große Hase | Bunnen | 220 |
Hase | Bersenbrück | 188 |
Hase | Bokeloh | 201 |
Hase | Bramsche | 208 |
Hase | Eversburg | 264 |
Hase | Haselünne | 310 |
Hase | Herzlake | 328 |
Hase | Lüstringen | 425 |
Hase | Hasehubbrücke | 787 |
Hunte | Colnrade | 224 |
Hunte | Huntlosen II | 361 |
Hunte | Schäferhof | 514 |
Hunte | Tungeln | 795 |
Ilme | Oldendorf | 472 |
Ilmenau | Bienenbüttel | 189 |
Innerste | Bredelem | 210 |
Innerste | Heinde | 320 |
Innerste | Innerstetalsperre | 355 |
Innerste | Rote Klippe | 507 |
Ise | Neudorf-Platendorf | 441 |
Jade | WHV Alter Vorhafen | 602 |
Jeetzel | Lüchow Oberwasser | 422 |
Jeetzel | Lüchow Unterwasser | 594 |
Lachte | Lachendorf | 386 |
Lager Hase | Gut Lage | 295 |
Lager Hase | Uptloh | 567 |
Lamme | Bad Salzdetfurth | 171 |
Leine | Göttingen | 280 |
Leine | Greene | 287 |
Leine | Herrenhausen | 325 |
Leine | Koldingen | 378 |
Leine | Leineturm | 400 |
Leine | Neustadt | 446 |
Leine | Poppenburg | 486 |
Leine | Reckershausen | 492 |
Leine | Schwarmstedt | 520 |
Leine | Salzderhelden | 639 |
Lethe | Oberlethe | 457 |
Luhe | Roydorf | 509 |
Luhe | Thansen | 555 |
Lühe | Horneburg | 606 |
Lune | Deelbrügge | 232 |
Neile | Sehlde | 524 |
Nette | Groß Rhüden | 291 |
Nordsee | Bensersiel | 184 |
Nordsee | Borkum Fischerbalje | 203 |
Nordsee | Leyhörn | 404 |
Nordsee | Norderney-Riffgat | 452 |
Nordsee | Vareler Schleuse | 569 |
Oder | Erikabrücke | 261 |
Oder | Odertalsperre | 356 |
Oker | Altenau I | 154 |
Oker | Groß Schwülper | 292 |
Oker | Okertalsperre | 357 |
Oker | Ohrum | 466 |
Oker | Schladen | 517 |
Örtze | Feuerschützenbostel | 268 |
Oste | Hechthausen | 315 |
Oste | Rockstedt | 502 |
Oste | Bremervörde UW | 605 |
Rhume | Berka R | 187 |
Rhume | Elvershausen | 256 |
Rhume | Northeim | 454 |
Schunter | Glentorf | 278 |
Schunter | Harxbüttel | 306 |
Schwinge | Schwinge | 522 |
Schwinge | Schwinge Sperrwerk | 523 |
Seeve | Jehrden | 367 |
Sieber | Hattorf | 313 |
Sieber | Pionierbrücke | 484 |
Soeste | Thülsfeld | 638 |
Söse | Sösetalsperre | 358 |
Söse | Riefensbeek | 499 |
Sperrlutter | Odertal II | 460 |
Spiekaer Wasserlöse (Außentief) | Spieka-Neufeld | 530 |
Stederau | Niendorf II S | 449 |
Vechte | Wehr Neuenhaus | 111 |
Vechte | Emlichheim | 258 |
Vechte | Ohne | 465 |
Wabe | Niedersickte | 447 |
Wagenfelder Aue | Düste | 250 |
Werra | Letzter Heller | 403 |
Weser | Wahmbeck | 102 |
Weser | Bodenwerder | 197 |
Weser | Dörverden | 240 |
Weser | Drakenburg | 241 |
Weser | Fedderwardersiel | 267 |
Weser | Hameln-Wehrbergen | 302 |
Weser | Hann.- Münden | 303 |
Weser | Höxter | 350 |
Weser | Hoya | 351 |
Weser | Intschede | 365 |
Weser | Karlshafen | 370 |
Weser | Liebenau | 407 |
Weser | Nienburg | 448 |
Weser | Petershagen | 483 |
Weser | Porta | 487 |
Weser | Rinteln | 500 |
Weser | Stolzenau | 539 |
Weser | Vegesack | 571 |
Weser | Vlotho | 577 |
Weser | Robbensüdsteert | 599 |
Weser | Elsfleth | 600 |
Weser | Oslebshausen | 601 |
Westaue | Wunstorf | 140 |
Wiedau | Worth | 136 |
Wietze | Wieckenberg | 126 |
Wörpe | Grasberg | 285 |
Wümme | Hellwege | 322 |
Wümme | Lauenbrück B75 | 394 |