Foutieve weergave in QGIS van geojson CBS data

Ik heb data in geojson formaat opgehaald middels de wfs call:
https://geodata.nationaalgeoregister.nl/cbspostcode4/wfs?request=GetFeature&service=WFS&version=2.0.0&typeName=cbspostcode4:postcode42018&outputFormat=application%2Fjson%3B%20subtype%3Dgeojson

Probeer ik de json te bekijken in QGIS, worden polygonen soms wel en soms niet getekend. En sommige polygonen zijn niet te selecteren.

Na wat verdere analyse zag ik dat dit komt doordat de geoJSON niet correct is mbt de geometrie. Zo wordt de geometry polygon genoemd, maar zou het een multipolygon moeten zijn (2 van elkaar gescheiden polygonen voor 1 postcode komen ook voor). Ook de rechterhand regel lijkt niet nageleeft te worden.

Wordt de geojson export nog aangepast op dit vlak? En wat kan ik doen om toch valide en werkende geometrie te krijgen in QGIS?

Al eens geprobeerd om ‘gewoon’ gml te gebruiken ipv geojson?

De download bekijk ik in Qgis als tussen resultaat, maar mijn doel is om uiteindelijk middels OGR2OGR er vervolg aan te geven. Helaas heb ik met GML geen succes in OGR2OGR (wordt niet herkent als GML). Vandaar de GeoJSON keuze.

Maar mocht je een oplossing weten waardoor GML wel correct wordt gezien in OGR2OGR, kan dat ook.

Als ik het volgende request doe:
https://geodata.nationaalgeoregister.nl/cbspostcode4/wfs?request=GetFeature&service=WFS&version=2.0.0&typeName=cbspostcode4:postcode42018&outputFormat=text/xml; subtype=gml/3.2.1&count=10

en het resultaat opsla als test.gml,

dan geeft ogrinfo -al -so test.gml:

Had to open data source read-only.
INFO: Open of `test.gml'
      using driver `GML' successful.

Layer name: postcode42018
Geometry: Unknown (any)
Feature Count: 10
Extent: (117618.000000, 481676.905000) - (125696.716000, 492852.591000)
Layer SRS WKT:
PROJCS["Amersfoort / RD New",
    GEOGCS["Amersfoort",
        DATUM["Amersfoort",
            SPHEROID["Bessel 1841",6377397.155,299.1528128,
                AUTHORITY["EPSG","7004"]],
            TOWGS84[565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725],
            AUTHORITY["EPSG","6289"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AXIS["Latitude",NORTH],
        AXIS["Longitude",EAST],
        AUTHORITY["EPSG","4289"]],
    PROJECTION["Oblique_Stereographic"],
    PARAMETER["latitude_of_origin",52.15616055555555],
    PARAMETER["central_meridian",5.38763888888889],
    PARAMETER["scale_factor",0.9999079],
    PARAMETER["false_easting",155000],
    PARAMETER["false_northing",463000],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["X",EAST],
    AXIS["Y",NORTH],
    AUTHORITY["EPSG","28992"]]
Geometry Column = geom
gml_id: String (0.0)
postcode: String (0.0)
aantal_inwoners: String (0.0)
aantal_mannen: String (0.0)
aantal_vrouwen: String (0.0)
aantal_inwoners_0_tot_15_jaar: String (0.0)
aantal_inwoners_15_tot_25_jaar: String (0.0)
aantal_inwoners_25_tot_45_jaar: String (0.0)
aantal_inwoners_45_tot_65_jaar: String (0.0)
aantal_inwoners_65_jaar_en_ouder: String (0.0)
aantal_part_huishoudens: String (0.0)
gemiddelde_huishoudensgrootte: String (0.0)
aantal_eenpersoonshuishoudens: String (0.0)
aantal_meerpersoonshuishoudens_zonder_kind: String (0.0)
aantal_eenouderhuishoudens: String (0.0)
aantal_tweeouderhuishoudens: String (0.0)
percentage_nederlandse_achtergrond: String (0.0)
percentage_westerse_migr_achtergr: String (0.0)
percentage_niet_westerse_migr_achtergr: String (0.0)
aantal_woningen: String (0.0)
aantal_woningen_bouwjaar_voor_1945: String (0.0)
aantal_woningen_bouwjaar_45_tot_65: String (0.0)
aantal_woningen_bouwjaar_65_tot_75: String (0.0)
aantal_woningen_bouwjaar_75_tot_85: String (0.0)
aantal_woningen_bouwjaar_85_tot_95: String (0.0)
aantal_woningen_bouwjaar_95_tot_05: String (0.0)
aantal_woningen_bouwjaar_05_tot_15: String (0.0)
aantal_woningen_bouwjaar_15_en_later: String (0.0)
aantal_meergezins_woningen: String (0.0)
omgevingsadressendichtheid: String (0.0)
stedelijkheid: String (0.0)

Da’s prima

ogrinfo -al test.gml geeft je vervolgens alle features.

Als ogrionfo werkt, dan doet ogr2ogr het ook.

@pvdh Ik heb geprobeerd het probleem te reproduceren, maar als ik de data ophaal dmv je WFS request dan toont QGIS bij mij wel all features uit dat request. Het is overigens wel zo dat je WFS request maar 1000 features teruggeeft. Dit ligt overigens niet aan het request, maar dit is een beperking op de WFS server om ervoor te zorgen dat 1 request niet te veel resources gebruikt. Om alle data op te halen via de WFS moet je met WFS paging aan de slag, of met ogr2ogr de WFS aanspreken.

Maarrr, eigenlijk is de WFS niet bedoeld als een full download service, eerder om subsets van de data op te halen (bijv. ruimtelijke subset, of op basis van een attribuut). Voor volledige downloads raden we aan om de ATOM download services van PDOK te gebruiken. Hier is de ATOM service van de postcode4 statistieken. Deze kan je overigens makkelijk vinden via de datasets pagina op de pdok.nl.

Wat heel tof is, is dat OGR/GDAL sinds een tijdje virtual drivers aanbiedt om over HTTP en in ZIP formaat direct te kunnen lezen. Voordeel hiervan is dat het een stuk sneller is ten opzichte van de WFS leeg trekken. Met ogr2ogr kan je dus een zip-shape van de ATOM service direct converteren in het door jouw gewenste formaat (zonder deze eerst te hoeven downloaden):

ogr2ogr -f GPKG postcode4.gpkg /vsizip/vsicurl/http://geodata.nationaalgeoregister.nl/cbspostcode4/extract/CBS_PC4_2018_v1.zip CBS_PC4_2018_v1 -nln postcode4_2018

Als we vervolgens de geometrieën uit de GeoPackage gaan valideren met ogr2ogr:

ogrinfo postcode4.gpkg -dialect SQLITE -sql "select postcode, IsValidReason(GeomFromGPB(geom)) from postcode4_2018 where ST_IsValid(GeomFromGPB(geom))=0" -so 2> /dev/null | grep "Feature Count" 
  Feature Count: 37

Dan zien we dat er 37! invalide geometrien in de shapefile zitten. De shapefile uit de ATOM services is ook de bron voor de WFS. Als PDOK kunnen we hier niet direct iets aan doen, het CBS is verantwoordelijk voor de inhoud van de data, maar wellicht dat @CBS hier iets over de validiteit van de shapefile kan zeggen?

De bevindingen van @marco_duiker kan ik overigens bevestigen, ogr2ogr kan de geometrieen uit de WFS zonder problemen lezen. OGR/GDAL is namelijk nogal vergevingsgezind op het gebied van geometrie validiteit. Zolang een geometrie niet al te kapot is probeert OGR/GDAL het beste er van te maken. Dat wil niet zeggen dat de features valide zijn volgens de OGC Simple Feature Spec! Als we alle features uit de WFS downloaden (wat dus niet mag) en vervolgens valideren met ogr2ogr krijgen we nagenoeg hetzelfde resultaat:

ogr2ogr -f GPKG postcode4.gpkg  "WFS:https://geodata.nationaalgeoregister.nl/cbspostcode4/wfs?service=WFS"  cbspostcode4:postcode42018  -nln postcode4_2018
ogrinfo postcode4.gpkg -dialect SQLITE -sql "select postcode, IsValidReason(GeomFromGPB(geom)) from postcode4_2018 where ST_IsValid(GeomFromGPB(geom))=0" -so 2> /dev/null | grep "Feature Count" 
  Feature Count: 38
2 likes

@pvdh QGIS toont inderdaad niet alle features op alle zoomniveaus van GeoJSON uit het WFS request. De features die niet getoond worden lijken echter niet perse te corresponderen met de features met invalide geometrieen… Ik vermoed dat dit probleem indd veroorzaakt wordt doordat geometrie type in de GeoJSON op POLYGON staat, terwijl er features in zitten met type MULTIGEOMETRY.

Beste mensen.
Controle van de PC4 contouren 2018 in ArcGIS mbv Repairgeometry geeft geen foutmeldingen. Verder komen er meerder dan 4 PC4 codes voor als multipolygon.

Hoi Niek, heb je die validatie met ArcGIS Repairgeometry uitgevoerd op het bestand wat via PDOK te downloaden is (om zeker te weten dat we het over precies hetzelfde bestand hebben)?

Anton,

dat is het bestand wat aan PDOK opgestuurd is.