Problemen met valideren GML op basis van het IMGeluid XSD

Hallo allemaal,

Voor een project vanuit Rijkswaterstaat ben ik een GML aan het opstellen dat voldoet aan het IMGeluid. Ik doe dit met FME. De data (feature class) die in de GML terecht moet komen zijn geluidproductieplafondobjecten. Dit staat als feature class keurig gedefinieerd in het IMGeluid, en tot recent ging het wegschrijven naar GML en valideren met het IMGeluid XSD ook goed.

Sinds november is er echter een nieuwe versie van het IMGeluid gepubliceerd (versie 1.2.0), waarbij een aantal verschillen zijn op te merken ten aanzien van zijn voorganger (versie 1.1.0). In het geval van de feature class ‘geluidproductieplafondobject’, is de kardinaliteit (of een attribuut verplicht of optioneel is) van het attribuut ‘berekening’ gewijzigd. Waar het attribuut voorheen optioneel was in het IMGeluid XSD, is het nu aangegeven als verplicht.

Het attribuut ‘berekening’ is als volgt weergegeven in het nieuwe IMGeluid XSD:

<xs:element name=“berekening” nillable=“false” type=“img:GeluidberekeningobjectPropertyType”/>

De verwijzing ‘type=“img:GeluidberekeningobjectPropertyType”’ doet suggereren dat het een attribuut is, waar meerdere attributen onder hangen. Door verder te zoeken in het XSD bestand, blijkt dat bij ‘Geluidberekeningobject’, de volgende verplichte attributen zijn aangegeven: identificatie, softwarepakketnaam, softwarepakketversie, berekeningsdatum. Dit is te zien in onderstaande afbeelding.berekening1

Het probleem is nu als volgt. Het succesvol wegschrijven van deze attributen volgens het IMGeluid vergt een bepaalde mapping van de attributen die ik in mijn eigen feature class heb.

Mijn attribuut ‘identificatie’, moet volgens het IMGeluid ‘identificatie.NEN3610ID.namespace’ en ‘identificatie.NEN3610ID.lokaalID’ zijn. In mijn aangemaakte GML ziet het er dan uit zoals in onderstaande afbeeldingafbeelding2

Het lukt mij niet om de correcte mapping te vinden om het attribuut ‘berekening’ weg te schrijven in de GML. Nu komt er telkens een foutmelding vanuit de XSD validatie, dat er een element mist. Mijn vermoeden is dus dat mijn mapping niet klopt.

Ik heb het volgende qua mapping geprobeerd:

Ik heb attribuut:
softwarepakketnaam

En ik veranderde dit naar:
berekening.softwarepakketnaam,
Geluidberekeningobject.softwarepakketnaam,
geluidberekeningobject.softwarepakketnaam,
berekening.Geluidberekeningobject.softwarepakketnaam.
berekening.geluidberekeningobject.softwarepakketnaam.

Deze opties hadden allemaal dezelfde ‘missing elements in content model’ tot gevolg. Het is hierbij handig om te vermelden dat het attribuut (datatype ‘string’) niet leeg was, maar een door mij ingevulde dummywaarde bevatte.

Heeft iemand enig idee hoe het nieuwe verplichte attribuut ‘berekening’ van de feature class ‘geluidproductieplafondobject’ weg te schrijven is in een GML die voldoet aan de IMGeluid eisen?

Met vriendelijke groet,

Vince Doelman
vince.doelman@rws.nl

Het is handig om eerst even “met de hand” een valide documentje in elkaar te zetten mbv een schema-aware xml editor. Die laat precies zien wat je waar mag of moet invullen, inclusief lijstjes om uit te kiezen voor enumeraties.

Ikzelf vind XMLspy daarvoor een geweldig hulpmiddel. Ik denk dat dat zo ongeveer de enige gesloten software die ik nog gebruik. Ik ken geen open source alternatief dat zo fijn werkt voor dit soort werk. Maar goed, met Eclipse (wel open source) kan dit ook.

Met behulp van de goede tips van Marco Duiker ben ik er zelf even ingedoken. Hieronder staat een minimaal voorbeeldje wat in ieder geval aan het XSD voldoet, let dus even niet op gebruik van het juist CRS etc
 Zoals je ziet bevat het verplichte attribuut ‘img:berekening’ een verwijzing naar een Geluidberekeningobject dat ergens anders zou moeten staan:

  <gml:featureMember>
    <img:Geluidproductieplafondobject>
      <img:identificatie>
        <img:NEN3610ID>
          <img:namespace>NL.img</img:namespace>
          <img:lokaalID>53824291.mtr-2018-34005</img:lokaalID>
          <img:versie>1</img:versie>
        </img:NEN3610ID>
      </img:identificatie>
      <img:geometrieReferentiepunt>
        <gml:Point srsName="EPSG:4326">
          <gml:pos>6.40361404 52.38916779</gml:pos>
        </gml:Point>
      </img:geometrieReferentiepunt>
      <img:geluidproductieplafond>10.0</img:geluidproductieplafond>
      <img:vaststellingVanRechtswege>false</img:vaststellingVanRechtswege>
      <img:berekening xlink:href="#NL.img.4341572.xxyzz.1"/>
    </img:Geluidproductieplafondobject>
  </gml:featureMember>

Je zou je ook nog kunnen kijken naar de voorbeeldbestanden die het RIVM publiceert. Kijk eens op https://github.com/rivm-syso/CVGG . Momenteel helpt jou dat nog niet helemaal omdat de voorbeelden nog gebruik maken van versie 1.1, maar de voorbeelden geven wel een goed beeld van hoe het GML eruit zou moeten zien.

Hopelijk kom je er nu uit,

Wilko Quak

Bedankt voor de reacties en de tips tot dusver. Handig om de voorbeeldbestanden van RIVM in te kunnen zien, die had ik nog niet gevonden. Naar aanleiding van het bericht van Marco heb ik een programma gedownload waarmee ik het XSD beter kan ontleden. Hiermee zag ik de volgende relatie tussen ‘berekening’ en ‘Geluidberekeningobject’:

IMG2

Die structuur is ook te zien in een van de voorbeeldbestanden op de github pagina:

IMG1

In het geval van IMGeluid versie 1.2, feature class ‘geluidproductieplafondobject’, lijkt Geluidberekeningobject een specifiek attribuut te zijn van ‘berekening’, en niet een verwijzing naar een hele andere feature class.

Ik zou dan dus verwachten dat het element ‘geluidberekeningobject’ in de GML die ik in deze reactie heb opgenomen, nested is in het element ‘berekening’ in de GML die Wilko stuurde.

Misschien benader ik het verkeerd, en zou ‘geluidberekeningobject’ een opzichzelfstaand item moeten zijn in de GML, en niet als onderdeel van elk geluidproductieplafondobject.

Wilko, is dat ook wat je bedoelt met het onderstaande?

Zoals je ziet bevat het verplichte attribuut ‘img:berekening’ een verwijzing naar een Geluidberekeningobject dat ergens anders zou moeten staan

Onderaan deze boodschap zet ik een screenshot uit het IMGeluid (Informatie Model Geluid (IMGeluid)). in dit plaatje zie je dat de klasse Geluidproductieplafondobject een relatie genaamd ‘berekening’ heeft met de klasse Geluidberekeningobject.

Voor implementatie betekent dit inderdaad dat Geluidberekeningobject op zichzelf staat en dat je er vanuit Geluidproductieplafondobject naar moet verwijzen.

image

MVG, Wilko Quak (Geonovum)

Het is gelukt. Bedankt voor het meedenken!

1 like

Zou je je resultaat nog willen delen? Dan kan een ander met dezelfde vraag er ook mee uit de voeten.

Marco