import logging
import warnings
import numpy as np
from .. import cache
from . import webservices
logger = logging.getLogger(__name__)
[docs]
def get_polygons(**kwargs):
"""Get the location of the Dutch Waterboards as a Polygon GeoDataFrame.
.. deprecated:: 0.10.0
`get_polygons` will be removed in nlmod 1.0.0, it is replaced by
`download_polygons` because of new naming convention
https://github.com/gwmod/nlmod/issues/47
"""
warnings.warn(
"get_polygons is deprecated and will eventually be removed, "
"please use nlmod.read.waterboard.download_polygons() in the future.",
DeprecationWarning,
)
return download_polygons(**kwargs)
[docs]
def download_polygons(**kwargs):
"""Get the location of the Dutch Waterboards as a Polygon GeoDataFrame."""
url = "https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Waterschapsgrenzen/FeatureServer"
layer = 0
# NOTE: Referer needed to avoid Unauthorized Access error (500)
if "headers" not in kwargs:
kwargs["headers"] = {
"Referer": "https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services"
}
ws = webservices.arcrest(url, layer, **kwargs)
# remove different prefixes
ws["waterschap"] = ws["waterschap"].str.replace("HH van ", "")
ws["waterschap"] = ws["waterschap"].str.replace("HHS van ", "")
ws["waterschap"] = ws["waterschap"].str.replace("HH ", "")
ws["waterschap"] = ws["waterschap"].str.replace("Hoogheemraadschap van ", "")
ws["waterschap"] = ws["waterschap"].str.replace("Hoogheemraadschap ", "")
ws["waterschap"] = ws["waterschap"].str.replace("Administratieve grens ", "")
ws["waterschap"] = ws["waterschap"].str.replace(" 2018", "")
ws["waterschap"] = ws["waterschap"].str.replace(" (INSPIRE-grens)", "")
ws["waterschap"] = ws["waterschap"].str.replace("Beheergebied waterschap ", "")
ws["waterschap"] = ws["waterschap"].str.replace("WS ", "")
ws["waterschap"] = ws["waterschap"].str.replace("Waterschap ", "")
ws["waterschap"] = ws["waterschap"].str.replace("Wetterskip ", "")
ws = ws.set_index("waterschap")
return ws
[docs]
def get_configuration():
"""Get the configuration of of the data sources of the Waterboards."""
config = {}
config["Aa en Maas"] = {
"bgt_code": "W0654",
"watercourses": {
"url": "https://gisservices.aaenmaas.nl/arcgis/rest/services/EXTERN/Legger/MapServer",
"layer": 10,
"bottom_width": "BODEMBREEDTE",
"bottom_height": [["BODEMHOOGTE_BOS", "BODEMHOOGTE_BES"]],
},
"level_areas": {
# "server_kind": "wfs",
# "url": "https://maps.aaenmaas.nl/services/DAMO_S/wfs?",
# "layer": "WS_PEILGEBIED",
"url": "https://gisservices.aaenmaas.nl/arcgis/rest/services/EXTERN/Oppervlaktewater_B/MapServer",
"layer": 5,
"summer_stage": "ZOMERPEIL",
"winter_stage": "WINTERPEIL",
},
"weirs": {
"url": "https://gisservices.aaenmaas.nl/arcgis/rest/services/EXTERN/Legger/MapServer",
"layer": 7, # Stuw (7)
"index": "CODE",
"summer_stage": "HOOGSTEDOORSTROOMHOOGTE",
"winter_stage": "LAAGSTEDOORSTROOMHOOGTE",
},
"culverts": {
"url": "https://gisservices.aaenmaas.nl/arcgis/rest/services/EXTERN/Legger/MapServer",
"layer": 4, # Duiker / Sifon (4)
"index": "CODE",
"summer_stage": "HOOGSTEDOORSTROOMHOOGTE",
"winter_stage": "LAAGSTEDOORSTROOMHOOGTE",
},
}
config["Amstel, Gooi en Vecht"] = {
"bgt_code": "W0155",
"watercourses": {
"url": "https://maps.waternet.nl/arcgis/rest/services/Publiek/WNET_GEO_LEGGER_WL_2021/MapServer",
"layer": 0, # Primaire Waterloop Legger
"bottom_width": "AVVBODDR",
"bottom_height": "AVVBODH",
"water_depth": "AVVDIEPT",
"index": "OVKIDENT",
},
"level_areas": {
"url": "https://maps.waternet.nl/arcgis/rest/services/Publiek/GW_GPG/MapServer",
"layer": 5, # Vigerende peilgebieden
"index": "GPGIDENT",
"summer_stage": [
"GPGZMRPL",
"IWS_BOVENGRENS_ZOMERPEIL",
"IWS_GPGVASTP",
],
"winter_stage": [
"GPGWNTPL",
"OPVAFWWP",
"IWS_GPGVASTP",
],
},
}
config["Brabantse Delta"] = {
"bgt_code": "W0652",
"watercourses": {
# legger
"url": "https://geoservices.brabantsedelta.nl/arcgis/rest/services/EXTERN/WEB_Vastgestelde_Legger_Oppervlaktewaterlichamen/FeatureServer",
"layer": 11, # categorie A
"bottom_width": "WS_BODEMBREEDTE_L",
"bottom_height": [["WS_BH_BENEDENSTROOMS_L", "WS_BH_BOVENSTROOMS_L"]],
# "layer": 12, # categorie B
# beheer
# "url": "https://geoservices.brabantsedelta.nl/arcgis/rest/services/EXTERN/WEB_Beheerregister_Waterlopen_en_Kunstwerken/FeatureServer",
# "layer": 13, # categorie A
# "layer": 14, # categorie B
# "layer": 15, # categorie C
},
"weirs": {
"url": "https://geoservices.brabantsedelta.nl/arcgis/rest/services/EXTERN/WEB_Vastgestelde_Legger_Oppervlaktewaterlichamen/FeatureServer",
"layer": 4, # Stuw (4)
},
"culverts": {
"url": "https://geoservices.brabantsedelta.nl/arcgis/rest/services/EXTERN/WEB_Vastgestelde_Legger_Oppervlaktewaterlichamen/FeatureServer",
"layer": 8, # Duiker (8)
},
"level_areas": {
"url": "https://geoservices.brabantsedelta.nl/arcgis/rest/services/EXTERN/WEB_Peilbesluiten/MapServer",
"layer": 0, # Peilgebied vigerend
# "layer": 1, # Peilgebied praktijk
"summer_stage": [
"WS_ZOMERPEIL",
"WS_VAST_PEIL",
"WS_MAXIMUM",
],
"winter_stage": [
"WS_WINTERPEIL",
"WS_VAST_PEIL",
"WS_MINIMUM",
],
},
}
config["De Dommel"] = {
"bgt_code": "W0539",
"watercourses": {
# "url": "https://services8.arcgis.com/dmR647kStmcYa6EN/arcgis/rest/services/Hoofdwaterlopen/FeatureServer",
# "layer": 10, # Hoofdwaterlopen
# "layer": 10, # LOW_2021_A_Water_Afw_Afv
# "layer": 11, # LOW_2021_B_Water
# "layer": 2, # LOW_2021_Profielpunt
# "layer": 13, # LOW_2021_Profiellijn
# "index": "WS_PROFIELID",
# "url": "https://services8.arcgis.com/dmR647kStmcYa6EN/arcgis/rest/services/A_watergang_Beheerregister/FeatureServer",
# "layer": 0, # A_watergang_Beheerregister (0)
# "index": "LOKAALID",
"url": "https://services8.arcgis.com/dmR647kStmcYa6EN/arcgis/rest/services/LWW_2023_A_water_V/FeatureServer",
"index": "Nieuw_Dommel_ID",
},
"culverts": {
"url": "https://services8.arcgis.com/dmR647kStmcYa6EN/arcgis/rest/services/LWW_2023_Duiker_V/FeatureServer",
"index": "Lokaal_ID",
},
"weirs": {
"url": "https://services8.arcgis.com/dmR647kStmcYa6EN/arcgis/rest/services/LWW_2023_Stuw_V/FeatureServer",
"index": "Lokaal_ID",
},
"profile_lines": {
"url": "https://services8.arcgis.com/dmR647kStmcYa6EN/ArcGIS/rest/services/LWW_2023_A_water_profiellijn_V/FeatureServer",
"index": "Dommel_ID",
},
"profile_points": {
"url": "https://services8.arcgis.com/dmR647kStmcYa6EN/ArcGIS/rest/services/LWW_2023_A_water_profielpunt_V/FeatureServer",
"index": "Dommel_ID",
},
}
config["De Stichtse Rijnlanden"] = {
"bgt_code": "W0636",
"watercourses": {
"url": "https://services1.arcgis.com/1lWKHMyUIR3eKHKD/ArcGIS/rest/services/Keur_2020/FeatureServer",
"layer": 39, # Leggervak
# "layer": 43, # Leggervak droge sloot
},
"level_areas": {
"url": "https://geoservices.hdsr.nl/arcgis/rest/services/Extern/PeilbesluitenExtern_damo24/FeatureServer",
"layer": 1,
"index": "WS_PGID",
"summer_stage": ["WS_ZP", "WS_BP", "WS_OP", "WS_VP"],
"winter_stage": ["WS_WP", "WS_OP", "WS_BP", "WS_VP"],
},
}
config["Delfland"] = {
"bgt_code": "W0372",
"watercourses": {
"url": "https://services.arcgis.com/f6rHQPZpXXOzhDXU/arcgis/rest/services/Leggerkaart_Delfland_definitief/FeatureServer",
"layer": 39, # primair
# "layer": 40, # secundair
},
"level_areas": {
"url": "https://services.arcgis.com/f6rHQPZpXXOzhDXU/arcgis/rest/services/Peilbesluiten2/FeatureServer",
"summer_stage": "WS_HOOGPEIL",
"winter_stage": "WS_LAAGPEIL",
},
"level_deviations": {
"url": "https://services.arcgis.com/f6rHQPZpXXOzhDXU/arcgis/rest/services/Peilbesluiten2/FeatureServer",
"layer": 2,
},
}
config["Drents Overijsselse Delta"] = {
"bgt_code": "W0664",
"watercourses": {
"url": "https://services6.arcgis.com/BZiPrSbS4NknjGsQ/arcgis/rest/services/Primaire_watergang_20_3_2018/FeatureServer",
"index": "OVKIDENT",
},
"level_areas": {
"url": "https://services6.arcgis.com/BZiPrSbS4NknjGsQ/arcgis/rest/services/Peilgebieden_opendata/FeatureServer",
"index": "GPGIDENT",
"summer_stage": "GPGZMRPL",
"winter_stage": "GPGWNTPL",
},
}
config["Fryslân"] = {
"bgt_code": "W0653",
"watercourses": {
"url": "https://gis.wetterskipfryslan.nl/arcgis/rest/services/BeheerregisterWaterlopen/MapServer",
"layer": 0, # # Wateren (primair, secundair)
"index": "OVKIDENT",
"bottom_height": "AVVBODH",
"water_depth": "AVVDIEPT",
# "url": "https://gis.wetterskipfryslan.nl/arcgis/rest/services/Legger_vastgesteld__2019/MapServer",
# "layer": 604, # Wateren legger
# "index": "BLAEU.LEG_VL_GW_OVK.OVKIDENT",
# "bottom_height": "BLAEU.LEG_VL_GW_OVK.AVVBODH",
},
"level_areas": {
# "url": "https://gis.wetterskipfryslan.nl/arcgis/rest/services/Peilbelsuit_Friese_boezem/MapServer",
# "index": "BLAEU_WFG_GPG_BEHEER_PBHIDENT",
"url": "https://gis.wetterskipfryslan.nl/arcgis/rest/services/Peilen/MapServer",
# "layer": 1, # PeilenPeilenbeheerkaart - Peilen
"layer": 4, # Peilgebied praktijk
"index": "PBHIDENT",
# "layer": 4, # Peilbesluitenkaart
# "index": "GPGIDENT",
"summer_stage": "HOOGPEIL",
"winter_stage": "LAAGPEIL",
},
}
config["Hollands Noorderkwartier"] = {
"bgt_code": "W0651",
"watercourses": {
"url": "https://kaarten.hhnk.nl/arcgis/rest/services/od_legger/od_legger_wateren_2025_oppervlaktewateren_vg/mapserver",
"bottom_height": "BODEMHOOGTE",
},
"level_areas": {
"url": "https://kaarten.hhnk.nl/arcgis/rest/services/ws/WS_Peilgebieden/MapServer/",
"layer": 3,
"summer_stage": [
"ZOMER",
"STREEFPEIL_ZOMER",
"BOVENGRENS_JAARROND",
"ONDERGRENS_JAARROND",
"VAST",
"STREEFPEIL_JAARROND",
],
"winter_stage": [
"WINTER",
"STREEFPEIL_WINTER",
"ONDERGRENS_JAARROND",
"BOVENGRENS_JAARROND",
"VAST",
"STREEFPEIL_JAARROND",
],
},
"level_deviations": {
"url": "https://kaarten.hhnk.nl/arcgis/rest/services/NHFLO/Peilafwijking_gebied/MapServer"
},
"weirs": {
"url": "https://kaarten.hhnk.nl/arcgis/rest/services/od_legger/od_legger_wateren_2025_kunstwerken_vg/MapServer",
"layer": 25,
},
# NOTE: this intermediate certificate is needed to access HHNK MapServer
# on 2025-06-16. This intermediate certificate is automatically downloaded
# and combined with the certifi bundle.
"verify": "https://sectigo.tbs-certificats.com/SectigoPublicServerAuthenticationCAOVR36.crt",
}
config["Hollandse Delta"] = {
"bgt_code": "W0655",
"watercourses": {
# "url": "https://geoportaal.wshd.nl/arcgis/rest/services/Geoportaal/Legger2014waterbeheersing_F_transparant/FeatureServer",
"url": "https://geoportaal.wshd.nl/arcgis/rest/services/Watersysteem/Watersysteem/MapServer",
"layer": 15, # Waterlopen
"bottom_height": [
["BODEMHOOGTE_BOVENSTROOMS", "BODEMHOOGTE_BENEDENSTROOMS"]
],
"bottom_width": "BODEMBREEDTE",
},
"level_areas": {
"url": "https://geoportaal.wshd.nl/arcgis/rest/services/Watersysteem/Peilgebieden/MapServer",
"layer": 31,
"f": "json",
"summer_stage": [
"REKENPEIL_ZOMER",
"BOVENGRENS_BEHEERMARGE_ZOMER",
"ONDERGRENS_BEHEERMARGE_ZOMER",
],
"winter_stage": [
"REKENPEIL_WINTER",
"BOVENGRENS_BEHEERMARGE_WINTER",
"ONDERGRENS_BEHEERMARGE_WINTER",
],
},
}
config["Hunze en Aa's"] = {
"bgt_code": "W0646",
"level_areas": {
"server_kind": "wfs",
"url": "https://opendata.hunzeenaas.nl/geoserver/ows?service=wfs",
"layer": "OpenData:Peilgebied",
"summer_stage": "gpgzmrpl",
"winter_stage": "gpgwntpl",
"index": "gpgident",
},
"watercourses": {
"server_kind": "wfs",
"url": "https://opendata.hunzeenaas.nl/geoserver/ows?service=wfs",
"layer": "OpenData:Hoofdwatergang",
"bottom_width": "avvboddr",
"bottom_height": [["avvhobos", "avvhobes"]],
"index": "ovkident",
},
}
config["Limburg"] = {
"bgt_code": "W0665",
"watercourses": {
# "url": "https://maps.waterschaplimburg.nl/arcgis/rest/services/Legger/Leggerwfs/MapServer",
# "layer": 1, # primair
# "layer": 2, # secundair
"url": "https://maps.waterschaplimburg.nl/arcgis/rest/services/Legger/Legger/MapServer",
"layer": 22, # primair
# "layer": 23, # secunair
# "layer": 24, # Waterplas
},
}
config["Noorderzijlvest"] = {
"bgt_code": "W0647",
"watercourses": {
# "url": "https://arcgis.noorderzijlvest.nl/server/rest/services/Waterkwantiteit/Watergang/MapServer",
# "layer": 0, # Primair
# "layer": 1, # Secundair
# "layer": 2, # Tertiair
"url": "https://services2.arcgis.com/ppcrd5oBNPEvV1T3/ArcGIS/rest/services/Normatieve_afmetingen/FeatureServer",
"layer": 1, # Normatieve afmetingen
"bottom_height": [["IWS_AVVHOBOS_L", "IWS_AVVHOBES_L"]],
"bottom_width": "AVVBODDR",
"index": "OVKIDENT",
},
"level_areas": {
"url": "https://arcgis.noorderzijlvest.nl/server/rest/services/Peilbeheer/Peilgebied/MapServer/",
"layer": 3,
"index": "WS_CODE",
"summer_stage": [
"WS_OPERATIONEELZOMERPEIL",
"WS_ZOMERSTREEFPEIL",
["WS_OPERABOVENGRENSZOMERPEIL", "WS_OPERAONDERGRENSZOMERPEIL"],
["WS_BOVENGRENSZOMERPEIL", "WS_ONDERGRENSZOMERPEIL"],
],
"winter_stage": [
"WS_OPERATIONEELWINTERPEIL",
"WS_WINTERSTREEFPEIL",
["WS_OPERABOVENGRENSWINTERPEIL", "WS_OPERAONDERGRENSWINTERPEIL"],
],
},
}
config["Rijn en IJssel"] = {
"bgt_code": "W0152",
"watercourses": {
"url": "https://opengeo.wrij.nl/arcgis/rest/services/VigerendeLegger/MapServer",
# "layer": 12,
# "index": "OWAIDENT",
# "layer": 11,
# "index": "OBJECTID",
"layer": 10,
"index": "OVKIDENT",
# "f": "json",
"bottom_height": [["IWS_AVVHOBOS_L", "IWS_AVVHOBES_L"]],
"bottom_width": "AVVBODDR",
},
"culverts": {
"url": "https://opengeo.wrij.nl/arcgis/rest/services/VigerendeLegger/MapServer",
"layer": 7,
"index": "KDUIDENT",
"bottom_height": [["KDUBOKBO_L", "KDUBOKBE_L"]],
"bottom_width": "KDUBREED_L",
},
"weirs": {
"url": "https://opengeo.wrij.nl/arcgis/rest/services/VigerendeLegger/MapServer",
"layer": 5,
"index": "KSTIDENT",
"summer_stage": "IWS_KSTZMRPL",
"winter_stage": "IWS_KSTWTPL",
},
}
config["Rijnland"] = {
"bgt_code": "W0616",
"watercourses": {
"url": "https://rijnland.enl-mcs.nl/arcgis/rest/services/Leggers/Legger_Oppervlaktewater_Vigerend/MapServer",
"layer": 1,
"water_depth": "WATERDIEPTE",
},
"level_areas": {
"url": "https://rijnland.enl-mcs.nl/arcgis/rest/services/Peilgebied_vigerend_besluit/MapServer",
"summer_stage": [
"ZOMERPEIL",
"VASTPEIL",
"FLEXZOMERPEILBOVENGRENS",
],
"winter_stage": [
"WINTERPEIL",
"VASTPEIL",
"FLEXWINTERPEILBOVENGRENS",
],
},
"level_deviations": {
"url": "https://rijnland.enl-mcs.nl/arcgis/rest/services/Peilafwijking_praktijk/MapServer"
},
}
config["Rivierenland"] = {
"bgt_code": "W0621",
"watercourses": {
"url": "https://portal.wsrl.nl/kaarten/rest/services/Watersysteem/Legger_en_Werkingsgebieden_Wateren_Vastgesteld/MapServer",
"layer": 14, # Waterloop
# "layer": 70, # Profiellijnen
},
"weirs": {
"url": "https://portal.wsrl.nl/kaarten/rest/services/Watersysteem/Legger_en_Werkingsgebieden_Wateren_Vastgesteld/MapServer",
"layer": 11, # Stuw
},
"culverts": {
"url": "https://portal.wsrl.nl/kaarten/rest/services/Watersysteem/Legger_en_Werkingsgebieden_Wateren_Vastgesteld/MapServer",
"layer": 7, # Duiker, sifon, hevel
},
"level_areas": {
# "url": "https://kaarten.wsrl.nl/arcgis/rest/services/Kaarten/Peilgebieden_praktijk/FeatureServer",
# "url": "https://kaarten.wsrl.nl/arcgis/rest/services/Kaarten/Peilgebieden_vigerend/FeatureServer",
"url": "https://portal.wsrl.nl/kaarten/rest/services/Waterkwantiteit/Peilgebieden_vigerend/MapServer",
"summer_stage": [
"ZOMERPEIL",
"MIN_PEIL",
"STREEFPEIL",
"VASTPEIL",
],
"winter_stage": [
"WINTERPEIL",
"MAX_PEIL",
"STREEFPEIL",
"VASTPEIL",
],
},
}
config["Scheldestromen"] = {
"bgt_code": "W0661",
"watercourses": {
"url": "http://geo.scheldestromen.nl/arcgis/rest/services/Extern/EXT_WB_Legger_Oppervlaktewaterlichamen_Vastgesteld/MapServer",
"layer": 6,
"index": "OAFIDENT",
"bottom_height": "OAFBODHG",
"bottom_width": "OAFBODBR",
},
"level_areas": {
"url": "https://geo.scheldestromen.nl/arcgis/rest/services/Extern/EXT_WB_Waterbeheer/FeatureServer",
"layer": 14, # Peilgebieden (praktijk)
"index": "GPGIDENT",
# "layer": 15, # Peilgebieden (juridisch)
# "index": "GJPIDENT",
# "f": "json", # geojson does not return GPGZP and GPGWP
"summer_stage": "GPGZP",
"winter_stage": "GPGWP",
"nan_values": [-99, 99],
},
}
config["Schieland en de Krimpenerwaard"] = {
"bgt_code": "W0656",
"watercourses": {
# "url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/ArcGIS/rest/services/Vastgestelde_legger_Watersystemen_2023/FeatureServer",
# "layer": 15, # Oppervlaktewaterlichaam (15)
"url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/ArcGIS/rest/services/Vigerende_Legger_Watersystemen/FeatureServer",
"layer": 7, # Oppervlaktewaterlichaam
"water_depth": "DIEPTE",
"bottom_width": "BODEMBREEDTE",
},
"weirs": {
"url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/ArcGIS/rest/services/Vigerende_Legger_Watersystemen/FeatureServer",
"layer": 2, # Stuw
},
"culverts": {
"url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/arcgis/rest/services/Beheerregister_kunstwerken/FeatureServer",
"layer": 10, # Duiker
},
"level_areas": {
# "url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/ArcGIS/rest/services/Peilbesluiten/FeatureServer",
"url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/ArcGIS/rest/services/VigerendePeilgebiedenEnPeilafwijkingen_HHSK/FeatureServer",
"summer_stage": ["BOVENPEIL", "VASTPEIL"],
"winter_stage": ["ONDERPEIL", "VASTPEIL"],
"nan_values": 9999,
},
"level_deviations": {
"url": "https://services.arcgis.com/OnnVX2wGkBfflKqu/ArcGIS/rest/services/VigerendePeilgebiedenEnPeilafwijkingen_HHSK/FeatureServer",
"layer": 1,
},
}
config["Vallei en Veluwe"] = {
"bgt_code": "W0662",
"watercourses": {
"url": "https://services1.arcgis.com/ug8NBKcLHVNmdmdt/ArcGIS/rest/services/Legger_Watersysteem/FeatureServer",
"layer": 16, # A-water
# "layer": 17, # B-water
# "layer": 18, # A-water
},
"level_areas": {
"url": "https://services1.arcgis.com/ug8NBKcLHVNmdmdt/arcgis/rest/services/Peilvakken/FeatureServer",
"summer_stage": "WS_MAX_PEIL",
"winter_stage": "WS_MIN_PEIL",
"nan_values": 999,
},
}
# "Vallei & Veluwe" is renamed to "Vallei en Veluwe". For backwards compatibility:
config["Vallei & Veluwe"] = config["Vallei en Veluwe"]
config["Vechtstromen"] = {
"bgt_code": "W0663",
"watercourses": {
"url": "https://services1.arcgis.com/3RkP6F5u2r7jKHC9/arcgis/rest/services/Legger_publiek_Vastgesteld_Openbaar/FeatureServer",
"layer": 11,
"index": "OVKIDENT",
"bottom_height": [["IWS_AVVHOBES_L", "IWS_AVVHOBOS_L"]],
"bottom_width": "AVVBODDR",
},
"level_areas": {
"url": "https://services1.arcgis.com/3RkP6F5u2r7jKHC9/arcgis/rest/services/WBP_Peilen/FeatureServer",
"layer": 0, # Peilgebieden voormalig Velt en Vecht
"index": "GPG_ID",
"summer_stage": "GPGZMRPL",
"winter_stage": "GPGWNTPL",
"nan_values": 0,
# "layer": 1, # Peilregister voormalig Regge en Dinkel
# "index": None,
},
"weirs": {
"url": "https://services1.arcgis.com/3RkP6F5u2r7jKHC9/arcgis/rest/services/Legger_publiek_Vastgesteld_Openbaar/FeatureServer",
"layer": 5,
"index": "KSTIDENT",
"summer_stage": "IWS_KSTZMRPL",
"winter_stage": "IWS_KSTWTPL",
},
"culverts": {
"url": "https://services1.arcgis.com/3RkP6F5u2r7jKHC9/arcgis/rest/services/Legger_publiek_Vastgesteld_Openbaar/FeatureServer",
"layer": 8,
"index": "KDUIDENT",
"bottom_height": [["KDUBHBO", "KDUBHBE"]],
"bottom_width": "KDUBREED_L",
},
}
config["Zuiderzeeland"] = {
"bgt_code": "W0650",
"watercourses": {
# "url": "https://services.arcgis.com/84oM5NriBghHdQ3Z/ArcGIS/rest/services/leggerkavelsloten/FeatureServer",
"url": "https://services.arcgis.com/84oM5NriBghHdQ3Z/arcgis/rest/services/legger_concept/FeatureServer",
"layer": 12, # Profiel (lijnen)
# "layer": 13, # Oppervlaktewater (vlakken)
"index": "IDENT",
},
"level_areas": {
"url": "https://services.arcgis.com/84oM5NriBghHdQ3Z/arcgis/rest/services/zzl_Peilgebieden/FeatureServer",
"index": "GPGIDENT",
"summer_stage": "GPGZMRPL",
"winter_stage": "GPGWNTPL",
"nan_values": -999,
},
}
return config
[docs]
@cache.cache_pickle
def get_data(wb, data_kind, extent=None, max_record_count=None, config=None, **kwargs):
"""Get the data for a Waterboard and a specific data_kind.
.. deprecated:: 0.10.0
`get_data` will be removed in nlmod 1.0.0, it is replaced by
`download_data` because of new naming convention
https://github.com/gwmod/nlmod/issues/47
Parameters
----------
ws : str
The name of the waterboard.
data_kind : str
The kind of data you like to download. Possible values are
'watercourses', 'level_areas' and 'level_deviations'
extent : tuple or list of length 4, optional
THe extent of the data you like to donload: (xmin, xmax, ymin, ymax).
Download everything when extent is None. The default is None.
max_record_count : int, optional
THe maximum number of records that are downloaded in each call to the
webservice. When max_record_count is None, the maximum is set equal to
the maximum of the server. The default is None.
config : dict, optional
A dictionary with properties of the data sources of the Waterboards.
When None, the configuration is retreived from the method
get_configuration(). The default is None.
**kwargs : dict
Optional arguments which are passed onto arcrest() or wfs().
Raises
------
DESCRIPTION.
Returns
-------
gdf : GeoDataFrame
A GeoDataFrame containing data from the waterboard (polygons for
level_areas/level_deviations and lines for watercourses).
"""
warnings.warn(
"'get_data' is deprecated and will eventually be removed, "
"please use 'nlmod.read.waterboard.download_data()' in the future.",
DeprecationWarning,
)
return download_data(wb, data_kind, extent, max_record_count, config, **kwargs)
[docs]
@cache.cache_pickle
def download_data(
wb, data_kind, extent=None, max_record_count=None, config=None, **kwargs
):
"""Get the data for a Waterboard and a specific data_kind.
Parameters
----------
ws : str
The name of the waterboard.
data_kind : str
The kind of data you like to download. Possible values are
'watercourses', 'level_areas' and 'level_deviations'
extent : tuple or list of length 4, optional
THe extent of the data you like to donload: (xmin, xmax, ymin, ymax).
Download everything when extent is None. The default is None.
max_record_count : int, optional
THe maximum number of records that are downloaded in each call to the
webservice. When max_record_count is None, the maximum is set equal to
the maximum of the server. The default is None.
config : dict, optional
A dictionary with properties of the data sources of the Waterboards.
When None, the configuration is retreived from the method
get_configuration(). The default is None.
**kwargs : dict
Optional arguments which are passed onto arcrest() or wfs().
Raises
------
DESCRIPTION.
Returns
-------
gdf : GeoDataFrame
A GeoDataFrame containing data from the waterboard (polygons for
level_areas/level_deviations and lines for watercourses).
"""
if config is None:
config = get_configuration()
# some default values
layer = 0
table = None
index = "CODE"
server_kind = "arcrest"
f = "geojson"
if wb not in config:
raise (ValueError(f"No configuration available for {wb}"))
if data_kind not in config[wb]:
raise (ValueError(f"{data_kind} not available for {wb}"))
conf = config[wb][data_kind]
url = conf["url"]
if "layer" in conf:
layer = conf["layer"]
if "table" in conf:
table = conf["table"]
if "index" in conf:
index = conf["index"]
if "server_kind" in conf:
server_kind = conf["server_kind"]
if "f" in conf:
f = conf["f"]
if "verify" in config[wb]:
kwargs["verify"] = webservices.get_temporary_certificate(config[wb]["verify"])
# % download and plot data
if server_kind == "arcrest":
gdf = webservices.arcrest(
url,
layer,
extent,
f=f,
max_record_count=max_record_count,
table=table,
**kwargs,
)
elif server_kind == "wfs":
gdf = webservices.wfs(
url, layer, extent, max_record_count=max_record_count, **kwargs
)
else:
raise (ValueError(f"Unknown server-kind: {server_kind}"))
if len(gdf) == 0:
return gdf
# set index
if index is not None:
if index not in gdf:
logger.warning(f"Cannot find {index} in {data_kind} of {wb}")
else:
gdf = gdf.set_index(index)
# set a value for summer_stage and winter_stage or bottom_height and water_depth
if data_kind in ["level_areas", "weirs"]:
set_columns = ["summer_stage", "winter_stage"]
elif data_kind in ["watercourses", "culverts"]:
set_columns = ["bottom_height", "water_depth"]
else:
set_columns = []
nan_values = None
if "nan_values" in conf:
nan_values = conf["nan_values"]
for set_column in set_columns:
from_columns = conf[set_column] if set_column in conf else []
gdf = _set_column_from_columns(
gdf, set_column, from_columns, nan_values=nan_values
)
return gdf
[docs]
def _set_column_from_columns(gdf, set_column, from_columns, nan_values=None):
"""Populate a target column from one or more source columns.
The function creates ``set_column`` and fills missing values by iterating over
``from_columns`` in order. Each source can be either a single column name or a
list of column names. For a list input, the row-wise mean of available values is
used. Existing values in ``set_column`` are preserved once filled.
Parameters
----------
gdf : pandas.DataFrame or geopandas.GeoDataFrame
Input table that contains the source columns.
set_column : str
Name of the column that will be created and filled.
from_columns : str or list, optional
Source definition used to populate ``set_column``. Supported entries are:
- ``str``: copy values from this column.
- ``list[str]``: use row-wise mean of these columns.
- ``list`` containing a mix of the above: processed in order until all
possible values are filled.
nan_values : float, int or list, optional
Value or values that should be interpreted as missing and replaced by
``np.nan`` in the resulting ``set_column``.
Returns
-------
pandas.DataFrame or geopandas.GeoDataFrame
``gdf`` with the newly created ``set_column``.
Raises
------
ValueError
If ``set_column`` already exists in ``gdf``.
"""
if set_column in gdf.columns:
raise (ValueError(f"Column {set_column} allready exists"))
gdf[set_column] = np.nan
if from_columns is None:
return gdf
if isinstance(from_columns, str):
from_columns = [from_columns]
for from_column in from_columns:
msg = "Cannot find column {} as source for {}"
if isinstance(from_column, list):
mask = [x not in gdf for x in from_column]
if np.any(mask):
for i in np.where(mask)[0]:
logger.warning(msg.format(from_column[i], set_column))
from_column = list(np.array(from_column)[~np.array(mask)])
if len(from_column) == 0:
continue
else:
if from_column not in gdf:
logger.warning(msg.format(from_column, set_column))
continue
mask = gdf[set_column].isna()
if not mask.any():
break
if isinstance(from_column, list):
mask = mask & ~gdf[from_column].isna().all(1)
if not mask.any():
continue
gdf.loc[mask, set_column] = gdf.loc[mask, from_column].mean(1)
else:
mask = mask & ~gdf[from_column].isna()
if not mask.any():
continue
gdf.loc[mask, set_column] = gdf.loc[mask, from_column]
if nan_values is not None:
if isinstance(nan_values, (float, int)):
nan_values = [nan_values]
gdf.loc[gdf[set_column].isin(nan_values), set_column] = np.nan
return gdf