WFS Kadastralekaart v4 - foutmelding GetFeatureReq

Vanuit een zoekformulier dat jaren goed werkte met versies < v4 voor de Kadastralekaart heb ik nu een probleem waar ik niet meteen uitkom. Het zoekformulier, waarin Kadastrale gemeente, sectie en perceelnummer ingevuld kan worden, evt met wildcards, genereert een Filter waarmee de WFS bevraagd wordt. De WFS URL is https://geodata.nationaalgeoregister.nl/kadastralekaart/wfs/v4_0. Bijvoorbeeld:

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" outputFormat="GML3"
                maxFeatures="1000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
    <wfs:Query typeName="feature:perceel" srsName="EPSG:28992"
               xmlns:feature="http://kadastralekaartv4.geonovum.nl">
        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:And>
                <ogc:PropertyIsEqualTo matchCase="true">
                    <ogc:PropertyName>kadastraleGemeenteCode</ogc:PropertyName>
                    <ogc:Literal>ABG00</ogc:Literal>
                </ogc:PropertyIsEqualTo>
                <ogc:PropertyIsEqualTo matchCase="true">
                    <ogc:PropertyName>sectie</ogc:PropertyName>
                    <ogc:Literal>F</ogc:Literal>
                </ogc:PropertyIsEqualTo>
                <ogc:PropertyIsLike matchCase="true" wildCard="*" singleChar="." escapeChar="!">
                    <ogc:PropertyName>perceelnummer</ogc:PropertyName>
                    <ogc:Literal>**2*</ogc:Literal>
                </ogc:PropertyIsLike>
            </ogc:And>
        </ogc:Filter>
    </wfs:Query>
</wfs:GetFeature>

Na ongeveer 30 seconden krijg ik volgende antwoord:

<?xml version='1.0' encoding="UTF-8" ?>
<wfs:FeatureCollection
   xmlns:kadastralekaartv4="http://kadastralekaartv4.geonovum.nl"
   xmlns:gml="http://www.opengis.net/gml"
   xmlns:wfs="http://www.opengis.net/wfs"
   xmlns:ogc="http://www.opengis.net/ogc"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://kadastralekaartv4.geonovum.nl https://geodata.nationaalgeoregister.nl/kadastralekaart/wfs/v4_0?SERVICE=WFS&amp;SERVICE=WFS&amp;VERSION=1.1.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=feature:perceel&amp;OUTPUTFORMAT=SFE_XMLSCHEMA  http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
   <gml:boundedBy>
      <gml:Null>missing</gml:Null>
   </gml:boundedBy>
</wfs:FeatureCollection>

In een REST client wat varianten geprobeerd, door Filter elementen weg te laten. In verleden was er bijv een probleem met matchCase en wildCards. Maar zelfs een heel kale Request body als:

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" outputFormat="GML3"
                maxFeatures="1000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
    <wfs:Query typeName="feature:perceel" srsName="EPSG:28992"
               xmlns:feature="http://kadastralekaartv4.geonovum.nl">
        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:And>
                <ogc:PropertyIsEqualTo>
                    <ogc:PropertyName>kadastraleGemeenteCode</ogc:PropertyName>
                    <ogc:Literal>ABG00</ogc:Literal>
                </ogc:PropertyIsEqualTo>
                <ogc:PropertyIsEqualTo>
                    <ogc:PropertyName>sectie</ogc:PropertyName>
                    <ogc:Literal>F</ogc:Literal>
                </ogc:PropertyIsEqualTo>
             </ogc:And>
        </ogc:Filter>
    </wfs:Query>
</wfs:GetFeature>

krijg ik zelfde response.

Alleen bij volledig weglaten Filter krijg ik een FeatureCollection terug:

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" outputFormat="GML3"
                maxFeatures="1000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
    <wfs:Query typeName="feature:perceel" srsName="EPSG:28992" 
                       xmlns:feature="http://kadastralekaartv4.geonovum.nl">
    </wfs:Query>
</wfs:GetFeature>

Die gml:Null lijkt wordt vaker gezien in MapServer, e.g. OpenLayers / Mapserver WFS Filter: <gml:null>missing</gml:null> - Geographic Information Systems Stack Exchange
maar heb niet zelfde probleem teruggevonden. Ik zie niets verkeerd in mijn Filter Encoding, maar kan iets over hoofd hebben gezien, of is er gewoon een timeout na 30 seconden?

Aanvulling: de response komt altijd na plm 30 seconden. Als ik vreemd genoeg een exacte request doe zoals:

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" outputFormat="GML3" maxFeatures="1000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
  <wfs:Query typeName="feature:perceel" srsName="EPSG:28992" xmlns:feature="http://kadastralekaartv4.geonovum.nl">
    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
        <ogc:And>
            <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>kadastraleGemeenteCode</ogc:PropertyName>
                <ogc:Literal>OTL02</ogc:Literal>
            </ogc:PropertyIsEqualTo>
            <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>sectie</ogc:PropertyName>
                <ogc:Literal>B</ogc:Literal>
            </ogc:PropertyIsEqualTo>
            <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>perceelnummer</ogc:PropertyName>
                <ogc:Literal>2436</ogc:Literal>
            </ogc:PropertyIsEqualTo>
        </ogc:And>
    </ogc:Filter>
  </wfs:Query>
</wfs:GetFeature>

komt de <gml:Null>missing</gml:Null> response direct terug.

Hoi @Just_OSGeo,

Volgens mij moet je “AKRKadastraleGemeenteCodeWaarde” gebruiken bij de kadastralekaartv4 i.p.v. kadastraleGemeenteCode. Dan krijg je wel ‘snel’ response.

Het attribuut kadastraleGemeenteCode bevat namelijk een numerieke waard en geen string (761 i.p.v. “OTL02”)

bij feature: perceel.4b7b82ff-0fae-468d-b47b-7e94d6266db7

...
<kadastralekaartv4:kadastraleGemeenteCode>761</kadastralekaartv4:kadastraleGemeenteCode>
...

Met je voorbeeld aangepast krijg je dan het volgende resultaat.

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" outputFormat="GML3" maxFeatures="1000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
  <wfs:Query typeName="feature:perceel" srsName="EPSG:28992" xmlns:feature="http://kadastralekaartv4.geonovum.nl">
    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
        <ogc:And>
            <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>AKRKadastraleGemeenteCodeWaarde</ogc:PropertyName>
                <ogc:Literal>OTL02</ogc:Literal>
            </ogc:PropertyIsEqualTo>
            <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>sectie</ogc:PropertyName>
                <ogc:Literal>B</ogc:Literal>
            </ogc:PropertyIsEqualTo>
            <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>perceelnummer</ogc:PropertyName>
                <ogc:Literal>2436</ogc:Literal>
            </ogc:PropertyIsEqualTo>
        </ogc:And>
    </ogc:Filter>
  </wfs:Query>
</wfs:GetFeature>
<?xml version='1.0' encoding="UTF-8" ?>
<wfs:FeatureCollection
   xmlns:kadastralekaartv4="http://kadastralekaartv4.geonovum.nl"
   xmlns:gml="http://www.opengis.net/gml"
   xmlns:wfs="http://www.opengis.net/wfs"
   xmlns:ogc="http://www.opengis.net/ogc"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://kadastralekaartv4.geonovum.nl https://geodata.nationaalgeoregister.nl/kadastralekaart/wfs/v4_0?SERVICE=WFS&amp;SERVICE=WFS&amp;VERSION=1.1.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=feature:perceel&amp;OUTPUTFORMAT=SFE_XMLSCHEMA  http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
    <gml:boundedBy>
        <gml:Envelope srsName="EPSG:28992">
            <gml:lowerCorner>181380.884000 457246.362000</gml:lowerCorner>
            <gml:upperCorner>181421.907000 457261.458000</gml:upperCorner>
        </gml:Envelope>
    </gml:boundedBy>
    <gml:featureMember>
        <kadastralekaartv4:perceel gml:id="perceel.4b7b82ff-0fae-468d-b47b-7e94d6266db7">
            <gml:boundedBy>
                <gml:Envelope srsName="EPSG:28992">
                    <gml:lowerCorner>181380.884000 457246.362000</gml:lowerCorner>
                    <gml:upperCorner>181421.907000 457261.458000</gml:upperCorner>
                </gml:Envelope>
            </gml:boundedBy>
            <kadastralekaartv4:begrenzingPerceel>
                <gml:Polygon srsName="EPSG:28992">
                    <gml:exterior>
                        <gml:LinearRing>
                            <gml:posList srsDimension="2">181393.562000 457258.389000 181380.884000 457246.362000 181384.680000 457246.681000 181389.127000 457247.156000 181392.948000 457247.520000 181404.442000 457248.416000 181417.440000 457249.111000 181420.467000 457248.734000 181420.471000 457248.768000 181421.907000 457261.458000 181393.562000 457258.389000 </gml:posList>
                        </gml:LinearRing>
                    </gml:exterior>
                </gml:Polygon>
            </kadastralekaartv4:begrenzingPerceel>
            <kadastralekaartv4:id>4b7b82ff-0fae-468d-b47b-7e94d6266db7</kadastralekaartv4:id>
            <kadastralekaartv4:identificatieNamespace>NL.IMKAD.KadastraalObject</kadastralekaartv4:identificatieNamespace>
            <kadastralekaartv4:identificatieLokaalID>84920243670000</kadastralekaartv4:identificatieLokaalID>
            <kadastralekaartv4:beginGeldigheid>2003-07-15T12:08:49.000</kadastralekaartv4:beginGeldigheid>
            <kadastralekaartv4:tijdstipRegistratie>2003-07-15T12:08:49.000</kadastralekaartv4:tijdstipRegistratie>
            <kadastralekaartv4:volgnummer>0</kadastralekaartv4:volgnummer>
            <kadastralekaartv4:statusHistorieCode>G</kadastralekaartv4:statusHistorieCode>
            <kadastralekaartv4:statusHistorieWaarde>Geldig</kadastralekaartv4:statusHistorieWaarde>
            <kadastralekaartv4:kadastraleGemeenteCode>761</kadastralekaartv4:kadastraleGemeenteCode>
            <kadastralekaartv4:kadastraleGemeenteWaarde>Otterlo</kadastralekaartv4:kadastraleGemeenteWaarde>
            <kadastralekaartv4:sectie>B</kadastralekaartv4:sectie>
            <kadastralekaartv4:AKRKadastraleGemeenteCodeCode>812</kadastralekaartv4:AKRKadastraleGemeenteCodeCode>
            <kadastralekaartv4:AKRKadastraleGemeenteCodeWaarde>OTL02</kadastralekaartv4:AKRKadastraleGemeenteCodeWaarde>
            <kadastralekaartv4:kadastraleGrootteWaarde>382</kadastralekaartv4:kadastraleGrootteWaarde>
            <kadastralekaartv4:soortGrootteCode>1</kadastralekaartv4:soortGrootteCode>
            <kadastralekaartv4:soortGrootteWaarde>Vastgesteld</kadastralekaartv4:soortGrootteWaarde>
            <kadastralekaartv4:perceelnummer>2436</kadastralekaartv4:perceelnummer>
            <kadastralekaartv4:perceelnummerRotatie>0</kadastralekaartv4:perceelnummerRotatie>
            <kadastralekaartv4:perceelnummerVerschuivingDeltaX>0</kadastralekaartv4:perceelnummerVerschuivingDeltaX>
            <kadastralekaartv4:perceelnummerVerschuivingDeltaY>0</kadastralekaartv4:perceelnummerVerschuivingDeltaY>
            <kadastralekaartv4:perceelnummerPlaatscoordinaatX>181413.797</kadastralekaartv4:perceelnummerPlaatscoordinaatX>
            <kadastralekaartv4:perceelnummerPlaatscoordinaatY>457257.24</kadastralekaartv4:perceelnummerPlaatscoordinaatY>
        </kadastralekaartv4:perceel>
    </gml:featureMember>
</wfs:FeatureCollection>

@wouter.visscher bedankt! Ja dat was het! Over het hoofd gezien, omdat die veldnaam kadastraleGemeenteCode nog bestond. Met AKRKadastraleGemeenteCodeWaarde werkt het zoekformulier weer.

Enige is dat de queries die voorheen redelijk snel gingen (< 30 sec) nu heel lang duren, meer dan minuut voor deze bijv

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" outputFormat="GML3" maxFeatures="1000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
    <wfs:Query typeName="feature:perceel" srsName="EPSG:28992" xmlns:feature="http://kadastralekaartv4.geonovum.nl">
        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:And>
                <ogc:PropertyIsEqualTo matchCase="true">
                    <ogc:PropertyName>AKRKadastraleGemeenteCodeWaarde</ogc:PropertyName>
                    <ogc:Literal>OTL02</ogc:Literal>
                </ogc:PropertyIsEqualTo>
                <ogc:PropertyIsEqualTo matchCase="true">
                    <ogc:PropertyName>sectie</ogc:PropertyName>
                    <ogc:Literal>F</ogc:Literal>
                </ogc:PropertyIsEqualTo>
                <ogc:PropertyIsLike matchCase="true" wildCard="*" singleChar="." escapeChar="!">
                    <ogc:PropertyName>perceelnummer</ogc:PropertyName>
                    <ogc:Literal>*817*</ogc:Literal>
                </ogc:PropertyIsLike>
            </ogc:And>
        </ogc:Filter>
    </wfs:Query>
</wfs:GetFeature>

Wildcard maakt niet eens uit. Met alleen AKRKadastraleGemeenteCodeWaarde en Sectie duurt dat ook ongeveer die tijd. Het antwoord, FeatureCollection komt er dan wel. Indexen?

@Just_OSGeo,

Is die PropertyIsLike uberhaupt nodig als je al weet dat 't perceelnummer 817 is? Dan zou een ‘standaard’ PropertyIsEqualTo afdoende moeten zijn, en dan ook weer snel (<100ms).

...
<ogc:PropertyIsEqualTo matchCase="true">
  <ogc:PropertyName>perceelnummer</ogc:PropertyName>
  <ogc:Literal>817</ogc:Literal>
</ogc:PropertyIsEqualTo>
...

Maar 't klopt met die wildcard’s (lijken) de index(en) die er zijn geskipt te worden. Maargoed daar komen we (weer) bij 't vraagstuk wat en welke combinaties moeten geindexeerd worden (we gaan niet ieder attribuut en iedere combinatie indexeren). Met 't bovenstaande voorbeeld lijkt me een andere manier van bevragen technisch misschien wel een wenselijker oplossing… (ervanuit gaande dat je wildcards niet “nodig” zijn bij dit specifieke vraagstuk).

Bedenk me nu trouwens dat het veld perceelnummer ook een integer is en geen string, zie: https://geodata.nationaalgeoregister.nl/kadastralekaart/wfs/v4_0?service=WFS&version=2.0.0&request=DescribeFeatureType&typename=perceel

  <complexType name="perceelType">
    <complexContent>
      <extension base="gml:AbstractFeatureType">
        <sequence>
          ...
          <element name="perceelnummer" minOccurs="0" type="integer"/>
          ...
        </sequence>
      </extension>
    </complexContent>
  </complexType>

Waardoor string operaties (zoals wildcards) niet zo snel zijn, gezien alles van integer naar string moet worden gecast.

Bedankt weer @wouter.visscher ! En ja die wildcard query hoeft natuurlijk niet als je perceelnummer weet. Het leuke is dat die requirement ooit van Kadaster kwam. Zit zo: in een ver verleden heb ik als pilot voor Kadaster ooit de “KadViewer” op “kademo” ontwikkeld om generieke viewer-bouwblokken te realiseren. Is bij Pilot gebleven omdat voor iets met Angular is gekozen, rest is historie ;-).

Draait o.a. op https://kadviewer.map5.nl (via verrekijker icoon) en veel meer apps. Niet uit te roeien die oude viewers! Maar ga aanpassen, want wie gaat er nu zoeken op alle percelen eindigend op bijv 2?

Wat wel handig zou zijn, zit ook in sommige BRK-producten van Kadaster is de zgn “KadKey”, Gemeente+Sectie+Nummer+Status met index, zat dacht ik ook in eerdere BRK-DKK versies. Dus in Postgres/SQL eenvoudig te genereren, altijd 17 chars door paddings, iets als:

cast(AKRKadastraleGemeenteCodeWaarde || sectie || lpad(cast(perceelnummer as character varying(5)), 5, '00000') || 'G0000' as character varying(256)) as kad_key,

(ipv G0000 kan statusHistorieCode en volgnummer genomen).

Maar wat mij betreft topic gesloten hoor!