BGT Data inlezen in Python met GeoPandas

Dit is mijn eerste vraag hier, wij zijn net bezig met ons verdiepen in dit onderwerp dus misschien is het een domme vraag.

Wij willen graag BGT data inlezen in Python om er MCDA op toe te passen. Wij dachten dit met GEOPandas te kunnen doen maar krijgen wat problemen. Sommige bestanden leest hij wel goed in, bjivorbeeld bgt_begroeidterreindeel.gml, maar met het inlezen van bgt_waterdeel.gml doormiddel van:

gdf = geopandas.read_file("./data/bgt_waterdeel.gml")

krijgen we de error UnsupportedGeometryTypeError: 10.
Of met

gdf = geopandas.read_file("./data/bgt_wijk.gml")

de error ValueError: Null layer: ''.

Hebben jullie een idee hoe we dit kunnen oplossen?
Als we dit op een hele andere manier moeten oplossen horen we het ook graag.

1 like

Ik heb geen ervaring met geopandas of BGT data inlezen, maar ik vond dit draadje op Reddit wat min of meer hetzelfde poogt te doen (zo op het eerste gezicht). Dus wellicht dat dat je verder helpt.

1 like

ja in mijn ervaring ging het altijd om een curved-polygon die de error gaf. In QGIS kun je die wel gewoon openen en dan apart opslaan in shape (of geopackage). Dan kun je verder met je MCDA.

Zeker geen domme vraag hoor. De BGT is best een uitdagende dataset om in te lezen. Daar is op dit forum wel het een en ander over te vinden. Maar goed je krijgt er ook heel wat voor terug.
Wat je het beste kunt doen is schemabeschrijvingen (gfs-bestanden) gebruiken. Volledige gfs-bestanden, voor alle bgt-objecttypes, zijn open bron beschikbaar als onderdeel van de zeer gewaardeerde BGT import plugin van Marco Duiker.

Ik heb zelf geen ervaring met geopandas, ik gebruik de python ogr library om bgt gml-bestanden om te zetten naar geopackage. ogr pakt automatisch de gfs bij de gml als deze dezelfde naam hebben, bijvoorbeeld ondersteunendwegdeel.gml + ondersteunendwegdeel.gfs. Je kan ook de gfs locatie direct aanduiden als dat nodig is. En met ogr kan je ook meteen een sql meegeven om bijvoorbeeld vervallen features uit je database te houden (,eindRegistratie is null’’).

Je zult trouwens zien dat er voor een aantal objecttypes meerdere gfs bestanden zijn. Dat komt omdat een object in de BGT meerdere geometrie types tegelijk kan hebben. Bij een pand hoort bijvoorbeeld een polygoon en een punt, respectievelijk het grondvlak en het plaatsingspunt van het huisnummer. Gebruik je bij het inlezen van bgt_pand.gml de schemabeschrijving bgt_pand_V.gfs, dan krijg je een laag met alleen maar grondvlakken ingelezen. Gebruik je bgt_pand_P.gfs dan krijg je alleen de plaatsingspunten. Ik weet niet wat MCDA is maar vermoedelijk willen jullie alleen polygonen, dan kan je dus in dit voorbeeld de bgt_pand_P weggooien en bgt_pand_V omnoemen naar bgt_pand.gfs.

Een aanrader is om de gfs bestanden eens te openen en voor je eigen toepassing aan te passen. Je kan eenvoudig attributen waar je niet in geïnteresseerd bent, bij het parsen laten overslaan. Dat is efficiënter dan het parsen, inladen en daarna weer verwijderen hiervan. Er staat nogal wat in de bgt, waaronder ettelijke gb’s aan gegevens waar wij simpele eindgebruikers niks mee te maken hebben :wink:

2 likes

MCDA staat voor Multi Criteria Decision Analyse. Een GIS analyse om op basis van verschillende ‘gewichten’ aan bepaalde criteria tot een ideale locatie te komen voor het een of ander.
Indertijd moest ik dat op basis van Raster-data doen. Mooi dat de BGT daar voor gebruikt wordt. Ben benieuwd naar de onderliggende vraag/opdracht maar dat is offtopic :slight_smile:

Dank voor de tip om de OGR library te gebruiken. Denk dat die library goed is om de data op te schonen (zoals endRegistratie is null) vóórdat het in de geopandas-dataframe wordt ingelezen.

Precies voor dit soort vragen is de QGIS BGT-import module modulair opgebouwd.

Het deel dat de feitelijke bewerking doet zodat de BGT correct kan worden ingelezen kan ook los van QGIS worden gebruikt.

Het betreft: QGIS_BGT_Import/utils.py at master · MarcoDuiker/QGIS_BGT_Import · GitHub

2 likes

Bedankt voor alle hulp! We hebben meerdere dingen geprobeerd en uiteindelijk is het gelukt. Het probleem zat hem inderdaad in dat er curved polygons in zaten. Uiteindelijk hebben we gebruik gemaakt van ogr2ogr -nlt CONVERT_TO_LINEAR om dit te fixen, en dan gebruiken we gdal_rasterize om er een MCDA op toe te passen en een grid te krijgen.

1 like

Let op: dat er zonder foutmeldingen is ingelezen wil niet zeggen dat het ook goed is gegaan. Het is heel gemakkelijk dataverlies te lijden. Lees hier waarom: De QGIS BGT plugin – Nederlandse QGIS gebruikerscommunity

1 like