Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Version History

« Previous Version 9 Next »

Met de Rainguru API (Application Programming Interface) kan nowcasting neerslag informatie opgevraagd worden. De API kan gebruikt worden in een willekeurige script-omgeving zoals Python, Visual Studio Code, Perl, etc. De Rainguru API is een RestFul API conform de open api specificatie (OAS3). Documentatie van de API kan hier ingezien worden.

Een API bestaat uit 1 of meerdere verschillende endpoints. Elke endpoint heeft een unieke url waarmee een API verzoek (request) uitgevoerd kan worden (zie ook deze documentatie). Deze requests kunnen bestaan uit het opvragen van data (GET request), het toevoegen van data (POST request) en het verwijderen van data (DELETE request). De Rainguru API is beperkt tot alleen het opvragen van data (GET requests).

In deze wiki pagina wordt het gebruik van de API toegelicht inclusief voorbeelden van het gebruik in een Python Notebook script. In de voorbeelden worden alle stappen van de API toegelicht. Enige basiskennis van het gebruik van Python is verondersteld bij het beschouwen van onderstaande voorbeelden.

Stap 1: Instellingen voor gebruik in notebook

In stap 1 van het notebook worden instellingen voor gebruik in het notebook vastgelegd. Allereerst worden de benodigde Python packages: 'requests', 'json', ‘os' en 'time’ gedefinieerd voor gebruik verderop in het notebook. N.B. zorg ervoor dat deze packages beschikbaar zijn in Python).

# Dit is een voorbeeld notebook voor het gebruik van de Rainguru API.
# Zie ook onze Wiki pagina (https://hkvconfluence.atlassian.net/wiki/spaces/Rainguru/overview?homepageId=2083520655) voor uitleg over Rainguru en nowcasting en het gebruik van de API (inclusief het voorbeeld uit dit notebook)

# Benodigde packages
import requests
import json
import os
import datetime

# Server (API)
server = "https://api.rainguru.nl"
# Rainguru HTTPS certificaat
rainguru_cert=r"Rainguru.pem"

# Folder om resultaatbestanden in op te slaan
result_folder = os.path.join(os.getcwd(), "Results")

Vervolgens wordt de URL van de server met de Rainguru API gedefinieerd. Omdat de API gebruikt maakt van een secure (https) verbinding moet bij elk verzoek ook een certificaat meegegeven worden. Download onderstaand pem bestand, plaats dit in dezelfde map als het notebook en voeg aan (ieder) API verzoek de extra parameter verify=rainguru_cert toe.

Download hier het pem bestand voor Rainguru:

Tot slot wordt er een folder gedefinieerd waarin de data die via de Rainguru API kan worden opgevraagd, opgeslagen wordt.

Stap 2: Functie om gebruiker te authentiseren

Om gebruik te kunnen maken van de Rainguru API is een gebruikersaccount nodig. Authenticatie in de API vindt plaats aan de hand van een gebruikersnaam en wachtwoord. Voor een beschrijving van het opvragen van een gebruikersnaam en wachtwoord wordt verwezen naar Gebruikersaccount aanvragen.

Voor de authenticatie van de Rainguru API is een aparte Python functie aangemaakt (def). Deze kan aangeroepen worden waarbij een gebruikersnaam en wachtwoord als parameters meegegeven moeten worden. De API maakt gebruik van OAuth Firebase Authentication. Dit betekent dat authenticatie plaatsvindt bij een server van Google, middels een standaard API van Google. Om bij Google kenbaar te maken dat authenticatie voor de Rainguru API wordt gevraagd, moet gebruik gemaakt worden van een specifieke (Firebase) key (AIzaSyCjGibOfg9LKxoFhK_903H6M4vrh3UkAbQ) die aan de Rainguru API is gekoppeld.

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 = "AIzaSyBhun_JSiE1_z48VXRFq0eKrErI4UT3ES0"
    
    # 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:
        message = json.loads(response_authenticate.text)["error"]["errors"][0]["message"]
        if message == "EMAIL_NOT_FOUND":
            print(f"Gebruikersnaam is onjuist!")        
        elif message == "INVALID_PASSWORD":
            print(f"Wachtwoord is onjuist!") 
        else:
            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

Daarna wordt een POST request naar de Google API gedefinieerd, waarbij de key en de dictionary met de login cedentials meegestuurd wordt. Als de HTML statuscode van de response gelijk is aan 200 (de Google API geeft succesvol een resultaat), dan bevat de response een zogenaamde id_token. Deze wordt tot slot omgezet in een Bearer token (een gecodeerde token) die daarna als header meegeven kan worden aan toekomstige verzoeken aan de Rainguru API.

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 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 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 is nodig, omdat de functie als eerste de authenticatie functie aanroept (zie Stap 2).

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.

# 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 50% 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:

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.

# 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 50% 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 = 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.json"), 'wb').write(response_get_data_by_address.content)
        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:

{
	'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.

# Download Rainguru raster-bestanden voor heel Nederland

# Inlog gegevens gebruiker
username = "gebruiker@rainguru.nl"
password = "*********"

# Kwantiel: in deze versie van Rainguru kan alleen het 50% 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:

En in GIS ziet dat er als volg uit:

Stap 8: (optioneel) Converteren van adres naar coordinaten met PDOK locatieserver

We hebben een stap 8 toegevoegd aan het notebook, waarmee een adres met behulp van de PDOK locatieserver omgezet kan worden naar coordinaten (zie voor een uitgebreide beschrijving https://www.pdok.nl/pdok-locatieserver ).

# Ter illustratie een voorbeeld van de geolocation functie van PDOK die gebruikt wordt om adres gegevens om te zetten coordinaten

# locatie: geef een adres op (straatnaam + huisnummer, plaatsnaam en/of postcode)
adres = "8232JN, Botter"

# PDOK url geolocation functie (zie ook https://www.pdok.nl/pdok-locatieserver)
PDOK_url = "https://api.pdok.nl/bzk/locatieserver/search/v3_1/free"

# Voeg parameters toe aan API verzoek
my_parameters = {
    "q": f"{adres}",
    "rows": 1,
    "fl": "centroide_rd,centroide_ll,straatnaam,woonplaatsnaam,postcode",
}

# Verzoek aan PDOK geolocation API
resonse_PDOK = requests.get(url=PDOK_url, params=my_parameters)

if resonse_PDOK.status_code == 200:    
    # Succesvol: druk resultaat API af
    print(resonse_PDOK.json())

# Niet succesvol print foutmeldingen
elif resonse_PDOK.status_code == 400:
    print(f"Bad request, controleer API verzoek!")
elif resonse_PDOK.status_code == 401:
    print(f"Gebruikersnaam en/of wachtwoord zijn onjuist!")
elif resonse_PDOK.status_code == 405:
    print(f"API is niet beschikbaar!")
elif resonse_PDOK.status_code == 500:
    print(f"Er is een interne fout opgetreden!")
else:
    print(f"Er is een ongedefinieerde fout opgetreden!")

Het resultaat is een json bestand de coordinaten van de locatie.

Notebook

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.

  • No labels