Terreindata halen uit ingevoerde coordinaat (vraag van een beginner)

Beste,

Voor een project aan de universiteit moet ik bij een ingevoerde coördinaat het ondergrondtype, oftewel terreintype, kunnen achterhalen. Nu heb ik van een deel van de Top10NL kaart gedownload als GML bestand, en in QGIS gezet. Het lukt me om op een bepaald gebied te klikken, en dan in QGIS het terreintype af te lezen. Ik zou dit echter graag willen automatiseren, dat ik bijvoorbeeld in Python een coördinaat in kan voeren, en dat daar dan als output het terreintype komt.

Ik ben totaal niet bekend in de wereld van Gis en GML bestanden, dus het kan zijn dat het heel simpel is, maar als iemand me op weg zou kunnen helpen zou dat enorm fijn zijn!

Alvast heel erg bedankt!

De meeste GIS software kan met veel verschillende bestandsformaten omgaan, echter het ene bestandsformaat is beter geschikt voor een specifieke taak dan een andere. Zo is GML niet echt geschikt als formaat om (ruimtelijke) queries op te doen, aangezien de performance te wensen overlaat. Echter niet in alle gevallen hoeft performance een probleem te zijn. Mocht dit wel zo zijn dan kan je het GeoPackage bestandsformaat gebruiken. De GML kan eenvoudig omgezet worden met de ogr2ogr commandline tool (wordt mee geinstalleerd met QGIS):

ogr2ogr -f GPKG data/TOP10NL_45W.gpkg data/TOP10NL_45W.gml

Voor het automatiseren zou ik zelf geen Python gebruiken, aangezien je hetzelfde resultaat kan bereiken met een ogrinfo oneliner.

Met GeoPackage:

ogrinfo -q "data/TOP10NL_45W.gpkg" -sql "select typeLandgebruik from Terrein where Intersects(GeomFromGPB(geom), MakePoint(155357,405815))"

Met GML:

ogrinfo -dialect sqlite -q "data/TOP10NL_45W.gml"  -sql "SELECT typeLandgebruik FROM Terrein WHERE Intersects(GEOMETRY, MakePoint(155357,405815))"

Zie hier het verschil in performance tussen GML en GPKG:

# GeoPackage
ogrinfo -q "data/TOP10NL_45W.gpkg" -sql   0.09s user 0.00s system 99% cpu 0.087 total
# GML
ogrinfo -q -dialect sqlite "data/TOP10NL_45W.gml" -sql   9.37s user 0.10s system 99% cpu 9.472 tota

De oneliner kan je in een Bash functie wrappen, voor wat gebruiksgemak:

function locate_gpkg(){
    gpkg_path=$1
    layer=$2
    point_coord=$3
    attribute=$4
    ogrinfo -q "$gpkg_path" -sql "select ${attribute} from ${layer} where Intersects(GeomFromGPB(geom), MakePoint(${point_coord}))"
}
# aanroepen met:
locate_gpkg data/TOP10NL_45W.gpkg Terrein 155357,405815 typeLandgebruik 

Mocht je wel Python willen gebruiken, dan zou ik aanraden om naar de GeoPandas library te kijken. Hier is een handige tutorial die laat zien hoe hier mee te werken.

Je kan ook overwegen om de Top10NL REST API te gebruiken:

Je kan een request met een geometrie (bijv coordinaten van een punt) naar het /terreinen POST endpoint sturen en dan typeLandgebruik uit de response halen.

1 like

Mijn eerste reactie zou zijn: wat is de achterliggende vraag bij dit project? Is het interactief, of moet het als achtergrond info gebruikt worden, of iets anders? Is het voor landelijk gebruik, of alleen lokaal? Hoe kom je aan het coordinaat? Is dat een klik op een kaart van een gebruiker? Of komt dat uit een lijst of zo? Is het eenmalig, of moet het een applicatie voor een aantal jaar worden?

Dat maakt namelijk nogal verschil voor het antwoord, naar mijn mening.

Want dit suggereert dat het een onderdeel van iets groters moet worden, maar ook dan zijn er voordelen en nadelen aan alles downloaden en klaarzetten, of realtime een API bevragen. Maar dat is helemaal afhankelijk van de achterliggende vraag (Waarom? en dan een keer of vijf :wink: ).

1 like

Bedankt voor de suggestie! Dit zit er inderdaad uit als iets dat ik zou kunnen gebruiken. Nu eerst even kijken hoe dat dan precies in zijn werk gaat, ook met API’s heb ik niet veel (zeg maar gerust geen) ervaring

Ik heb nu een API key, maar ik loop vast met een request uitvoeren zoals je het beschreef. Waar kan ik dat precies doen, in QGIS, in Python? En wat moet ik intypen om de request uit te voeren?

Zoals gezegd ben ik hier vrij nieuw in, dus heel erg bedankt voor het op weg helpen :sweat_smile:

Een “HTTP request met Python” tutorial kan Google je wel bieden.

Goede tool om mee te beginnen is Postman (https://www.postman.com/). Daarin kan je vrij eenvoudig requests uitproberen zonder dat je direct iets hoeft te programmeren.

Een request dat zou moeten werken heeft de volgende onderdelen:

URL: https://brt.basisregistraties.overheid.nl/api/v2/terreinen
Type request: POST
Headers

  • Content-Type: application/json
  • X-Api-Key: <jouw API key>
  • Content-Crs: epsg:4258 of epsg:28992 (afhankelijk van de CRS van de geometrie in de body)

Body

{
    "geometrie": {
        "intersects": {
            "coordinates": [
                4.783242687351454,
                52.558440670545764
            ],
            "type": "Point"
        }
    }
}
2 likes

Dit werkt! Heel erg bedankt :slight_smile:

1 like

Merk wel op dat met Terreinen alleen niet heel NL word afgedekt. Het kan dus voorkomen dat je niks terug krijgt (als je op een weg, parkeerterein of water zit bijvoorbeeld).

Dit topic is 180 dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan.