Geometrie van Bestuurlijke gebieden niet valide?

Bij het updaten van de WFS databron van Bestuurlijke grenzen naar Bestuurlijke gebieden kreeg ik bij het doen van een Geopandas clip de error “TopologyException: Input geom 1 is invalid: Hole lies outside shell at or near point …” waarbij geom 1 de GML is die de response is van de request “https://service.pdok.nl/kadaster/bestuurlijkegebieden/wfs/v1_0?service=WFS&version=2.0.0&request=GetFeature&typeName=bestuurlijkegebieden%3ALandgebied”.

Wanneer ik de response als GML file bewaar, laad in QGIS en dan de geometrie valideer (Check Validity, method QGIS) dan resulteert dat in 7 fouten:
“Polygon 2 lies inside polygon 0” t/m “Polygon 8 lies inside polygon 0”

Polygon 0 is het grote bestuurlijke gebied. Polygon 1 ligt daarbuiten. Dit betreft een klein stukje Baarle-Nassau net ten noordwesten van de Belgische plaats Ginhoven.

De polygons 2 t/m 8 zijn de “eilandjes” Baarle-Nassau (Nederland) binnen Baarle-Hertog (België).

Ter controle heb ik dezelfde validatie uitgevoerd op de ATOM download “https://service.pdok.nl/kadaster/bestuurlijkegebieden/atom/v1_0/downloads/bestuurlijkegebieden_gml.zip” met, niet geheel verrassend, dezelfde validatie fouten.

Wel verrassend was te ontdekken dat de QGIS validatie op de Bestuurlijke grenzen WFS precies dezelfde validatie fouten oplevert.

De optie “Ignore ring self intersections” is unchecked. Ik begrijp dat de validatie conform de OGC validatie regels is maar het lijkt me dat een eiland in een gat/hole toch wel toegestaan is?

Vreemd genoeg heeft GeoPandas met de Bestuurlijke grenzen WFS (“https://geodata.nationaalgeoregister.nl/bestuurlijkegrenzen/wfs?request=GetCapabilities&service=wfs”) geen probleem. Afgezien van de naamgeving van de lagen, gedragen die twee WFSsen zich dan toch anders?

1 like

Hoi @bleutzinn we zijn hier naar aan het kijken, maar kan je iets meer informatie geven hoe je dit in QGIS (versie/plugins/enz…) doet? Als ik in QGIS (3.18.2) de gedownloaden GML gooi en deze dan valideer krijg ik 0 errors… Dit is met de validator in QGIS Vector>Geometry Tools>Check Validity…

M.a.w. wij kunnen niet jouw fout meldingen reproduceren.

Ook ik gebruik versie 3.18.2 en de validatie is ook dezelfde: Vector>Geometry Tools>Check Validity met method is QGIS.

Op de ATOM GML van de Bestuurlijke gebieden (“https://service.pdok.nl/kadaster/bestuurlijkegebieden/atom/v1_0/downloads/bestuurlijkegebieden_gml.zip") geeft dat 7 fouten:

Voor de validatie gebruik ik dus geen specifieke plugin. Als ik verder nog iets kan verduidelijken doe ik dat uiteraard graag.

Het verschil is dat @bleutzinn volgens de QGIS-methode (METHOD=1) en @wouter.visscher volgens de GEOS-methode (METHOD=2) valideert.

1 like

Maar dan is de volgende vraag wat is het verschil tussen Methode 1 en 2 …
@bleutzinn we hebben het nu dus wel weten te reproduceren :smiley:

Maar fouten lijken zich niet te laten herleiden naar “locatie” (krijgen een default 0,0 xy mee) …

Nu zitten vanuit onze kant met de volgende 2 punten:

  1. Het praktische issue gebeurde in een clip stap in Geopandas

  2. En in hoeverre de validatie fout een fout is…

Gezien wat de meldingen terug geeft “correct” is. Deze polygonen “liggen” ook daadwerkelijk binnen de grote NL polygon, dat is een eigenschap van de landsgrens multipolygon.

image

gezien de error message het over deze 7 polygonen heeft

Tot zo ver ik het kan beoordelen zijn dit geen “fouten” in de geometry.

Misschien dat @raymondnijssen iets kan vertellen/toelichten wat het verschil is tussen deze 2 methode, en waarom QGIS met de Methode 1 dit als fout beschouwd, of is het misschien meer een “warning”

Ik denk een bug in QGIS.

Je kunt het hier melden:

En het verschil is dat QGIS zelf een functie heeft om de geldigheid van geometrie te checken en GEOS (een andere library) ook. Je kunt ze beide gebruiken in QGIS en dus kiezen.

@raymondnijssen & @wouter.visscher, dat Wouter in eerste instantie de methode GEOS gebruikte was me niet opgevallen. Sorry. De GEOS validatie geeft bij mij ook geen fouten. Dus het lijkt inderdaad wel een QGIS bug. Ik zal die melden.

Resteert de vraag waarom de GML via de WFS van Bestuurlijke grenzen wel goed werkt in de Geopandas clip functie en de GML van de Bestuurlijke gebieden de foutmelding TopologyException: Input geom 1 is invalid: Hole lies outside shell at or near point …” geeft. Ik denk dat ik beide GML’s ga proberen te vergelijken. Ergens moet er een verschil zijn.

Zodra ik iets te weten ben gekomen meld ik dat hier wel weer. In ieder geval bedankt voor jullie antwoorden.

1 like

Post ook je plaatjes bij je issue @bleutzinn

Ik kon het niet laten om even op zoek te gaan. Hier ergens moet een extra check bij: QGIS/qgsgeometryvalidator.cpp at 5ae38eceaaa190980e1965db0da9f67d562e6383 · qgis/QGIS · GitHub

Geopandas is gebaseerd op shapely, wat weer gebaseerd is op GEOS. Kun je in geopandas ook een check doen? Je zou ook een 0-buffer kunnen draaien op de dataset en daarmee proberen. Alle polygonen worden dan opnieuw opgebouwd.

't kan zijn dat het verschil zit in de richting van de polygonen. De ene standaard hecht meer waarde aan dat de draairichting van een ‘hole’ en een ‘polygon’ tegengesteld zijn, en dat een polygon in een hole dus weer de andere kant op moet draaien. Vermoedelijk checkt de ene methode dit wel, en de andere niet, of is het linksom-rechtsom net anders.

Die suggestie om in Geopandas een 0-buffer te doen was wel een goeie.

Voor de geïnteresseerden, dit is mijn code die het zonder de buffer dus niet doet:

wfs = WebFeatureService(url=wfs_url)
layer = 'bestuurlijkegebieden:Landgebied'
params = dict(service='WFS', version="2.0.0", request='GetFeature', typeName=layer, outputFormat='json')
qry = Request('GET', wfs_url, params=params).prepare().url
gebieden_polygons = gpd.read_file(qry)['geometry']
gebieden_polygons.crs = "EPSG:28992"
gebieden_polygons = gebieden_polygons.buffer(0)
nlgrid = gpd.clip(grid, gebieden_polygons).dissolve(index_column_name)

Dus het opnieuw opbouwen van de polygons van de layer ‘bestuurlijkegebieden:Landgebied’ blijkt noodzakelijk en is voor mij de oplossing. Blijft dat het wel vreemd is en ook waarom die buffer niet nodig is met de oude dataset (layer = ‘bestuurlijkegrenzen:landsgrens’).

Dank voor de gouden tip @raymondnijssen !

1 like

Je stelde je vraag over GML files maar in je script download je als JSON. Misschien zit daar een verschil?

1 like

Scherp!

En ja, blijkbaar zit daar verschil in. Wanneer ik de WFS GML terug laat geven dan gaat het goed ook zonder de 0-buffer.

4 likes