...
Code Block |
---|
def authenticate(username, password):
"""
Authenticate user
Parameters:
----------
username: str
Name of the user
password: str
Password of the user
"""
# Firebase instellingen voor authenticatie
firebase_url = "https://identitytoolkit.googleapis.com/v1"
firebase_key = "AIzaSyCjGibOfg9LKxoFhK_903H6M4vrh3UkAbQ"
# Authentiseer gebruiker
response_authenticate = requests.post(f"{firebase_url}/accounts:signInWithPassword?key={firebase_key}", data={'email': username, 'password': password, 'returnSecureToken': 'true'})
# Controle reactie firebase
my_headers = {}
if response_authenticate.status_code == 200:
# Succesvol: sla header op
id_token = response_authenticate.json()['idToken']
my_headers = {'Authorization': f"Bearer {id_token}"}
# Niet succescol print foutmeldingen
elif response_authenticate.status_code == 400:
print(f"Bad request, controleer API verzoek!")
elif response_authenticate.status_code == 401:
print(f"Gebruikersnaam en/of wachtwoord zijn onjuist!")
elif response_authenticate.status_code == 405:
print(f"API is niet beschikbaar!")
elif response_authenticate.status_code == 500:
print(f"Er is een interne fout opgetreden!")
else:
print(f"Er is een ongedefinieerde fout opgetreden!")
return my_headers |
...
Status_code=400 → het API verzoek is onjuist, controleer de url en parameters
Status_code=401 → de gebruikersnaam en/of wachtwoord zijn onjuist
Status_code=405 → de API is niet beschikbaar
Status_code=500 → er is een fout opgetreden
De funtie retourneert tot slot de header in de variabele 'my_headers'.
Stap 3:
...
Functie om de status van de Rainguru API te controleren
Voordat de Rainguru API gebruikt wordt, is het verstandig is om eerst de status van de API te controleren. We hebben een aparte Python functie aangemaakt (def) om de status van de API op te vragen. Deze kan aangeroepen worden waarbij een gebruikersnaam en wachtwoord als parameters meegegeven moeten worden. Dit om dat is nodig, omdat de functie als eerste de authenticatie functie aanroept (zie Stap 2).
Code Block |
---|
task_name = "Voorbeeld_Wiki"
#https://validatie-api.hydamo.nl/tasks/Voorbeeld_Wiki
response_new_task= requests.post(f"{server}/tasks/{task_name}", headers=my_headers, verify=hydamo_cert)
if response_new_task.status_code == 201:
data = response_new_task.json()
print("id: " + str(data["id"]))
print("naam: " + str(data["name"]))
print("status: " + str(data["status"]))
print("aantal dataset bestanden: " + str(data["numberOfDatasets"]))
print("validatieregels aanwezig: " + str(data["validationRules"])) |
Het resultaat is:
id: 999 (dit id is een voorbeeld)
naam: Voorbeeld_Wiki
status: new
aantal dataset bestanden: 0
validatieregels aanwezig: False
Een dataset toevoegen aan de validatie-taak
Als er een validatie-taak beschikbaar is, kunnen 1 of meerdere dataset bestanden toegevoegd worden aan deze validatie-taak. Hiertoe moet eerst een verwijzing naar deze databestanden gemaakt worden. Een databestand kan 1 of meerdere objectlagen (stuwen, gemalen, hydro-objecten, etc.) bevatten. Het is mogelijk om meerdere databestanden met elk 1 objectlaag toe te voegen aan een validatie-taak. De dataset bestanden:
moeten voldoen aan het DAMO 2.2. datamodel. Zie voor meer informatie DAMO 2.2 Objectenboek.
de data is van het (open data) formaat Geopackage (extensie *.gpkg). Zie voor meer informatie Geopackage.
In dit voorbeeld worden meerdere databestanden (met duikersifonhevels, hydro-objecten en regelmiddelen) toegevoegd aan een bestaande validatie-taak. Hiertoe is eerst een array (tabel) datasets gedefinieerd met de namen van de dataset bestanden (geopackages). Deze dataset bestanden staan in een lokale folder op een computersysteem (file_path). Om de datasets te kunnen toevoegen aan een validatie-taak, is de taak-id van een bestaande validatie-taak nodig. Deze id kan uit de response van het API request, waamee een nieuwe taak is aangemaakt (zie voorgaande paragraaf), gehaald worden (attribuut: id). Vervolgens worden in een lus de verschillende databestanden 1 voor 1 toegevoegd aan de validatie-taak. Voor elke dataset wordt eerst een dictionary params aangemaakt. Hierin wordt de naam van het databestand opgeslagen (label ‘file’). Daarna wordt een dictionary files aangemaakt. Hierin wordt het databestand zelf opgeslagen (via een commando ‘open' en het attribuut 'rb’; de dataset wordt als een binair bestand opgeslagen). Met een POST request naar de validatie-API op het endpoint task/datasets wordt vervolgens het databestand toegevoegd aan een bestaande validatie-taak. In het request wordt de id van de validatie-taak meegegeven (in de URL) samen met de dictionaries files en params, de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert). Als de HTML statuscode van de response gelijk is aan 201 (het post request geeft aan dat de aanpassing succesvol is doorgevoerd), kunnen verschillende gegevens (data) van de validatie-taak uit de response uitgelezen worden, waaronder:
de unieke id van een validatie-taak
en het aantal dataset bestanden dat is toegevoegd aan een validatie-taak.
De lus eindigt na het wegschrijven van de resultaten (id en het aantal dataset bestanden toegevoegd aan uw taak) naar het scherm.
Code Block |
---|
file_path = r"...\ValidatietoolHyDAMO\Wiki\Datasetbestanden"
datasets = ["DuikerSifonHevel.gpkg", "HydroObject.gpkg", "Regelmiddel.gpkg"]
task_id = response_new_task.json()["id"]
for dataset in datasets:
params = {"file": dataset}
files = {"file": open(os.path.join(file_path,dataset), "rb")}
#https://validatie-api.hydamo.nl/task/[task_id]/datasets
response_upload_datasets = requests.post(f"{server}/task/{task_id}/datasets", files=files, params=params, headers=my_headers, verify=hydamo_cert)
if response_upload_datasets.status_code == 201:
data = response_upload_datasets.json()
print("id: " + str(data["id"]))
print("naam dataset: " + dataset)
print("aantal dataset bestanden: " + str(data["numberOfDatasets"])) |
Het resultaat is:
id: 999 (dit id is een voorbeeld)
naam dataset: DuikerSifonHevel.gpkg
aantal dataset bestanden: 1
id: 999 (dit id is een voorbeeld)
naam dataset: HydroObject.gpkg
aantal dataset bestanden: 2
id: 999 (dit id is een voorbeeld)
naam dataset: Regelmiddel.gpkg
aantal dataset bestanden: 3
Een bestand met validatieregels toevoegen aan de validatie-taak
Als er een validatie-taak beschikbaar is, kan er een bestand met validatieregels toegevoegd worden aan deze validatie-taak. Meer informatie over de inhoud van het bestand met validatieregels vindt u hier Basis validatieregels. Een basisset validatieregels kunt u op Github downloaden.
Het bestand met validatieregels staat in een lokale folder op een computersysteem (file_path). Om validatieregels te kunnen toevoegen aan een bestaande validatie-taak, is de taak-id nodig van de validatie-taak (zie voorgaande stappen). Vervolgens wordt een dictionary params aangemaakt waarin de naam van het bestand met validatieregels opgeslagen wordt (label ‘file’). Daarna wordt een dictionary files aangemaakt. Hierin wordt het bestand met validatieregels zelf opgeslagen (via een commando ‘open' en het attribuut 'rb’; het bestand met validatieregels wordt als een binair bestand opgeslagen). Met een POST request naar de API op het endpoint task/validationrules wordt het bestand met validatieregels toegevoegd aan de validatie-taak. Naast de id van de validatie-taak (in de URL) worden ook de dictionaries files en params, de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 201 (het post request geeft aan dat de aanpassing succesvol is doorgevoerd), kunnen verschillende gegevens (data) van de validatie-taak uit de response uitgelezen worden, waaronder:
de unieke id van uw validatie-taak
en of de validatie-taak validatieregels bevat.
Code Block |
---|
file_path = r"...ValidatietoolHyDAMO\Wiki\Validatieregels"
validationrules = "validationrules.json"
params = {"file": validationrules}
files = {"file": open(os.path.join(file_path,validationrules), "rb")}
#http://validatie-api.hydamo.nl/task/[task_id]/validationrules
response_upload_validationrules = requests.post(f"{server}/task/{task_id}/validationrules", files=files, params=params, headers=my_headers, verify=hydamo_cert)
if response_upload_validationrules.status_code == 201:
data = response_upload_validationrules.json()
print("id: " + str(data["id"]))
print("validatieregels aanwezig: " + str(data["validationRules"])) |
Het resultaat is:
id: 999 (dit id is een voorbeeld)
validatieregels aanwezig: True
Controleer de status van een validatie-taak
Voordat een validatie-taak gestart kan worden moet een validatie-taak minimaal 1 dataset bestand en een bestand met validatieregels bevatten. U kunt aan de hand van de status van een validatie-taak controleren of een validatie-taak gereed is voor validatie. De status is dan gelijk aan ready_to_validate.
De status van een validatie-taak kan op elk moment opgevraagd worden met een GET request naar de validatie-API op het endpoint task, waarbij de validatie-taak id (in de URL), de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven wordt. ls de HTML statuscode van de response gelijk is aan 200 (het post request geeft aan dat de informatie succesvol is opgehaald), kunnen verschillende gegevens (data) van de validatie-taak uit de response uitgelezen worden, waaronder de status van de validatie-taak.
Code Block |
---|
#http://validatie-api.hydamo.nl/task/[task_id]/
response_get_task = requests.get(f"{server}/task/{task_id}", headers=my_headers, verify=hydamo_cert)
if response_get_task.status_code == 200:
data = response_get_task.json()
print(str(data["status"])) |
Het resultaat is:
status: ready_to_validate
Start een validatie-taak
Als de status van een validatie-taak gelijk is aan ‘ready_to_validate' kan deze taak gestart worden. De validatie-API geeft dan 'opdracht’ aan de Validatiemodule om de validatie van de (aan de validatie-taak) toegevoegde databestanden met de (aan de validatie-taak) toegevoegde validatieregels uit te voeren.
Alleerst moet het resultaat van een validatie opdracht gedefinieerd. Met het resultaat wordt hier bedoeld in welke bestandstypen het resultaat door de Validatiemodule wordt weggeschreven. Er zijn drie mogelijkheden: een CSV bestand, een Geopackage bestand of een Geojson bestand. Elke willekeurige combinatie van deze bestandstype is toegestaan, dus alleen het CSV bestand of zowel een Geopackage als een Geojson bestand, etc. Hiertoe wordt een (string) variabele format gedefineerd met de gewenste uitvoerformaten (komma gescheiden bij meerdere bestandstypen). Vervolgens wordt een POST request gedaan naar de validatie-API op het endpoint execute, waarbij de validatie-taak id en de variabele ‘format' (beide in de URL), de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven wordt. ls de HTML statuscode van de response gelijk is aan 202 (het post request geeft aan dat de actie is geaccepteerd), dan wordt de validatie-taak gestart. Om dit te controleren kan de status van de validatie-taak gecontroleerd worden (zie voorgaande paragraaf). Allereerst zal deze gelijk zijn aan ‘pending’. De validatie-taak is toegevoegd aan de wachtrij. Zodra er rekencapaciteit beschikbaar is, wordt de taak gestart en wijzigt de status in ‘validating’. Door de status periodiek te controleren (bijvoorbeeld eens per minuut), kan bepaald worden of de validatie-taak klaar is. Een validatie-taak is klaar als de status is aangepast in ‘finished’ (de validatie-taak is succesvol tot een einde gekomen) pf 'error’ (de validatie-taak is met een fout gestopt).
Code Block |
---|
#http://validatie-api.hydamo.nl/task/[task_id]/execute/csv,geopackage,geojson
format = "csv,geopackage,geojson"
response_execute_task = requests.post(f"{server}/task/{task_id}/execute/{format}", headers=my_headers, verify=hydamo_cert)
if response_execute_task.status_code == 202:
print("Taak wordt gestart!")
#controleer de status van de validatie-taak (periodiek)
response_get_task = requests.get(f"{server}/task/{task_id}", headers=my_headers, verify=hydamo_cert)
if response_get_task.status_code == 200:
status = str(response_get_task.json()["status"])
while not status == "finished" or status == "error":
response_get_task = requests.get(f"{server}/task/{task_id}", headers=my_headers, verify=hydamo_cert)
if response_get_task.status_code == 200:
status = str(response_get_task.json()["status"])
print(f"status taak: {status}")
time.sleep(60) |
Het resultaat is:
Taak wordt gestart!
status taak: pending
status taak: validating
…
status taak: validating
status taak: finished
Let op: validatie-taken van grote datasets kunnen aanzienlijke tijd in beslag nemen. Wanneer de validatie tijd meer dan 30 minuten wordt, wordt geadviseerd om opnieuw te authentiseren op de validatie-API, om te voorkomen dat de token verloopt.
Download metadata van de validatie-taak
Als een validatie-taak is beeindigd (al dan niet succesvol), kan de metadata van de validatie-taak gedownload worden ter controle van het validatie resultaat. Allereerst wordt een lokale folder op een computersysteem gedefinieerd waar naartoe een bestand met metadata kan worden gedownload. Met een POST request naar de API op het endpoint task/result/metadata wordt een bestand met metadata van de validatie-taak opgevraagd. Naast de id van de validatie-taak (in de URL) worden ook de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 200 (het post request geeft een succesvol resultaat), kan het bestand met de metadata worden opgeslagen in de lokale folder. Hiertoe wordt het resultaat van het request eerst opgeslaten in de variabele ‘result_data'. Vervolgens wordt gecontroleerd of de map waar het bestand opgeslagen moet worden bestaat en zo niet, dan wordt deze aangemaakt. Tot slot wordt het resultaat van het request opgeslagen in het bestand 'taak-id_metadata.json’.
Code Block |
---|
result_folder = r"...\Resultaten"
#http://validatie-api.hydamo.nl/task/[task_id]/result/metadata
response_get_metadata = requests.get(server + '/task/' + str(task_id) + '/result/metadata', headers=my_headers, verify=hydamo_cert)
if response_get_metadata.status_code == 200:
result_data = bytes(response_get_metadata.content)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
open(os.path.join(result_folder,f"{task_id}_metadata.json"), 'wb').write(response_get_metadata.content) |
Het resultaat is een json bestand met de volgende inhoud (zie ook Resultaten):
{
"api_version": "1.0.0",
"user_name": "thonus",
"task_started": "2022-02-11 13:18:07",
"task_finished": "2022-02-11 13:26:14",
"success": true,
"module_version": "1.0.0",
"date_check": "2022-02-11T13:18:07.817032",
"duration": 487.0597188472748,
"status": "finished",
"dataset_layers": [
"duikersifonhevel",
"hydroobject",
"regelmiddel"
],
"result_layers": ["duikersifonhevel", "hydroobject", "regelmiddel"],
"missing_layers": ["admingrenswaterschap","afsluitmiddel","afvoergebiedaanvoergebied","aquaduct","beheergrenswaterschap","bodemval","brug",…,"sturing","stuw","vispassage","vispassagevlak","vuilvang","zandvang"
],
"error_layers": [],
"syntax_result": ["duikersifonhevel","hydroobject","regelmiddel"],
"validation_result": ["duikersifonhevel","regelmiddel","hydroobject"]
}
Download resultaten van de validatie-taak in CSV formaat
Als er geen fouten voorkomen in de metadata van een afgeronde validatie-taak kunnen de resultaten gedownload worden. In deze stap wordt het validatie-resultaat in een CSV bestand gedownload. N.B. dit is alleen mogelijk als bij het uitvoeren van de validatie-taak ook het format CSV is meegegeven! Een CSV bestand met validatie-resultaten kan gedownload worden door een GET request naar de API op het endpoint task/result te maken. Naast de id van de validatie-taak (in de URL) moet ook de naam van de objectlaag gevolgd door ‘.csv' meegegeven worden in de URL. Daarnaast zijn ook de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 200 (het post request geeft een succesvol resultaat), kan het CSV bestand met validatie-resultaten worden opgeslagen in de lokale folder. In dit voorbeeld hebben de resultaten van object 'duikersifonhevel’ beschouwd. N.B. voor elke objectlaag moeten een apart CSV bestand gedownload worden!
Code Block |
---|
#http://validatie-api.hydamo.nl/task/[task_id]/result/[objectlaag].csv response_get_results_csv = requests.get(server + '/task/' + str(task_id) + '/result/duikersifonhevel.csv', headers=my_headers, verify=hydamo_cert)def check_status_API(username, password): # Inloggen en authentiseren my_headers = authenticate(username, password) # Alleen doorgaan als my_headers beschikbaar is (authenticatie geslaagd) if not my_headers == {}: # Check status Rainguru API: https://api.rainguru.nl/ response_get_info = requests.get(f"{server}/", headers=my_headers, verify=rainguru_cert) #controleer reactie Rainguru API API_available = False if response_get_info.status_code == 200: # Succesvol: print json met status API print(response_get_info.json()) API_available = True # Niet succesvol, print foutmeldingen elif response_get_info.status_code == 400: print(f"Bad request, controleer API verzoek!") elif response_get_info.status_code == 401: print(f"Gebruikersnaam en/of wachtwoord zijn onjuist!") elif response_get_info.status_code == 405: print(f"API is niet beschikbaar!") elif response_get_info.status_code == 500: print(f"Er is een interne fout opgetreden!") else: print(f"Er is een ongedefinieerde fout opgetreden!") return API_available, my_headers |
Eerst wordt de header opgevraagd die nodig is om een API verzoek te kunnen doen. We maken hierbij gebruik van de authenticatie functie van Stap 2, waarbij de gebruikersnaam en het wachtwoord worden meegegeven. Als er header is verkregen (authenticatie is geslaagd) dan wordt er een API verzoek (GET) gedaan naar de Rainguru API: https://api.rainguru.nl/ waarbij de headers en het Rainguru certificaat wordt meegegeven.
Als de HTML statuscode van de response gelijk is aan 200 (het verzoek is succesvol afgehandeld), dan wordt het resultaat (een json met informatie over de API) naar het scherm geprint. Tevens wordt de variabele 'API_available' op True gezet, zodat deze in het vervolg van het notebook gebruikt kan worden.
Wanneer het verzoek niet sucesvol afgehandeld kan worden, schrijven we de foutmelding weg naar het scherm:
Status_code=400 → het API verzoek is onjuist, controleer de url en parameters
Status_code=401 → de gebruikersnaam en/of wachtwoord zijn onjuist
Status_code=405 → de API is niet beschikbaar
Status_code=500 → er is een fout opgetreden
De funtie retourneert tot slot de variabelen 'API_available' en 'my_headers'.
Stap 4: Vraag Rainguru data op, op basis van een locatie (latitude en longitude)
Gebruik deze stap om neerslag data op te vragen op een locatie, gedefinieerd door het invoeren van coordinaten (latitude en longitude).
Definieer eerst alle invoergegevens bestaande uit:
Gebruikersnaam en wachtwoord (zie ook Gebruikersaccount aanvragen).
De locatie, middels latitude en longtitude coordinaten
Een kwantiel (in deze versie altijd 50%-kwantiel; mogelijk wordt dit in de toekomst uitgebreid met meerdere kwantielen.
Het uitvoerformaat van het resultaat. Keuze uit json of CSV.
Code Block |
---|
# Vraag Rainguru data op, op basis van locatie (latitude, longitude)
# Inlog gegevens gebruiker
username = "gebruiker@rainguru.nl"
password = "*********"
# Locatie: kies een locatie op basis van een latutide en longitude
# Voorbeeld locatie HKV Delft
#latitude = 51.99772
#longitude = 4.381829
# Kwantiel: in deze versie van Rainguru kan alleen het 5-% kwantiel gebruikt worden. Mogelijk wordt dat in de toekomst uitgebreid.
quantile = "0.5"
# Uitvoer formaat: kies uit 'json' of 'csv'
format = "csv"
# Controleer of Rainguru API beschikbaar is
API_available, my_headers = check_status_API(username, password)
if API_available == True:
# Voeg parameters toe aan parameters object t.b.v. API verzoek
my_parameters = {
"latitude": f"{latitude}",
"longitude": f"{longitude}",
"quantile": f"{quantile}"
}
# Verzoek Rainguru API op basis van locatie (latutide, longitude): https://api.rainguru.nl/data.csv of https://api.rainguru.nl/data.json
response_get_data_by_location = requests.get(f"{server}/data.{format}", params=my_parameters, headers=my_headers, verify=rainguru_cert)
# Controleer reactie Rainguru API
if response_get_data_by_location.status_code == 200:
# Succesvol: druk resultaat API af
if format == "csv":
print(response_get_data_by_location.text)
# Resultaat opslaan in CSV bestand
result_data = bytes(response_get_data_by_location.content)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
open(os.path.join(result_folder,datetime.datetime.now().strftime("%Y%m%d%H%M%S") + "_Rainguru.csv"), 'wb').write(response_get_data_by_location.content)
elif format == "json":
print(response_get_data_by_location.json())
# Resultaat opslaan in JSON bestand
result_data = bytes(response_get_data_by_location.content)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
open(os.path.join(result_folder,datetime.datetime.now().strftime("%Y%m%d%H%M%S") + "_Rainguru.json"), 'wb').write(response_get_data_by_location.content)
else:
print(f"Er is een onverwachte fout opgetreden!")
# Niet succesvol print foutmeldingen
elif response_get_data_by_location.status_code == 400:
print(f"Bad request, controleer API verzoek!")
elif response_get_data_by_location.status_code == 401:
print(f"Gebruikersnaam en/of wachtwoord zijn onjuist!")
elif response_get_data_by_location.status_code == 405:
print(f"API is niet beschikbaar!")
elif response_get_data_by_location.status_code == 500:
print(f"Er is een interne fout opgetreden!")
else:
print(f"Er is een ongedefinieerde fout opgetreden!")
else:
# De API is niet beschikbaar; neem contact op met de helpdesk
print(f"Rainguru API is niet beschikbaar! Neem contact op met helpdesk-rainguru@hkv.nl") |
Vervolgens wordt gecontroleerd of de Rainguru API beschikbaar is door de functie uit stap 3, aan te roepen. Als de API beschikbaar is dan wordt een dictionary 'my_parameters' met alle invoergegevens gevuld. Daarna wordt het API verzoek gedaan, waarbij het data endpoint wordt gebruikt. Als de API niet beschikbaar is verschijnt er een melding met een verwijzing naar de helpdesk.
Als de HTML statuscode van de response gelijk is aan 200 (het verzoek is succesvol afgehandeld), dan wordt het resultaat (een json met de neerslag data voor de gekozen locatie of een csv bestand met die informatie) naar het scherm geprint. Tevens wordt er een bestand met de data opgeslagen in de uitvoermap zoals deze in stap 1 is gedefinieerd. De naam van het bestand met data start altijd met een datum/tijd (yyyymmdduummss).
Wanneer het verzoek niet sucesvol afgehandeld kan worden, schrijven we de foutmelding weg naar het scherm:
Status_code=400 → het API verzoek is onjuist, controleer de url en parameters
Status_code=401 → de gebruikersnaam en/of wachtwoord zijn onjuist
Status_code=405 → de API is niet beschikbaar
Status_code=500 → er is een fout opgetreden
Het (fictieve) resultaat (in csv) ziet er als volgt uit:
Code Block |
---|
date,quantile,value,units
2023-07-14T13:15:00,0.5,0.00,mm/hr
2023-07-14T13:20:00,0.5,0.00,mm/hr
2023-07-14T13:25:00,0.5,0.00,mm/hr
2023-07-14T13:30:00,0.5,0.00,mm/hr
2023-07-14T13:35:00,0.5,0.00,mm/hr
2023-07-14T13:40:00,0.5,0.00,mm/hr
2023-07-14T13:45:00,0.5,0.03,mm/hr
2023-07-14T13:50:00,0.5,0.42,mm/hr
2023-07-14T13:55:00,0.5,1.95,mm/hr
2023-07-14T14:00:00,0.5,2.36,mm/hr
2023-07-14T14:05:00,0.5,0.23,mm/hr
2023-07-14T14:10:00,0.5,0.00,mm/hr
2023-07-14T14:15:00,0.5,0.00,mm/hr
2023-07-14T14:20:00,0.5,0.00,mm/hr
2023-07-14T14:25:00,0.5,0.00,mm/hr
2023-07-14T14:30:00,0.5,0.00,mm/hr
2023-07-14T14:35:00,0.5,0.00,mm/hr
2023-07-14T14:40:00,0.5,0.00,mm/hr
2023-07-14T14:45:00,0.5,0.00,mm/hr |
Voor verschillende tijdstappen (tijdzone NL-Amsterdam) wordt de verwachtte neerslag gegeven in mm per uur op de gekozen locatie.
Stap 5: Vraag Rainguru data op, op basis van een adres (straatnaam + huisnummer, plaatsnaam en/of postcode)
Gebruik deze stap om neerslag data op te vragen op een locatie, gedefinieerd door het invoeren van adres.
Definieer eerst alle invoergegevens bestaande uit:
Gebruikersnaam en wachtwoord (zie ook Gebruikersaccount aanvragen).
De locatie, middels een adres bestaande uit een straatnaam, huisnummer en plaatsnaam en/of postcode.
Een kwantiel (in deze versie altijd 50%-kwantiel; mogelijk wordt dit in de toekomst uitgebreid met meerdere kwantielen.
Het uitvoerformaat van het resultaat. Keuze uit json of CSV.
Code Block |
---|
# Vraag Rainguru data op, op basis van adres (straatnaam + huisnummer, plaatsnaam en/of postcode) # Inlog gegevens gebruiker username = "gebruiker@rainguru.nl" password = "*********" # locatie: geef een adres op (straatnaam + huisnummer, plaatsnaam en/of postcode (bepalen met PDOK) # Voorbeeld locatie HKV Lelystad adres = "8232JN, Botter 11" # Kwantiel: in deze versie van Rainguru kan alleen het 5-% kwantiel gebruikt worden. Mogelijk wordt dat in de toekomst uitgebreid. quantile = "0.5" # Uitvoer formaat: kies uit 'json' of 'csv' format = "json" # Controleer of Rainguru API beschikbaar is API_available, my_headers = check_status_API(username, password) if API_available == True: # Voeg parameters toe aan parameters object t.b.v. API verzoek my_parameters = { "address": f"{adres}" , "quantile": f"{quantile}" } # Verzoek Rainguru API op basis van adres: https://api.rainguru.nl/data.csv of https://api.rainguru.nl/data.json response_get_data_by_address = requests.get(f"{server}/data.{format}", params=my_parameters, headers=my_headers, verify=rainguru_cert) if response_get_data_by_address.status_code == 200: # Succesvol: druk resultaat API af if format == "csv": print(response_get_data_by_address.text) result_data = bytes(response_get_data_by_address.content) if not os.path.exists(result_folder): os.makedirs(result_folder) open(os.path.join(result_folder,datetime.datetime.now().strftime("%Y%m%d%H%M%S") + "_Rainguru.csv"), 'wb').write(response_get_data_by_address.content) elif format == "json": print(response_get_data_by_address.json()) # Resultaat opslaan in JSON bestand result_data if = bytes(response_get_resultsdata_by_csv.status_code == 200:address.content) result_data = bytes(response_get_results_csv.content) if not os.path.exists(result_folder): os os.makedirs(result_folder) open(os.path.join(result_folder,"duikersifonhevel.csvdatetime.datetime.now().strftime("%Y%m%d%H%M%S") + "_Rainguru.json"), 'wb').write(response_get_data_resultsby_csvaddress.content) |
Het resultaat is een CSV bestand met resultaten van de validatie van de duikersifonhevels in de dataset (zie ook Resultaten).
Download resultaten van de validatie-taak in geopackage formaat
Op vergelijkbare manier als in de beschrijving voor het downloaden van een resultaat in CSV formaat, kunnen de resultaten ook in een geopackage gedownload worden, zodat deze te gebruiken zijn in een GIS programma. N.B. dit is alleen mogelijk als bij het uitvoeren van de validatie-taak ook het format geopackage is meegegeven! Een geopackage bestand met validatie-resultaten kan gedownload worden door een GET request naar de API op het endpoint task/result te maken. Naast de id van de validatie-taak (in de URL) moet ook het fomat ‘geopackage' meegegeven worden in de URL. Daarnaast zijn ook de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 200 (het post request geeft een succesvol resultaat), kan het geopackage bestand met validatie-resultaten worden opgeslagen in de lokale folder. In tegenstelling tot het downloaden CSV bestand met validatie-resultaten per objectlaag, kunnen in een geopackage meerdere objectenlagen opgeslagen worden. Er hoeft in dus maar 1 geopackage bestand gedownload te worden.
Code Block |
---|
#http://validatie-api.hydamo.nl/task/[task_id]/result/geopackage
response_get_results_geopackage = requests.get(server + '/task/' + str(task_id) + '/result/geopackage', headers=my_headers, verify=hydamo_cert)
if response_get_results_geopackage.status_code == 200:
result_data = bytes(response_get_results_geopackage.content)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
open(os.path.join(result_folder,"validationresults.gpkg"), 'wb').write(response_get_results_geopackage.content) |
Het resultaat is een geopackage bestand met resultaten van de validatie voor alle objectlagen in de dataset (zie ook Resultaten).
Download alle resultaat bestanden van de validatie-taak
Het is ook mogelijk om alle resultaat bestanden van een validatietaak tegelijk te downloaden in een zip-bestand. Dit zip-bestand bevat dan zowel het metadata JSON bestand als de alle uitvoerformaten die bij het starten van de taak zijn meegegeven (geopackage, CSV bestanden en/of GEOJSON bestanden). Een zip-bestand met alle resultaten kan gedownload worden door een GET request naar de API op het endpoint task/result te maken. Naast de id van de validatie-taak (in de URL) moet ook het fomat ‘zip' meegegeven worden in de URL. Daarnaast zijn ook de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 200 (het post request geeft een succesvol resultaat), kan het zip-bestand met validatie-resultaten worden opgeslagen in de lokale folder.
Code Block |
---|
#http://validatie-api.hydamo.nl/task/[task_id]/result/zip
response_get_all_results = requests.get(server + '/task/' + str(task_id) + '/result/zip', headers=my_headers, verify=hydamo_cert)
if response_get_all_results.status_code == 200:
result_data = bytes(response_get_all_results.content)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
open(os.path.join(result_folder,"validationresults.zip"), 'wb').write(response_get_all_results.content) |
Het resultaat is een zip-bestand met alle bestanden van de validatietaak.
Een validatie-taak annuleren
Het kan voorkomen dat een validatie-taak wordt gestart die veel doorlooptijd vraagt, maar waarvan op een gegeven moment wordt geconcludeerd dat er iets niet klopt. Een validatie-taak die gestart is kan door een gebruiker geannuleerd worden door een POST request naar de API op het endpoint task/kill te sturen. Naast de id van de validatie-taak (in de URL) worden ook de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 202 (het post request geeft aan dat de actie is geaccepteerd), wordt de taak geannuleerd.
Code Block |
---|
#http://validatie-api.hydamo.nl/task/[task_id]/kill
response_kill_task = requests.post(server + '/task/' + str(task_id) + '/kill', headers=my_headers, verify=hydamo_cert)
if response_kill_task.status_code == 202:
print('De taak is geannuleerd!') |
Het resultaat is dat de taak is geannuleerd. Dit kan eventueel met gecontroleerd worden door de status van de taak op te vragen.
Een validatie-taak verwijderen
...
else:
print(f"Er is een onverwachte fout opgetreden!")
# Niet succesvol print foutmeldingen
elif response_get_data_by_address.status_code == 400:
print(f"Bad request, controleer API verzoek!")
elif response_get_data_by_address.status_code == 401:
print(f"Gebruikersnaam en/of wachtwoord zijn onjuist!")
elif response_get_data_by_address.status_code == 405:
print(f"API is niet beschikbaar!")
elif response_get_data_by_address.status_code == 500:
print(f"Er is een interne fout opgetreden!")
else:
print(f"Er is een ongedefinieerde fout opgetreden!")
else:
# De API is niet beschikbaar; neem contact op met de helpdesk
print(f"Rainguru API is niet beschikbaar! Neem contact op met helpdesk-rainguru@hkv.nl") |
Vervolgens wordt gecontroleerd of de Rainguru API beschikbaar is door de functie uit stap 3, aan te roepen. Als de API beschikbaar is dan wordt een dictionary 'my_parameters' met alle invoergegevens gevuld. Daarna wordt het API verzoek gedaan, waarbij het data endpoint wordt gebruikt. Als de API niet beschikbaar is verschijnt er een melding met een verwijzing naar de helpdesk.
Als de HTML statuscode van de response gelijk is aan 200 (het verzoek is succesvol afgehandeld), dan wordt het resultaat (een json met de neerslag data voor de gekozen locatie of een csv bestand met die informatie) naar het scherm geprint. Tevens wordt er een bestand met de data opgeslagen in de uitvoermap zoals deze in stap 1 is gedefinieerd. De naam van het bestand met data start altijd met een datum/tijd (yyyymmdduummss).
Wanneer het verzoek niet sucesvol afgehandeld kan worden, schrijven we de foutmelding weg naar het scherm:
Status_code=400 → het API verzoek is onjuist, controleer de url en parameters
Status_code=401 → de gebruikersnaam en/of wachtwoord zijn onjuist
Status_code=405 → de API is niet beschikbaar
Status_code=500 → er is een fout opgetreden
Het (fictieve) resultaat (in csv) ziet er als volgt uit:
Code Block |
---|
{
'format': 'json',
'latitude': 52.50669969,
'longitude': 5.46887425,
'adres': 'Botter 11 8232JN Lelystad',
'quantile': [0.5],
'data': [{
'date': '2023-07-14T13:40:00',
'quantile': 0.5,
'value': 0.00039187,
'units': 'mm/hr'
}, {
'date': '2023-07-14T13:45:00',
'quantile': 0.5,
'value': 0.00036777,
'units': 'mm/hr'
}, {
'date': '2023-07-14T13:50:00',
'quantile': 0.5,
'value': 0.00036918,
'units': 'mm/hr'
}, {
'date': '2023-07-14T13:55:00',
'quantile': 0.5,
'value': 0.00037081,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:00:00',
'quantile': 0.5,
'value': 0.00036859,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:05:00',
'quantile': 0.5,
'value': 0.00036742,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:10:00',
'quantile': 0.5,
'value': 0.00036766,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:15:00',
'quantile': 0.5,
'value': 0.00036844,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:20:00',
'quantile': 0.5,
'value': 0.00036827,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:25:00',
'quantile': 0.5,
'value': 0.00036851,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:30:00',
'quantile': 0.5,
'value': 0.00036876,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:35:00',
'quantile': 0.5,
'value': 0.00036863,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:40:00',
'quantile': 0.5,
'value': 0.0003687,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:45:00',
'quantile': 0.5,
'value': 0.00036877,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:50:00',
'quantile': 0.5,
'value': 0.00036874,
'units': 'mm/hr'
}, {
'date': '2023-07-14T14:55:00',
'quantile': 0.5,
'value': 0.00036859,
'units': 'mm/hr'
}, {
'date': '2023-07-14T15:00:00',
'quantile': 0.5,
'value': 0.00036823,
'units': 'mm/hr'
}, {
'date': '2023-07-14T15:05:00',
'quantile': 0.5,
'value': 0.00036793,
'units': 'mm/hr'
}, {
'date': '2023-07-14T15:10:00',
'quantile': 0.5,
'value': 0.00036751,
'units': 'mm/hr'
}]
} |
Voor verschillende tijdstappen (tijdzone NL-Amsterdam) wordt de verwachtte neerslag gegeven in mm per uur op de gekozen locatie. N.B. gebruik https://jsonlint.com/ om de json in een leesbare presentatie te krijgen.
Stap 6: Download Rainguru raster-bestanden voor heel Nederland
Gebruik deze stap om neerslag data op te vragen voor heel Nederland in raster-bestanden.
Definieer eerst alle invoergegevens bestaande uit:
Gebruikersnaam en wachtwoord (zie ook Gebruikersaccount aanvragen).
Een kwantiel (in deze versie altijd 50%-kwantiel; mogelijk wordt dit in de toekomst uitgebreid met meerdere kwantielen.
Het uitvoerformaat van het resultaat. Altijd gelijk aan 'zip'. Het zip-bestand bevat alle rasterbestanden.
Code Block |
---|
# Download Rainguru raster-bestanden voor heel Nederland
# Inlog gegevens gebruiker
username = "gebruiker@rainguru.nl"
password = "*********"
# Kwantiel: in deze versie van Rainguru kan alleen het 5-% kwantiel gebruikt worden. Mogelijk wordt dat in de toekomst uitgebreid.
quantile = "0.5"
# Uitvoer formaat: kies altijd "zip" voor het downloaden van raster-bestanden
format = "zip"
# Controleer of Rainguru API beschikbaar is
API_available, my_headers = check_status_API(username, password)
if API_available == True:
# Voeg parameters toe aan API verzoek
my_parameters = {
"quantile": f"{quantile}"
}
# Verzoek Rainguru API op basis van adres
response_get_raster = requests.get(f"{server}/raster.{format}", params=my_parameters, headers=my_headers, verify=rainguru_cert)
if response_get_raster.status_code == 200:
# Succesvol: druk resultaat API af
if format == "zip":
print("Bestanden zijn succesvol gedownload; zie result_folder!")
result_data = bytes(response_get_raster.content)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
open(os.path.join(result_folder,datetime.datetime.now().strftime("%Y%m%d%H%M%S") + "_Rainguru.zip"), 'wb').write(response_get_raster.content)
else:
print(f"Er is een onverwachte fout opgetreden!")
# Niet succesvol print foutmeldingen
elif response_get_raster.status_code == 400:
print(f"Bad request, controleer API verzoek!")
elif response_get_raster.status_code == 401:
print(f"Gebruikersnaam en/of wachtwoord zijn onjuist!")
elif response_get_raster.status_code == 405:
print(f"API is niet beschikbaar!")
elif response_get_raster.status_code == 500:
print(f"Er is een interne fout opgetreden!")
else:
print(f"Er is een ongedefinieerde fout opgetreden!")
else:
# De API is niet beschikbaar; neem contact op met de helpdesk
print(f"Rainguru API is niet beschikbaar! Neem contact op met helpdesk-rainguru@hkv.nl") |
Vervolgens wordt gecontroleerd of de Rainguru API beschikbaar is door de functie uit stap 3, aan te roepen. Als de API beschikbaar is dan wordt een dictionary 'my_parameters' met alle invoergegevens gevuld. Daarna wordt het API verzoek gedaan, waarbij het raster endpoint wordt gebruikt. Als de API niet beschikbaar is verschijnt er een melding met een verwijzing naar de helpdesk.
Als de HTML statuscode van de response gelijk is aan 200 (het verzoek is succesvol afgehandeld), dan wordt het resultaat (een zip-bestand met rasterbestanden voor meerdere tijdstappen) opgeslagen in de uitvoermap zoals deze in stap 1 is gedefinieerd. De naam van het bestand met de ratserbestanden start altijd met een datum/tijd (yyyymmdduummss).
Wanneer het verzoek niet sucesvol afgehandeld kan worden, schrijven we de foutmelding weg naar het scherm:
Status_code=400 → het API verzoek is onjuist, controleer de url en parameters
Status_code=401 → de gebruikersnaam en/of wachtwoord zijn onjuist
Status_code=405 → de API is niet beschikbaar
Status_code=500 → er is een fout opgetreden
Het resultaat ziet er als volgt uit:
...
Stap 8: (optioneel)
Als een validatie-taak is beeindigd (al dan niet succesvol), kan de metadata van de validatie-taak gedownload worden ter controle van het validatie resultaat. Allereerst wordt een lokale folder op een computersysteem gedefinieerd waar naartoe een bestand met metadata kan worden gedownload. Met een POST request naar de API op het endpoint task/result/metadata wordt een bestand met metadata van de validatie-taak opgevraagd. Naast de id van de validatie-taak (in de URL) worden ook de Bearer token (opgeslagen in my_headers) en het (https) beveiligingscertificaat (verify=hydamo_cert) meegegeven in het request. Als de HTML statuscode van de response gelijk is aan 200 (het delete post request geeft een succesvol resultaat), is de taak verwijderd. Bij het verwijderen van de taak worden ook alle toegevoegde dataset bestanden en bestanden met validatieregels verwijderd. N.B. na 10 dagen worden validatie-taken die gevalideerd zijn door het systeem verwijderd.
...
kan het bestand met de metadata worden opgeslagen in de lokale folder. Hiertoe wordt het resultaat van het request eerst opgeslaten in de variabele ‘result_data'. Vervolgens wordt gecontroleerd of de map waar het bestand opgeslagen moet worden bestaat en zo niet, dan wordt deze aangemaakt. Tot slot wordt het resultaat van het request opgeslagen in het bestand 'taak-id_metadata.json’.
Code Block |
---|
result_folder = r"...\Resultaten" #http://validatie-api.hydamo.nl/task/[task_id]/result/metadata response_deleteget_taskmetadata = requests.deleteget(server + '/task/' + str(task_id) + '/result/metadata', headers=my_headers, verify=hydamo_cert) if response_get_metadata.status_code == 200: result_data = bytes(response_get_metadata.content) if not os.path.exists(result_folder): os.makedirs(result_folder) if response_delete_task.status_code == 200: print('Taak is verwijderd!'open(os.path.join(result_folder,f"{task_id}_metadata.json"), 'wb').write(response_get_metadata.content) |
Het resultaat is dat de validatie-taak uit de takenlijst is verwijderd.een json bestand met de volgende inhoud (zie ook Resultaten):
Bovenstaande voorbeelden zijn opgenomen in een Jupyter notebook. Dit notebook kunt u hier downloaden. Let op: u moet wel de paden en login gegevens zelf aanpassen, anders werkt het notebook niet.
...