Belastingen inlezen en classificeren

Om inzicht te krijgen in de veiligheid van waterkeringen is het van belang om de belastingen op de waterkeringen in kaart te brengen. Dit kunnen waterstanden op het buitenwater (zee, rivieren of meren) zijn, maar ook grondwaterstanden. De belastingen worden eerst ingelezen uit verschillende databronnen en vervolgens geclassificeerd. De belastingen worden ingelezen voor verschillende momenten (bijv. gister, nu, morgen of overmorgen etc.), zodat naast metingen ook voorspellingen van belastingen worden ingelezen.

Belastingen inlezen

De volgende databronnen worden op dit moment in de Toolbox Continu Inzicht ondersteund:

  1. Delft-FEWS
  2. (Noos)Matroos
  3. RWS waterwebservices
  4. RWS waterinfo

Aquo standaard

De standaard ondersteunde belastingen zetten de parameters om in het Aquo standaard formaat met parameter id, code en omschrijving (naam). Elke functie roept de functie base.aquo.read_aquo() aan, hierbij wordt ook gekeken naar de GlobalVariables voor een aquo_allias. Op die manier is het ook mogelijk om andere parameters, bijvoorbeeld uit FEWS, te koppelen aan een Aquo grootheid. De meta data die gebruikt wordt voor deze standaard is te vinden onder Aquo grootheden.

Delft-FEWS

Veel waterschappen gebruiken een Delft - Forecast Early Warning System (FEWS) implementatie voor het beheren van verschillende interne en externe informatiebronnen. Via de REST API van FEWS kunnen verschillende belastingen worden ingelezen. Toegang verkrijgen tot een FEWS is complexer dan andere bronnen, waardoor het noodzakelijk is om extra parameters te definiëren in het configuratiebestand. De functie get_fews_locations() kan worden gebruikt om de beschikbare locaties te tonen.

GlobalVariables:
    rootdir: "data_sets"  
    moments: [-24,0,24,48]
    aquo_allias:
        WNSHDB1: "WATHTE"


    LoadsFews:
        host: "https:**********"
        port: ****
        region: "fewspiservice"
        version: "1.25"
        filter: "HKV_WV_1"
        parameters: ["WNSHDB1"]  
       

DataAdapter:
    ...
GlobalVariables:
  • rootdir: Bestandslocatie van de invoer- en uitvoerbestanden
  • moments: Momenten in uren waar gegevens voor opgehaald moet worden (bijv. -24, 0, +24, +48, +72 uur)
LoadsFews:
  • host: FEWS PI REST URL
  • port: FEWS PI REST poortnummer
  • region: FEWS PI REST regionaam
  • version: FEWS PI versienummer
  • filter: Filternaam zoals deze in FEWS wordt gebruikt
  • parameters: Parameternaam zoals deze in FEWS wordt gebruikt
Invoer schema locaties:
  • measurement_location_id (int): Meetlocatie id
  • measurement_location_code (str): Meetlocatie code
  • measurement_location_description (str): Meetlocatie omschrijving/naam
Uitvoer schema:
  • measurement_location_id (int): Meetlocatie id
  • measurement_location_code (str): Meetlocatie code
  • measurement_location_description (str): Meetlocatie omschrijving/naam
  • parameter_id (int): Parameter id overeenkomstig Aquo-standaard
  • parameter_code (str): Parameter code overeenkomstig Aquo-standaard
  • parameter_description (str): Parameter omschrijving overeenkomstig Aquo-standaard
  • unit (str): Eenheid van de waarde
  • date_time (datetime): Datum en tijd van de waarde
  • value (float): Waarde
  • value_type (str): Type waarde: meting of verwachting

Matroos

Matroos of Multifunctional Access Tool for Operational Oceandata Services is een webbased distributiesysteem van de operationele verwachtingen van waterstanden, stroming, debieten en golven, van onder meer het Watermanagementcentrum Nederland. Matroos is beschikbaar voor verschillende doelgroepen, waarvan er op dit moment drie relevant zijn voor de ontwikkeling van de Toolbox Continu Inzicht. De verschillende versies worden in de tabel hieronder toegelicht. Voor meer informatie verwijzen we naar de nieuwsbrief op iplo.nl. In de Toolbox wordt nu alleen de series API gebruikt, dus volstaat NOOS.

URL Type Inhoud Doelgroep
vitaal.matroos.rws.nl extern, vitaal 21 dagen Kustwacht, Waterschappen
matroos.rws.nl extern Volledige historie Waterschappen, universiteiten, externe
noos.matroos.rws.nl extern, open Beperkte set; series:volledig; maps: 14 dagen NOOS internationaal, Open Data

In Matroos zijn verschillende bronnen beschikbaar, met get_matroos_sources() kan een lijst van deze worden gegeneerd. De beschikbare locaties kunnen worden weergegeven met get_matroos_locations(), met mogelijkheid om te filteren op een bron en parameter.


GlobalVariables:
    rootdir: "data_sets"
    moments: [-24,0,24,48]
    ...

    LoadsMatroos:
        website: "noos" # noos, vitaal of matroos
        model: "observed"
        parameters: ["WATHTE"]

DataAdapter:
    ...

Voor het gebruik van vitaal.matroos en matroos is een gebruikersnaam en wachtwoord nodig. Deze moeten in de environmental variables worden meegegeven (.env bestand).

vitaal_user: "..."
vitaal_password: "..."
# of
matroos_user: "..."
matroos_password: "..."

RWS WaterWebservices

Via de RWS WaterWebservices zijn metingen en verwachtingen van o.a. waterstanden beschikbaar via de WaterWebservices API. Vooral langs de rivieren zijn veel meetpunten beschikbaar. Deze API is openbaar en vereist weinig configuratie. De MISSING_VALUE kan in de configuratie worden aangepast, maar staat al standaard ingesteld.

    LoadsWaterwebservicesRWS:
        parameters:  ["WATHTE"]

Beschikbare locaties kunnen worden weergegeven met get_rws_webservices_locations().

RWS Waterinfo

Naast de RWS WaterWebservices is alle informatie van Rijkswaterstaat ook verkrijgbaar via waterinfo.rws.nl. Waterinfo is bedoeld als informatieportaal, en niet als API om data op te halen. Voordat de WaterWebservices API beschikbaar was, werd de Waterinfo-website gebruikt in verschillende Continu Inzicht systemen. Om de comptabiliteit met deze oudere Continu Inzicht systemen te behouden, is deze functie nu nog wel beschikbaar in de Toolbox Continu Inzicht. Wel is in de toekomst mogelijk dat door veranderingen aan de Waterinfo-website deze ondersteuning komt te vervallen.

 GlobalVariables:
    rootdir: "data_sets"
    moments: [-24,48]

    LoadsWaterinfo:
        parameters: ["waterhoogte"]

Omdat data ophalen uit Waterinfo gevoeliger is, worden de verschillende parameters hieronder weergegeven.

omschrijving maptype periode
Waterhoogte in cm waterhoogte 2d terug, 2d vooruit: -48,48
6u terug, 3u vooruit: -6,3
9d terug, 2d vooruit: -216,48
28d terug: -672,0
omschrijving maptype periode
Windsnelheid in m/s wind 2d terug: -48,48
6u terug: -6,3
9d terug: -216,48
28d terug: -672,0
omschrijving maptype periode
Golfhoogte in cm golfhoogte 2d terug, 2d vooruit: -48,48
6u terug, 3u vooruit: -6,3
9d terug, 2d vooruit: -216,48
28d terug: -672,0
omschrijving maptype periode
Watertemperatuur in °C watertemperatuur 2d terug: -48,0
6u terug: -6,0
9d terug: -216,0
28d terug:-672,0
omschrijving maptype periode
Luchttemperatuur in °C luchttemperatuur 2d terug: -48,0
6u terug: -6,0
9d terug: -216,0
28d terug:-672,0
omschrijving maptype periode
Astronomisch getij astronomische-getij 2d terug, 2d vooruit: -48,48
6u terug, 3u vooruit:-6,3
9d terug, 2d vooruit: -216,48
28d terug:-672,0
omschrijving maptype periode
Stroomsnelheid in m/s stroming 2d terug: -48,0
6u terug:-6,0
9d terug: -216,0
28d terug:-672,0
omschrijving maptype periode
Debiet in m3/s waterafvoer 2d terug, 2d vooruit: -48,48
6u terug, 3u vooruit: -6,3
9d terug, 2d vooruit:-216,48
28d terug:-672,0
omschrijving maptype periode
Chloride in mg/l zouten 2d terug: -48,0
6u terug: -6,0
9d terug: -216,0
28d terug:-672,0
Invoer schema locaties:
  • measurement_location_id (int): Meetlocatie id
  • measurement_location_code (str): Meetlocatie code
  • measurement_location_description (str): Meetlocatie omschrijving/naam
Uitvoer schema:
  • measurement_location_id (int): Meetlocatie id
  • measurement_location_code (str): Meetlocatie code
  • measurement_location_description (str): Meetlocatie omschrijving/naam
  • parameter_id (int): Parameter id overeenkomstig Aquo-standaard
  • parameter_code (str): Parameter code overeenkomstig Aquo-standaard
  • parameter_description (str): Parameter omschrijving overeenkomstig Aquo-standaard
  • unit (str): Eenheid van de waarde
  • date_time (datetime): Datum en tijd van de waarde
  • value (float): Waarde
  • value_type (str): Type waarde: meting of verwachting

Classificeren van belastingen

De verschillende hierboven benoemde functies voor het inlezen van belastingen geven een tijdreeks terug op bepaalde punten. Deze kunnen omgezet worden naar moment, geclassificeerd met grenswaardes en toegekend aan dijkvakken.

Tijdreeks naar momenten

De ingelezen tijdsreeks met belastingen wordt omgezet naar belastingen op specifieke momenten met LoadsToMoments.

Voor gebieden waar het getij van invloed is, is een aanvullende configuratie nodig. Bij getij wordt de maximale belasting tijdens een getijdencyclus (+/-12.25 uur) bepaald. Zonder deze configuratie wordt de belasting exact op het vooraf gedefinieerde moment bepaald.

GlobalVariables:
    rootdir: "data_sets"
    moments: [-24,0,24,48]

    LoadsToMoments:
        tide: true

DataAdapter:
    default_options:
        csv:
            sep: ","
    waterstanden_waterinfo:
        type: csv
        path: "waterstanden_waterinfo.csv"
    waterstanden_waterinfo_maxima:
        type: csv
        path: "waterstanden_waterinfo_maxima.csv"
from toolbox_continu_inzicht import Config, DataAdapter
from toolbox_continu_inzicht.loads import LoadsToMoments

config = Config(config_path="config.yaml")
config.lees_config()
data_adapter = DataAdapter(config=config)
moments = LoadsToMoments(data_adapter=data_adapter)
moments.run(input="waterstanden_waterinfo", output="waterstanden_waterinfo_maxima")

Classificeren van belastingen

Met LoadsClassify kunnen met vooraf gedefinieerde grenswaardes de belastingen worden geclassificeerd, bijvoorbeeld als waterstand die 1 keer per 100 jaar voorkomt. Hierbij moeten de data-adapters van de grenswaardes en belastingen worden doorgegeven in een lijst. Hierbij is de volgorde van de lijst belangrijk: eerst grenswaardes en dan belastingen. De belastingen moeten voor het classificeren aangeleverd worden als momentwaardes.

GlobalVariables:
    rootdir: "data_demo"
    moments: [-24,0,24,48]

    LoadsMaxima:
        tide: False

DataAdapter:
    default_options:
        csv:
            sep: ","
    waterstanden_waterinfo_maxima:
        type: csv
        path: "waterstanden_waterinfo_maxima.csv"
    waterinfo_klassengrenzen:
        type: csv
        path: "klassengrenzen.csv"
    waterstanden_waterinfo_klassen:
        type: csv
        path: "waterstanden_waterinfo_klassen.csv"
from toolbox_continu_inzicht import Config, DataAdapter
from toolbox_continu_inzicht.loads import LoadsClassify

config = Config(config_path="config.yaml")
config.lees_config()
data_adapter = DataAdapter(config=config)
classify = LoadsClassify(data_adapter=data_adapter)
classify.run(
    input=["waterinfo_klassengrenzen", "waterstanden_waterinfo_maxima"],
    output="waterstanden_waterinfo_klassen",
)

Toekennen van belastingen aan secties

De belastingen zijn nu beschikbaar op de meetlocaties van FEWS, Matroos, RWS Waterinfo of RWS WaterWebServices. De volgende stap is het vertalen van de belastingen in de meetpunten naar de secties (dijkvakken of kunstwerken) via SectionsLoads. Voor het toekennen van belastingen aan secties zijn drie databronnen nodig: de dijkvakken, de belastingen en een koppeling tussen dijkvakken en belastinglocaties. De drie data-adapters worden vervolgens doorgegeven als een lijst. Hierbij is de eerder genoemde volgorde van belang: dijkvakken, belastingen en koppeling dijkvakken en belastinglocaties. Als een sectie tussen twee meetpunten ligt, wordt een interpolatiealgoritme (bijv. 25% waarde in meetpunt 1 + 75% waarde in meetpunt 2) toegepast. Omdat dit lokaal kan verschillen hoe deze interpolatie wordt gemaakt, is er geen automatische script voor. De interpolatie moet dus vooraf gedefinieerd worden door de gebruiker en wordt meegegeven bij de koppeling tussen dijkvakken en belastinglocaties. Hierbij wordt gebruik gemaakt van fractionup en fractiondown om het gewicht van de bovenstroomse en benedenstroomse belastinglocatie te bepalen.

GlobalVariables:
    rootdir: "data_demo"
    moments: [-24,0,24,48]

    SectionsLoads:
        MISSING_VALUE: -9999.0

DataAdapter:
    default_options:
        csv:
            sep: ","
    dijkvakken:
        type: csv
        path: "dijkvakken.csv"
    waterstanden:
        type: csv
        path: "waterstanden_waterinfo.csv"
    koppeling_dijkvak_belastinglocatie:
        type: csv
        path: "dijkvak_belastinglocatie.csv"
    waterstanden_per_dijkvak:
        type: csv
        path: "waterstanden_per_dijkvak.csv"
from toolbox_continu_inzicht import Config, DataAdapter
from toolbox_continu_inzicht.sections import SectionsLoads

config = Config(config_path="config.yaml")
config.lees_config()
data_adapter = DataAdapter(config=config)
sections_loads = SectionsLoads(data_adapter=data_adapter)
sections_loads.run(
    input=["dijkvakken", "waterstanden", "koppeling_dijkvak_belastinglocatie"],
    output="waterstanden_per_dijkvak",
)