3D BAG wfs bevragen met polygoon als filter

Hallo,

Ik kan de 3D BAG WFS bevragen met een bbox en zo onnodig dataverkeer en drukte voorkomen. Maar kan ik in plaats van een bbox ook een polygoon opgeven? Of liever nog meerdere polygonen? Stel ik wil de panden hebben in twee buurten die elk aan de andere kant van een stad liggen. Dan is de bbox nog steeds groot (of ik moet de wfs twee keer bevragen).

QGIS heeft een WFS query builder die niet alleen helpt om op attributen te filteren, maar die ook ruimtelijke selecties aanbiedt, zie o.a. dit topic: forum.pdok.nl/t/inladen-selectie-van-panden-uit-bag/4524
voor het toepassen van een bbox.

Ik ben nu aan het proberen met een st_within statement de wfs te bevragen (geef de panden die binnen een bepaalde geometrie liggen), maar er komt geen reactie van de wfs server.

Kan ik de 3d bag wfs server bevragen met een selectie binnen een bepaalde geometrie, niet zijnde een bbox?

Is een WFS server sowieso wel te bevragen op deze manier? En zo nee, waarom geeft qgis die opties dan wel in de wfs query builder?? Hoewel dat dan natuurlijk een heel nieuw topic is.

Ik heb het aan de praat gekregen op basis van filtermogelijkheden die bij mapserver beschreven staan:
https://www.mapserver.org/ogc/filter_encoding.html

je moet een ogc filter gebruiken.

Voorbeeld als hieronder met intersects werkt bij mij:
api = “https://geodata.nationaalgeoregister.nl/bag/wfs/v1_1?request=GetFeature&service=WFS&version=2.0.0&typeName=bag:pand&SRSNAME=EPSG:28992&outputFormat=json
filter =<Filter><Intersects><PropertyName>Geometry</PropertyName><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>{coordinates}</gml:coordinates> </gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></Intersects></Filter>

In de {coordinates} plak je je polygon.
dan plak je de boel aan elkaar:
api&Filter=filter
dan wordt het zoiets als hieronder…
"https://geodata.nationaalgeoregister.nl/bag/wfs/v1_1?request=GetFeature&service=WFS&version=2.0.0&typeName=bag:pand&SRSNAME=EPSG:28992&outputFormat=json&Filter=Geometrygml:Polygongml:outerBoundaryIsgml:LinearRinggml:coordinates111947.001 399580.449,111940.032 399573.474,111959.584 399567.403,111966.611 399565.507,111978.229 399563.368,111983.2 399562.67,111986.589 399562.681,112025.555 399563.94,112051.398 399565.167,112069.922 399565.589,112103.472 399566.57,112171.514 399713.486,112162.993 399717.305,112153.097 399721.331,112121.022 399732.728,112108.418 399737.316,112086.95 399745.033,112067.624 399751.791,112065.46 399752.218,112063.004 399752.423,112061.425 399752.054,112059.829 399751.638,112057.339 399750.345,112055.743 399748.688,112054.19 399746.531,112041.656 399718.098,112035.349 399704.542,112027.017 399688.4,112020.803 399677.13,112013.892 399665.401,112005.813 399652.784,112000.805 399645.463,111990.042 399630.218,111981.81 399619.487,111976.636 399613.086,111960.123 399594.121,111947.001 399580.449</gml:coordinates> </gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>’

in de praktijk moet het wel uit url leesbare tekens bestaan, dus geen spaties.
Dan wordt het als volgt:

https://geodata.nationaalgeoregister.nl/bag/wfs/v1_1?request=GetFeature&amp;service=WFS&amp;version=2.0.0&amp;typeName=bag:pand&amp;SRSNAME=EPSG:28992&amp;outputFormat=json&amp;Filter=&lt;Filter&gt;&lt;Intersects&gt;&lt;PropertyName&gt;Geometry&lt;/PropertyName&gt;&lt;gml:Polygon&gt;&lt;gml:outerBoundaryIs&gt;&lt;gml:LinearRing&gt;&lt;gml:coordinates&gt;111947.001+399580.449,111940.032+399573.474,111959.584+399567.403,111966.611+399565.507,111978.229+399563.368,111983.2+399562.67,111986.589+399562.681,112025.555+399563.94,112051.398+399565.167,112069.922+399565.589,112103.472+399566.57,112171.514+399713.486,112162.993+399717.305,112153.097+399721.331,112121.022+399732.728,112108.418+399737.316,112086.95+399745.033,112067.624+399751.791,112065.46+399752.218,112063.004+399752.423,112061.425+399752.054,112059.829+399751.638,112057.339+399750.345,112055.743+399748.688,112054.19+399746.531,112041.656+399718.098,112035.349+399704.542,112027.017+399688.4,112020.803+399677.13,112013.892+399665.401,112005.813+399652.784,112000.805+399645.463,111990.042+399630.218,111981.81+399619.487,111976.636+399613.086,111960.123+399594.121,111947.001+399580.449&lt;/gml:coordinates&gt;+&lt;/gml:LinearRing&gt;&lt;/gml:outerBoundaryIs&gt;&lt;/gml:Polygon&gt;&lt;/Intersects&gt;&lt;/Filter&gt;

https://geodata.nationaalgeoregister.nl/bag/wfs/v1_1?request=GetFeature&service=WFS&version=2.0.0&typeName=bag:pand&SRSNAME=EPSG:28992&outputFormat=json&Filter=<Filter><Intersects><PropertyName>Geometry</PropertyName><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>111947.001+399580.449,111940.032+399573.474,111959.584+399567.403,111966.611+399565.507,111978.229+399563.368,111983.2+399562.67,111986.589+399562.681,112025.555+399563.94,112051.398+399565.167,112069.922+399565.589,112103.472+399566.57,112171.514+399713.486,112162.993+399717.305,112153.097+399721.331,112121.022+399732.728,112108.418+399737.316,112086.95+399745.033,112067.624+399751.791,112065.46+399752.218,112063.004+399752.423,112061.425+399752.054,112059.829+399751.638,112057.339+399750.345,112055.743+399748.688,112054.19+399746.531,112041.656+399718.098,112035.349+399704.542,112027.017+399688.4,112020.803+399677.13,112013.892+399665.401,112005.813+399652.784,112000.805+399645.463,111990.042+399630.218,111981.81+399619.487,111976.636+399613.086,111960.123+399594.121,111947.001+399580.449</gml:coordinates>+</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></Intersects></Filter>’

Multipolygonen werkt vermoed ik niet. Ook niet in Qgis denk ik.

Interessant.
Hoewel nog niet heel gebruiksvriendelijk werkt het dus wel. Het leek me al vreemd dat een bbox wel zou werken en een polygoon niet. Een bbox is immers eigenlijk gewoon een vierkante polygoon.

Werkt deze url ook in qgis? Ik heb ergens gelezen dat je bij het bevragen van de wfs de url moet beperken tot https://geodata.nationaalgeoregister.nl/bag/wfs/v1_1?
En alle parameters bijvoorbeeld via een query?

Ik zoek namelijk een eenvoudige QGIS toepassing waar ik een polygoon (ipv bbox) kan gebruiken als filter op een wfs verzoek.

Geen idee. Ik heb daar helaas niet voor doorgeleerd. Maar bbox filter werkt toch wel wat anders lijkt me. Bbox is niets anders dan minimum x coordinaat, minimum y, maximum x, maximum y. Dat je daarmee ook een polygoon kan maken is weer een ander verhaal. Daarmee kan je vrij simpel, bijvoorbeeld op het handje filteren. Met een polygoon is dat wat complexer.

Met dank aan Willem Hoffmans en Marco Duiker die mij stappen verder hielpen, is het gelukt om met de ingebouwde query builder in QGIS bij het aanroepen van de 3D BAG een polygoon te gebruiken als afbakening.

In mijn geval wilde ik alle panden in een buurt in het Utrechtse Overvecht.
In de query builder voer je dan het volgende in:
ST_within (lod12.geometrie, st_geometryfromtext(‘POLYGON((136574.801899998 458546.309100001,136592.880899998 458537.496999998,136748.176899998 458463.287999997,136848.132999999 458415.690000004,136959.876999997 458303.236,137026.9689 458236.485100001,137047.292899997 458217.46,137054.580999999 458173.896000004,137120.833900003 458109.483100001,137154.297899998 458035.044100004,136830.027900002 457921.255100001,136655.6569 457860.150100003,136636.887899999 457852.983099998,136630.360899999 457850.491099998,136499.636899999 457792.636100001,136474.574900003 457779.960099997,136347.6439 457707.240099999,136313.6739 457683.622099996,136207.619899998 457848.996099998,136199.6529 457861.767100002,136187.922000001 457880.570999997,136081.833999998 458050.627999997,136246.8959 458219.475099997,136381.461899997 458355.004099999,136341.720999999 458396.995999997,136520.881900003 458575.910100003,136532.961900001 458588.170100001,136574.801899998 458546.309100001))’))

Puntjes van aandacht:

  • dit werk met een polygoon, niet met een multipolygoon. Ik moest dus eerst de gekozen buurt omzetten naar polygoon en dan pas de WKT coördinaten kopiëren.
  • de parameter moet zijn st_geometryfromtext en niet st_geomfromtext (dat laatste is wel de gebruikelijke schrijfwijze in postgis)

Extra puntje van aandacht:

Als je bovenstaande query kopieert (wat ik had gedaan): check dan goed of de quootjes wel ‘dom’ genoeg zijn!
Ik heb me een uur in de rondte zitten zoeken waarom de query bij mij steeds foutmeldingen gaf (Expression must start with SELECT).
Hij had er ‘slimme’ quootjes van gemaakt. :scream:

1 like

Dag Jeroen,

En hoe zou je dit aan kunnen pakken voor het ophalen van hectometerpalen in een bepaald gebied?
https://geodata.nationaalgeoregister.nl/locatieserver/v3/free?fq=type:hectometerpaal

Waarschijnlijk op eenzelfde manier, alleen dan moet je WFS bevragen waar hectometerpaaltjes in staan:
https://geodata.nationaalgeoregister.nl/nwbwegen/wfs?request=GetCapabilities

Hallo Jeroen,

Ik ben opzoek naar dezelfde oplossing als jij, maar als ik hetzelfde wil uitvoeren krijg ik de foutmelding “Kolom ‘lod12.geometrie’ verwijst naar een niet bestaand veld”. Ik heb verschillende namen geprobeerd, maar geen enkele lijkt te werken. Ik heb de volgende WFS gebruikt: https://data.3dbag.nl/api/BAG3D/wfs

Enig idee wat er mis kan gaan?

EDIT: ik heb nu lod12.geom gebruikt, deze pakt ie wel, maar dan krijg ik deze error.

WFS foutrapportage (code=XML getFeature request SAX parsing error tekst=org.xml.sax.SAXException: Attempted to construct illegal filter - I dont understand the tag: fes:ValueReference. HINT: tags are case-sensitive!
Attempted to construct illegal filter - I dont understand the tag: fes:ValueReference. HINT: tags are case-sensitive!)