GML met custom schema laden in OpenLayers 6

Hallo,

Ik probeer de volgende GML te laten zien in een OpenLayers kaart:

<?xml version="1.0" encoding="UTF-8"?>
<FeatureCollectionGeometrie xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:gsr="http://www.isotc211.org/2005/gsr"
xmlns:gco="http://www.isotc211.org/2005/gco"
xmlns:gmd="http://www.isotc211.org/2005/gmd"
xmlns:gss="http://www.isotc211.org/2005/gss"
xmlns:gts="http://www.isotc211.org/2005/gts"
xmlns:gmlsf="http://www.opengis.net/gmlsf"
xmlns="http://www.geostandaarden.nl/basisgeometrie/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.geostandaarden.nl/basisgeometrie/1.0 https://register.geostandaarden.nl/gmlapplicatieschema/basisgeometrie/1.0.0/basisgeometrie.xsd">
  <featureMember>
    <Geometrie>
      <id>1e7bee90-f2ae-4d8a-af03-3862db6edc84</id>
      <geometrie>
        <gml:Polygon gml:id="id-1e7bee90-f2ae-4d8a-af03-3862db6edc84-2"
                   srsName="urn:ogc:def:crs:EPSG::28992">
          <gml:exterior>
            <gml:LinearRing>
              <gml:posList>141000.000 629000.000 100000.000 600000.000 80000.000 500000.000 646.360 392000.000 646.360 336000.000 101000.000 336000.000 161000.000 289000.000 219000.000 289000.000 300000.000 451000.000 300000.000 614000.000 259000.000 629000.000 141000.000 629000.000</gml:posList>
            </gml:LinearRing>
          </gml:exterior>
        </gml:Polygon>
      </geometrie>
    </Geometrie>
  </featureMember>
</FeatureCollectionGeometrie>

De GML heeft een custom schema en OpenLayers zou dit bij mijn weten moeten kunnen tonen. Ik krijg het alleen niet voor elkaar.

Ik heb hier een voorbeeldje gemaakt met een vergelijking tussen een normale en standaard GML: Edit fiddle - JSFiddle - Code Playground. In de console zie je dat bij de standaard GML de features worden geladen maar bij de custom GML niet.

Waarschijnlijk zie ik iets over het hoofd of probeer ik iets wat niet kan maar als iemand me de juiste richting op kan wijzen dan heel graag.

Het lezen van een custom GML schema is erg complex aangezien je daarvoor het XML schema (XSD) moet ophalen en parsen.

Zonder het schema weet OpenLayers niet wat een FeatureCollectionGeometrie is en hoe daar features van te breien zijn. Zelfs als je het schema bekijkt kan je dit niet zien als een uitbreiding van een FeatureCollection (wat OpenLayers wel snapt), want het is daar geen uitbreiding van: het is een uitbreiding van gml:AbstractFeatureType en niet van gml: AbstractFeatureCollectionType (misschien is daar een reden voor…?).

In de GML parser broncode van OpenLayers kan je zien dat de namen van XML elementen ‘hardcoded’ zijn, dus ze moeten echt FeatureCollection, featureMember en dergelijke heten.

1 like

@matthijs.teerlink misschien kan je ook iets meer delen qua context.
M.a.w. waarom zou je dit willen doen, c.q. welk probleem wil je hiermee oplossen?

@wouter.visscher ik krijg de custom GML aangeleverd en moet die op een kaart tonen. Ik ben eigenlijk aan het zoeken hoe dat het beste kan. Ik zie in OpenLayers dat er een schemaLocation ingesteld kan worden in de GML reader (OpenLayers v7.3.0 API - Class: GML32) en daar heb ik een link naar het XSD schema gezet (https://register.geostandaarden.nl/gmlapplicatieschema/basisgeometrie/1.0.0/basisgeometrie.xsd) maar tot zover heeft dat nog geen resultaat opgeleverd.

@matthijsln bedankt voor je uitleg. Is het voldoende om het schema mee te geven zoals ik hierboven heb beschreven?

Moet je die GML direct van een webservice/api inladen of heb je nog een mogelijkheid om deze te ‘bewerken’ naar een format dat iets vriendelijker is om in de browser te landen? (‘default’ GML of GeoJSON?)

M.a.w. kan je het jezelf makkelijker maken door de juiste problemen op de juiste plek/locatie op te lossen?

Ik kan de GML makkelijk bewerken. Dat was ook mijn plan B maar aangezien OpenLayers een schemaLocation optie heeft ging ik ervanuit dat dat ook zou moeten werken maar wellicht was dat iets te simpel gedacht.

1 like

Als je bereid bent te bewerken dan kun je ook het volgende doen:

  1. Open QGIS en sleep je GML daarin
  2. Exporteer de laag naar GML

Nu heb je een GML zonder custom schema.

1 like

Als ik de OL docs goed lees, is die schemaLocation optie alleen bedoeld voor als je de features vanuit OL naar GML wil schrijven/exporteren, en doet ie dus niks bij het inlezen (bij het gebruik van readFeatures dus):

schemaLocation [string | undefined] Optional schemaLocation to use when writing out the GML, this will override the default provided.

Pas op voor dataverlies.

Niet elk GML bestand is op deze wijze verliesvrij in te lezen (denk bv aan BGT).

1 like

Dat is waar, en hoewel het hier misschien niet speelt is het wel goed om je te realiseren dat dit kan gebeuren.