Deze handreiking beschrijft de toepassing van geometrie in informatiemodellering en de implementatie daarvan in GML. Het is daarmee een ondersteuning voor de toepassing van de norm NEN 3610:2011 - Basismodel geo-informatie [NEN3610]. Deze handreiking is een webversie bedoeld als herpublicatie van het origineel gepubliceerd op 1 maart 2012: Handreiking Geometrie in model en GML, versie 1.0, 1 maart 2012. Deze versie is niet aangepast aan alle ontwikkelingen sinds 2012. De versie is wel nog steeds bruikbaar voor begrip en toepassing van geometrie.
Deze paragraaf beschrijft de status van dit document ten tijde van publicatie. Het is mogelijk dat er actuelere versies van dit document bestaan. Een lijst van Geonovum publicaties en de laatste gepubliceerde versie van dit document zijn te vinden op https://www.geonovum.nl/geo-standaarden/alle-standaarden.
Dit is de definitieve versie van de handreiking. Wijzigingen naar aanleiding van consultaties zijn doorgevoerd.
Dit document is een herpublicatie van het origineel gepubliceerd op 1 maart 2012, en is niet aangepast aan alle ontwikkelingen sinds 2012.
Deze handreiking beschrijft de toepassing van geometrie in informatiemodellering en de implementatie daarvan in GML. Het is daarmee een ondersteuning voor de toepassing van de norm NEN 3610:2011 – Basismodel geo-informatie [NEN3610]. NEN 3610 gaat hierin niet verder dan verwijzing naar de relevante geo-informatie (ISO) normen. Voor het werkveld zijn deze normen niet toegankelijk genoeg om te kunnen toepassen. Middels deze handreiking wordt de brug gelegd. Dit document kan als een zelfstandig document worden gelezen. De inhoud is grotendeels gebaseerd op originele normen. Voor de toegankelijkheid is de tekst vertaald naar het Nederlands en bovendien vereenvoudigd. Deze handreiking kan daarom niet de normen vervangen, maar bijvoorbeeld als introductie worden gebruikt. Voor de normatieve referentie wordt in alle gevallen naar de originele documenten verwezen.
In eerste instantie komt geometrie voor in informatiemodellen in de vorm van geometrietypen populair bekend als punten, lijnen, vlakken. ISO 19107 [iso-19107-2003] beschrijft middels een ruimtelijk schema (spatial schema) deze geometrische primitieven, de uitbreidingen daarop en de relaties daartussen. De toepassing in dat ruimtelijk schema is ook bepalend voor toepassing in informatiemodellen. De relatie tussen het ruimtelijk schema en de toepassing in informatiemodellen wordt beschreven.
Het ruimtelijk schema kent geometrietypen met een toenemende complexiteit. Niet alle typen zijn gegeven de stand van techniek even inter-operabel toepasbaar. Er is daarom een keuze gemaakt tot welke typen we ons in Nederland (in de regel) beperken. Deze inperking wordt beschreven in een profiel.
Uitwisseling van geo-informatie (bestanden) gebeurt middels GML [iso-19136-2007]. Dat betekent dat de conceptuele informatiemodellen toegepast worden in GML. Beschreven wordt hoe het ruimtelijke schema vertaald wordt naar de GML implementatie omgeving. Ook hier wordt er uitgegaan van een Nederlands profiel op de complete GML implementatie. Afgesproken is dat het Nederlands profiel het GML Simple Features profile level 2 volgt. Dit profiel wordt in de annex door middel van business rules in schematron vastgelegd. Met de schematron regels is een GML bestand te controleren op conformiteit met het Nederlandse profiel.
Voor de implementatie in services is het soms nodig om vanwege de interoperabiliteit de complexiteit van het GML bestand te reduceren tot Simple Features profile 0. Dat betekent dat het informatiemodel ook gesimplificeerd moet worden. In hoofdstuk 5 zijn een aantal basisregels opgenomen voor het transformeren van een SF2 model naar een SF0 model.
Hoofdstuk 2 van dit document bevat een uitleg van het ruimtelijk schema zoals beschreven in ISO 19107 en gehanteerd in de GML standaard.
Hoofdstuk 3 bevat een uitleg van het Simple Features profile for GML.
Hoofdstuk 4 beschrijft de Nederlandse toepassing van GML en het Simple Features profile en de regels die daaruit voortvloeien.
In Hoofdstuk 5 wordt tenslotte uitgelegd hoe, indien nodig, een aan Simple features level 2 voldoend informatiemodel kan worden omgezet naar een vereenvoudigd model dat voldoet aan level 0.
De belangrijkste algemene GML coderingsregels staan beschreven in Appendix 1, een uitgewerkt voorbeeld van de in dit document beschreven regels en werkwijze in Appendix 2, en een overzicht van de verschillen tussen GML 3.1.1 en 3.2.1 in Appendix 3.
Dit hoofdstuk beschrijft de definitie van de geometrietypen zoals die zijn gedefinieerd in ISO 19107: Geographic information -- Spatial schema [iso-19107-2003] en in informatiemodellen worden toegepast. Alleen het geometrie gedeelte van het ruimtelijke schema is in deze handreiking opgenomen; het topologie gedeelte wordt niet besproken.
NEN 3610 beschrijft de regels voor het modelleren van geo-informatie. Belangrijk in de definitie van een geografisch object is dat het locatie eigenschappen heeft. Eén van die locatie eigenschappen is de directe locatie die middels coördinaten is beschreven. Door middel van attributen wordt de directe locatie en geometrie door coördinaten gerepresenteerd. De waarden van die attributen zijn coördinaten of coördinaatreeksen die een geometrie representeren. We noemen dit geometrietypen. In ISO 19107 is een klassediagram, het ruimtelijk schema, opgenomen met de geometrietypen en hun onderlinge relaties. De geometrietypen uit dit diagram worden gebruikt om de geometrietypen in geo-informatiemodellen te specificeren.
Voor de geometrietypen zijn er verschillende niveau´s van complexiteit van structuur en dimensionaliteit. Voor de complexiteit van structuur is er een verdeling in de geometrisch primitieven punt, lijn, vlak en volume en de geometrische complexen. Complexen hebben een complexe datastructuur en zijn opgebouwd uit een verzameling geometrische primitieven.
Dimensionaliteit is het tweede criterium bij het definiëren van geometrietypen.
Het ISO 19107 ruimtelijk schema is geconstrueerd rond die twee criteria van data complexiteit en dimensionaliteit. Er is nog een derde criterium, functionaliteit (operaties), dat echter voor de indeling van de geometrietypen in het ruimtelijk schema geen gevolgen heeft. ISO 19125-1 Simple feature access [iso-19125-1-2004] definieert een model voor 2 dimensionale geometrietypen. Zie hiervoor ook het OGC origineel OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 1: Common architecture. In dit 2D geometriemodel zijn restricties opgenomen die van een algemene geometrie een simpele geometrie maken. De term simple feature staat daarin voor features beperkt tot 2 dimensionale geometrie.
Figuur 1 beeldt het ruimtelijk schema af en is overgenomen uit het INSPIRE consolidated UML model. Dat is weer gebaseerd op het model voor geometrische basistypen uit de ISO 19107.
Uit dit schema worden alleen de geometrietypen toegelicht die voor deze handreiking van toepassing zijn. De toelichting is beperkt en omvat alleen de informatie die voor de toepassing van dit document relevant is. Voor de volledige beschrijving wordt verwezen naar ISO 19107. Voor simple features (2D) gelden er restricties die apart worden aangegeven.
De superklasse van alle geometrietypen. Deze klasse beschrijft de eigenschappen die alle geometrie types in ISO 19107 delen. Operaties die voor de klasse GM_Object beschreven zijn zullen dus voor ieder geometrietype geïmplementeerd zijn. Als in een model de geometrie van een object beschreven moet worden terwijl er niets bekend is over het mogelijke voorkomen van die geometrie dan kan GM_Object worden gekozen.
Ook als een klasse meerdere geometrietypen toestaat (bijvoorbeeld: een inrichtingselement kan een punt of een lijn zijn) kan GM_Object worden gebruikt, waarbij dit met een constraint wordt ingeperkt tot GM_Point en GM_Curve.
Punt. 0-dimensionale geometrie.
Lijn. 1-dimensionale geometrie.
Een curve is simple indien er geen zelfintersectie optreedt.
Lijnen zijn continu en hebben een meetbare lengte in een coördinaten systeem. Lijnen bestaan uit een of meer lijnsegmenten waarbij de lijnsegmenten verschillende interpolatiemethoden kunnen gebruiken. Lijnsegmenten zijn aan elkaar verbonden waarbij het eindpunt van elk segment, behalve de laatste, verbonden is aan het beginpunt van het volgende. Wanneer het begin- en eindpunt van een lijn met elkaar verbonden zijn is de lijn gesloten en spreken we ook wel van een Ring.
Vlak. 2-dimensionale geometrie.
Een vlak heeft een oriëntatie, dat wil zeggen, een boven en onderzijde. De bovenzijde is gedefinieerd als de kant vanaf welke de begrenzing tegen de klok in (anti clock wise) is gedigitaliseerd. Een vlak bestaat uit een of meer ‘surface patches’. Indien er meerdere zijn dan vormen die samen een aaneengesloten vlak.
Een vlak is simple indien een vlak bestaat uit één surface patch.
Een vlak heeft normaal gesproken in ieder geval in 2D situaties een buitenkant, de exterior. Daarnaast kan een vlak ook nog 0 of meer interne begrenzingen hebben, de interior. De buitenkant heeft, zoals hierboven beschreven, van bovenaf gezien een richting tegen de klok in. De binnenkant wordt met de klok mee vastgelegd.
Volume. 3-dimensionaal geometrietype.
De geometrie van een GM_Solid is opgebouwd uit GM_SolidBoundaries (grenzen) die elk weer een GM_Surface zijn. Deze zijn naar buiten toe georiënteerd: de bovenkant van elk vlak is aan de buitenkant van het volume object te zien.
Lijnen zijn opgebouwd uit lijnsegmenten. Lijnsegmenten kunnen verschillende interpolatiemethoden voor de interpretatie van de coördinaten hebben. In de regel worden in Nederland (zie Nederlands profiel) alleen de lineaire en ‘circular arc by three points’ gebruikt.
De volgende interpolatiemethoden zijn gespecificeerd. In de lijst hieronder zijn de Engelse ISO 19107 termen weergegeven. Alleen de meest gebruikte typen worden uitgelegd.
Het is mogelijk om samenstellingen van geometrietypen te aggregeren in nieuwe geometrie typen. Hiervoor is het aggregatiepakket ontwikkeld. Aggregaties hebben verder geen regels over de inhoudelijke structuur; in algemeenheid zijn er geen regels over of de geometrische primitieven elkaar moeten/mogen raken, overlappen enzovoort. Voor simple features (2D) gelden er wel restricties. Deze worden apart aangegeven.
Geometrische complexen oftewel composites zijn ook samenstellingen van geometrische primitieven, maar hierbij gelden wel aanvullende regels. Deze composites worden verder niet besproken. Ze zijn geen onderdeel van het Simple Features profile (zie § 3. Geometrie in GML - Nederlands profiel).
Multipunt. Verzameling van punten die gezamenlijk één object vormen. (instanties van GM_Point). Een multipoint is simple indien er geen punten met dezelfde coördinaten voorkomen.
Multilijn. Verzameling van lijnen die gezamenlijk één object vormen (instanties van GM_Curve).
Een multicurve is simple indien de samenstellende delen simple zijn en de enige intersecties tussen delen zich bevinden in punten aan de buitenkant van die objecten (geen kruising wel vertakking).
Multivlak. Verzameling van vlakken die gezamenlijk één object vormen (instanties van GM_Surface).
Vlakken in een multisurface mogen elkaar niet overlappen. In een simple multisurface mogen vlakken elkaar alleen raken in een eindig aantal punten (wel punten maar geen grenzen gemeenschappelijk)
Multivolume. Verzameling van volumes die gezamenlijk één object vormen (instanties van GM_Solid).
Voor het representeren van geometrieën is de dimensionaliteit van groot belang. Voor 2 en 3 dimensionale representatie lijkt voor de hand te liggen wat daar mee bedoeld wordt. In de praktijk wordt er ook nog over 2.5 D gesproken. Het is daarom goed om bruikbare definities te hanteren.
2D: Objecten bestaan uit punten, lijnen of vlakken. Coördinaten zijn een x en een y-waarde.
2,5D: Punten, lijnen of vlakken. Coördinaten zijn een x,y en z waarde. Bij elk x,y-locatie is er maximaal één z-waarde beschikbaar. Dat betekent dat 2D geometrien zich in een 3D ruimte (x,y,z) bevinden maar dat de geometrien zichzelf of elkaar niet mogen overlappen in de horizontale projectie.
3D: Volume eenheden oftewel ‘solids’ zijn onderdeel van de mogelijke geometrietypen. Bij elke x,y-locatie zijn er meerdere z-waarden mogelijk.
Het ruimtelijk schema in al zijn complexiteit is geschikt om zeer gevarieerde representaties van geometrieën te definiëren. Bij het kiezen van geometrietypen ter implementatie in een softwareomgeving is het van belang eisen ten aanzien van interoperabiliteit mee te nemen. In het kader van het Nederlands profiel op ISO 19107 is er gekeken naar GML als implementatieomgeving. Daarin is geëvalueerd welke subset van geometrietypen uit het ruimtelijke schema tot een basisset, een profiel, moeten behoren. Er is daarmee een directe link tussen het Nederlandse profiel op GML en het profiel op ISO 19107.
Het Nederlands Basismodel Geo-informatie (NEN 3610) specificeert in overeenstemming met de ISO-geo-informatiestandaarden GML (Geography Markup Language) als uitwisselingsformaat voor geo-informatie. De actuele standaard voor GML [gml] wordt gehanteerd. Op dit moment is dat GML 3.2.1, waarbij ook GML 3.1.1 nog ondersteund wordt. Omdat GML 3.2.1 een zeer uitgebreide standaard is wordt er een profiel, een subset gehanteerd.
GML 3.2.1 is een uitgebreide standaard, ontwikkeld door het Open Geospatial Consortium (OGC) en biedt oplossingen voor een groot aantal situaties en variaties voor het uitwisselen van geo-informatie. Variaties zijn er in geometrietypen maar ook in complexiteit van datastructuren. Om verschillende niveaus van toepassing van GML 3.2.1 mogelijk te maken zijn er door OGC zogenaamde profielen gemaakt. De ontwikkeling van de profielen is voortgekomen uit een behoefte van onder meer softwareleveranciers om verschillende niveaus van complexiteit te ondersteunen. Operabiliteit kan daarmee beter gegarandeerd worden. De profielen omvatten elk een subset van de totale GML 3.2.1 standaard. De standaardprofielen zijn Simple Features Profile 0, Simple Features Profile 1 en Simple Features Profile 2 (afgekort tot respectievelijk SF0, SF1, en SF2). Deze profielen hebben een toenemende complexiteit en bieden ook een toenemende functionaliteit. SF0 is dus het eenvoudigst, en SF2 het meest uitgebreid. Het OGC Simple Features profile moet niet verward worden met de ISO 19125 - Simple feature access standaard. De eerste gaat over implementatie van geometrie in GML de tweede over definities van 2 dimensionale geometrietypen.
Een profiel dat meer complexiteit en functionaliteit toestaat, biedt meer mogelijkheden voor datamodellering of geometriebeschrijvingen, maar is ook moeilijker toe te passen in software. Deze complexiteit kan de uitwisseling tussen verschillende softwareplatforms bemoeilijken. Een eenvoudig profiel daarentegen biedt minder mogelijkheden voor datamodellering maar is wel eenvoudiger toe te passen in generieke software. Het is daarom van belang voor- en nadelen tegen elkaar af te wegen.
In Nederland is het SF2 profiel op GML van toepassing verklaard.
Bij het tot stand komen van het Nederlandse GML profiel zijn een aantal beginselen leidend geweest:
Door deze beginselen geeft het profiel voldoende richting voor standaardisering van algemene functionaliteit maar ook flexibiliteit voor toepassingen die specifieke oplossingen nodig hebben. Het profiel geeft richting aan de aanbodkant van geo-informatie en aan de modelleurs van informatiemodellen voor de oplossingen en mogelijkheden voor datamodellering. Voor softwaretoepassingen biedt het profiel een basis waar functionaliteit en toepassingen op afgestemd kunnen worden.
Om een uitspraak te kunnen doen over de eisen die in Nederland gesteld worden aan GML als uitwisselingsstandaard is een enquête gehouden onder de beheerders van aan NEN 3610 gerelateerde informatiemodellen. De volgende informatiemodellen en hun respectievelijke sectoren zijn hier bij betrokken: BAG (adressen en gebouwen), IMGeo (geografie), IMWA, UM Aquo-m, UM Aquo-krw (water), TOP10NL/IMTOP (topografie), GBR (grootschalig weg, water en waterwegen), IMWE (welstand), IMRO (ruimtelijke ordening), IMKICH (cultuurhistorie), IMKAD (kadaster), IMKL, BMKL (kabels en leidingen), IMBOD (bodem). Op basis van deze eisen is een eerste concept profiel voor GML ontwikkeld.
Het conceptprofiel is gepresenteerd aan en voor commentaar uitgebracht naar het hele geo-informatie werkveld. Een belangrijke rol was hierin voor softwareleveranciers en –ontwikkelaars om eisen vanuit de toepassingen in het profiel te verwerken. Het conceptprofiel is gepubliceerd onder de werknaam gml4nl en was op het moment van publicatie gebaseerd op GML 3.1.1.
Bij de ISO publicatie van GML 3.2.1 is ook het Nederlandse profiel vernieuwd. Het Nederlandse profiel bleek daarbij zo weinig van het GML SF2 profiel te verschillen dat besloten is om geen apart Nederlands profiel te publiceren maar SF2 als officieel Nederlandse profiel op GML 3.2.1 te volgen. Belangrijk was daarin dat het huidige SF2 profiel, in tegenstelling tot 3.1.1 SF2, ook cirkels en bogen opgenomen heeft als geometrievormen.
De GML standaard is een omvangrijke verzameling van XML elementen en attributen waarmee van alles mogelijk is. De GML standaard bevat bijvoorbeeld definities voor dynamische (voortdurend veranderende) objecten, topologie, complexe geometrische typen, en rasters. Dit maakt GML tot een rijke standaard die veel te bieden heeft, maar maakt het ook moeilijker voor software aanbieders om de hele standaard te ondersteunen.
Om dit probleem te adresseren zijn er verschillende profielen op GML gedefinieerd door de OGC. Een GML profiel is een subset van de complete GML set. De subset is wel zodanig dat het profiel niet in tegenspraak is met de complete set. Voor GML 3.2.1 zijn er drie profielen met toenemende complexiteit, de zogenaamde Simple Features profielen. Softwareleveranciers kunnen ervoor kiezen hun ondersteuning van GML te beperken tot een van deze profielen, of uiteraard om de hele standaard te ondersteunen.
Wat is nu een “simple feature”? Een feature is in de context van GML een equivalent van een instantie van een objecttype zoals bijvoorbeeld een gebouw, een boom, een persoon, een ding. Deze instanties hoeven niet noodzakelijkerwijs een geometrie, of locatie-informatie te hebben. Met ‘simple’ wordt in deze context bedoeld dat de features:
Een eenvoudige datastructuur hebben.
Als het ruimtelijke objecten zijn, een eenvoudige geometrische vorm hebben.
De GML standaard is gebaseerd op de algemene XML standaard XML Schema [xmlschema-0]. Een deel van de regels uit de simple features profielen hebben hier betrekking op. SF0 beperkt bijvoorbeeld de datatypen uit XML Schema die gebruikt mogen worden (string, boolean, etc) en definieert daarmee in feite ook een subset van XML Schema. Dit geldt voor de meeste regels die betrekking hebben op de eenvoud van de datastructuur.
Wat er precies wordt beschouwd als ‘eenvoudig’, oftewel wat er wel en niet is toegestaan, wordt gespecificeerd in de GML Simple Features Profile standaard [GML-SF].
De volgende tabel uit het OGC document Geography Markup Language (GML) simple features profile, geeft een overzicht van de inhoud van de verschillende profielen.
SF-0 | SF-1 | SF-2 | |
---|---|---|---|
Beperkte set van ingebouwde niet ruimtelijke typen | String, integer, measurement, date, real, binary, boolean, URI | String, integer, measurement, date, real, binary, boolean, URI | Geen beperking |
Beperkte set van geometrietypen[^3] | (multi)Punt, (multi)lijn, (multi)vlak,(multi) geometry | (multi)Punt, (multi)lijn, (multi)vlak,(multi) geometry | (multi)Punt, (multi)lijn, (multi)vlak,(multi) geometry |
Zelf ontwikkelde datatypen | nee | ja | ja |
Gebruik van nillable en xsi:nil | nee | ja | ja |
Cardinaliteit(multipliciteit) | 0 of 1 | 0 tot onbeperkt | 0 tot onbeperkt |
Niet-ruimtelijke referenties | Ja, Alleen by reference (gml:ReferenceType ) |
Ja By reference (gml:ReferenceType ) of inline |
Ja By reference en inline in combinatie is mogelijk. |
Ruimtelijke referenties | Ja, Alleen by reference (gml:ReferenceType ) |
Ja Alleen by reference (gml:ReferenceType ) |
Ja By reference en inline in combinatie is mogelijk. |
Tabel 2 geeft meer detail over de toegestane geometrietypen.
Het is toegestaan samengestelde (geaggregeerde) geometrie te gebruiken, te weten MultiPoint, MultiCurve, MultiSurface, en MultiGeometry. Hierbinnen geldt dat alleen de enkelvoudige container elementen mogen worden gebruikt. Dus wel: gml:pointMember
maar niet: gml:pointMembers
enzovoort.
Voor alle niveau’s (SF0, SF1 en SF2) geldt bovendien dat de volgende GML onderdelen in het Simple Features profile niet worden ondersteund:
Verder geldt:
gml:metadataProperty
is niet toegestaan. Men moet indien nodig zelf metadata elementen definiëren in een GML application schema.Een GML document is gedefinieerd als één feature collectie, een verzameling van geo-objecten. Deze collectie krijgt een eigen naam gedefinieerd in het XML-Schema. Een GML document begint met de declaratie van deze collectie in het root element. Er wordt geen gebruik gemaakt van de container gml:featureMembers
en de individuele gml:featureMember
. Deze elementen zijn komen te vervallen vanaf GML versie 3.2.
Voorbeeld XSD fragment:
<element name="FeatureCollectionIMRO" type="imro:FeatureCollectionIMROType"
substitutionGroup="gml:AbstractGML"/>
<complexType name="FeatureCollectionIMROType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="featureMember">
<complexType>
<complexContent>
<extension base="gml:AbstractFeatureMemberType">
<sequence>
<element ref="gml:AbstractFeature"/>
</sequence>
</extension>
</complexContent>
</complexType>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
Voorbeeld GML fragment:
<imro:FeatureCollectionIMRO gml:id="Collectie"
xmlns:imro="http://www.geonovum.nl/imro2012"
xmlns:xlink=xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.geonovum.nl/imro2012 IMRO2012.xsd"\>
<imro:featureMember>
<imro:Bestemmingsplangebied gml:id="NL.IMRO.0999.BP2008000001-0005">
...
</imro:Bestemmingsplangebied>
</imro:featureMember>
<imro:featureMember>
<imro:Enkelbestemming gml:id="NL.IMRO.135">
...
</imro:Enkelbestemming>
</imro:featureMember>
...
</imro:FeatureCollectionIMRO>
GML Simple Feature Profile staat een beperkte subset van geometrietypen uit GML toe. Deze subset is voor SF0, SF1, en SF2 gelijk.
Tabel 2: Geometrietypen. Van elk type is ook het equivalent in UML gegeven (Spatial Schema):
In GML | UML equivalent | Restricties | Welk GML Schema document |
---|---|---|---|
gml:Point |
GM_Point | geen | geometryBasic0d1d.xsd |
gml:Curve |
GM_Curve | gml:LineString of gml:Curve met gml:LineStringSegment , gml:Arc , gml:Circle of gml:CircleByCenterPoint |
|
gml:Surface |
GM_Surface | ondersteund wordt: gml:Polygon of gml:Surface met gml:PolygonPatch patches. Surface grenzen kunnen beschreven worden met gml:LinearRing of gml:Ring met enkele gml:Curve met gml:LineStringSegment , gml:Arc , gml:Circle of gml:CircleByCenterPoint |
geometryBasic0d1d.xsd geometryPrimitives.xsd |
gml:Geometry |
ondersteund wordt: gml:Point , gml:LineString , gml:Curve , gml:Polygon , gml:Surface , gml:MultiPoint , gml:MultiCurve , gml:MultiSurface |
geometryBasic0d1d.xsd | |
gml:MultiPoint |
geen | geometryAggregates.xsd | |
gml:MultiCurve |
zelfde als gml:Curve |
geometryAggregates.xsd | |
gml:MultiSurface |
zelfde als gml:Surface |
geometryAggregates.xsd | |
gml:MultiGeometry |
zelfde als gml:Geometry |
geometryAggregates.xsd |
Specificatie van coördinaten:
Voor gml:point
en gml:CircleByCenterPoint
is dit middels het gml:pos
element. Voor alle ander typen is het de gml:posList
.
In het Simple Features profiel wordt aanbevolen om het coördinaatreferentiesysteem (CRS) van de in een GML document aanwezige coördinaten in het GML document op te nemen. In clausule 9 van NEN 3610:2011 wordt dit zelfs verplicht gesteld.
In het GML bestand dient het coördinaatreferentiesysteem opgenomen te worden als waarde van het in GML gedefinieerde attribuut srsName
. Aangeraden wordt om dit zo generiek mogelijk te doen. Als alle coördinaten in het document hetzelfde CRS hebben, zou het srsName
attribuut op het niveau van de feature collection moeten worden opgenomen. Anders kan srsName
worden opgenomen op feature member niveau of op geometrie niveau.
Voor het definiëren van het coördinaatreferentiesysteem kunnen EPSG (European Petroleum Survey Group) codes worden gebruikt.
<wfs:FeatureCollection>
<gml:boundedBy>
<gml:Envelope srsName="urn:opengis:def:crs:EPSG::28992">...</gml:Envelope>
</gml:boundedBy>
<!-- feature instances go here -->
<wfs:member>
<myns:MyFeature>
<gml:boundedBy>
<gml:Envelope srsName="...">...</gml:Envelope>
</gml:boundedBy>
<!-- zero or more property values go here -->
<myns:geomProperty>
<gml:Polygon srsName="...">...</gml:Polygon>
</myns:geomProperty>
<!-- zero or more property values go here -->
</myns:MyFeature>
</wfs:member>
<!-- more feature instances go here -->
</wfs:FeatureCollection>
Geometrietypen die zijn samengesteld fungeren als een container (aggregatie) voor de verschillende individuele geometrie elementen. De volgende container elementen zijn toegestaan.
Tabel 3: Samengestelde geometrietypen
Samengesteld geometrie type | Container element |
---|---|
gml:MultiPoint |
gml:pointMember |
gml:MultiCurve |
gml:curveMember |
gml:MultiSurface |
gml:surfaceMember |
gml:MultiGeometry |
gml:geometryMember |
Het type lijninterpolatie beschrijft hoe de verbinding tussen twee coördinaatparen (punten) is beschreven. In de GML standaard is hiervoor een uitgebreid aantal mogelijkheden. Het Simple Features profiel ondersteunt hiervan maar twee:lineaire interpolatie en interpolatie door middel van cirkelbogen. Deze laatste niet lineaire interpolatie was geen onderdeel van het SF profiel van de vorige GML versie (3.1). Vanwege het toegenomen gebruik in applicaties zijn ze nu wel toegevoegd.
In de tabel in paragraaf 3.3.2 is precies te zien welke typen lijninterpolatie zijn toegestaan door te kijken naar de restricties bij gml:Curve
en gml:Surface
. Toegestaan voor het opnemen van rechte lijnen zijn alleen gml:LineString en gml:Curve
met gml:lineStringSegments
. Voor het opnemen van bogen zijn alleen gml:Arc
, gml:Circle
en gml:CircleByCenterPoint
toegestaan. gml:Arc
is de GML implementatie van de cirulaire boog met drie punten (beginpunt, eindpunt en punt waar de boog doorheen loopt).
De overige typen lijninterpolatie, zoals gml:CubicSpline
, gml:ArcByBulge
, etc, zijn niet toegestaan.
SF0 is het meest eenvoudige profiel op GML, m.a.w. het profiel met de meeste restricties op GML en XML Schema.
Regels:
gml:ReferenceType
. Het gml:ReferenceType
is de simpele GML implementatie van in UML als associaties gemodelleerde koppelingen tussen objecttypen. De naam van de gekoppelde bron (objecttype) wordt opgenomen in een appinfo element, zodat te zien is naar wat voor soort ding er gerefereerd wordt. De daadwerkelijke verwijzing naar een object instantie wordt met xlink:href
gedaan.string
of een restrictie daarvan. De maxLength
of length
mogen worden gebruikt om de string verder in te perken.xml:lang
attribuut waarin de taalcode is opgegeven.integer
of een restrictie daarvan. In het totalDigits
element kan worden aangegeven hoe lang het getal mag zijn.gml:MeasureType
zijn of zijn afgeleid.date
of dateTime
of een restrictie daarvan.double
of decimal
of een restrictie daarvan. Bij een decimal mogen de facetten totalDigits
en fractionDigits
worden opgegeven, bij een double niet. Meestal zullen elementen met real waarden overigens metingen zijn en dus met een gml:MeasureType
worden opgenomen.base64Binary
of hexBinary
; of ernaar verwijzen met een URL. In elk geval is het opnemen van de mimeType
verplicht.boolean
zijn.anyURI
zijn.minInclusive
, minExclusive
, maxInclusive
, maxExclusive
, en enumeration
. Hiermee kan men de minimale en maximale waarden van getallen inperken en enumeraties definiëren.nillable
mag niet gebruikt worden.SF1 kent minder restricties dan SF0 en is dan ook iets complexer.
SF1 neemt de regels van SF0 over, met uitzondering van het volgende:
nillable
mag gebruikt worden.In SF1 en SF2 kan een geneste structuur van attributen toegepast worden. Attributen kunnen daarbij samengesteld worden uit een verzameling attributen. We noemen deze constructie het samengesteld attribuut.
Een voorbeeld is een attribuut met de naam ‘identificatie’ en een datatype ‘identifier’. Het datatype bestaat vervolgens uit drie attributen ‘identificatiecode’, ‘organisatie’, ‘versie’. Het attribuut ‘identificatie’ is in dit geval samengesteld uit drie andere attributen, verenigd in het zelfgemaakte datatype ‘identifier’.
In een GML application schema ziet die constructie als volgt uit:
<complexType name="IdentifierPropertyType">
<sequence>
<element ref="fw:Identifier"/>
</sequence>
</complexType>
<element name="Identifier">
<complexType>
<sequence>
<element name="identificatiecode" type="string"/>
<element name="organisatie" type="string" minOccurs="0" maxOccurs="1"/>
<element name="versie" type="string" minOccurs="0" maxOccurs="1"/>
</sequence>
</complexType>
</element>
SF2 is het minst restrictieve niveau in het profiel en is geschikt voor geavanceerde informatiemodellen. Vergeleken met SF1 vervallen in SF2 alle regels over het definiëren van niet-geometrische eigenschappen. D.w.z. alle typen uit de XML Schema standaard mogen gebruikt worden, eigen eenvoudige en samengestelde typen mogen worden gedefinieerd, er zijn geen restricties op kardinaliteit, etc.
Waarden van een eigenschap mogen in SF2 inline (genest) of door verwijzing worden opgenomen. Een mix van beide mag gebruikt worden en gebruik van gml:ReferenceType
is niet verplicht.
Wel blijft de restrictie op de toegestane geometrietypen gelden, net als de regel over het definiëren van feature collecties.
Het Simple Features profile van GML 3.1 was in technisch opzicht een gestripte versie van de volledige GML XSD. Dit bleek echter bij veel validatietools problemen op te leveren. De gestripte XSD had dezelfde namespace als de volledige GML XSD waardoor conflicten konden optreden.
Bij het Simple Features profile van GML 3.2 is daarom een andere werkwijze gekozen. Een GML applicatieschema dat voldoet aan een bepaald level van het Simple Features profile, moet hoewel de GML standaard niet volledig hoeft te worden ondersteund, de volledige GML XSD en de gmlsfLevels.xsd importeren en in de header aangeven welk SF level is toegepast. Dit dient te gebeuren door een annotation op te nemen binnen het schema element:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0">
<import namespace="http://www.opengis.net/gml/3.2"
schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
<import namespace="http://www.opengis.net/gmlsf/2.0"
schemaLocation="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd"/>
<annotation>
<appinfo source="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd">
<!--hier een 0, 1 of 2 invullen-->
<gmlsf:ComplianceLevel>2</gmlsf:ComplianceLevel>
</appinfo>
</annotation>
...
</schema>
In plaats van een absolute URL naar de locatie van de schema’s in de schema repository van de OGC, is het ook toegestaan een absolute of relatieve URL naar een andere locatie te gebruiken, zolang het schema maar opgehaald kan worden.
Het is toegestaan om andere application schema’s te importeren, maar alleen als die voldoen aan hetzelfde Simple Features profile niveau of een lager niveau (en dus minder complex zijn) en dit op de voorgeschreven manier aangeven in de header.
Om te controleren of een GML bestand voldoet aan de regels van het Simple Features profile, kan de GML xsd niet worden gebruikt omdat er geen gestripte versie meer beschikbaar is. In plaats daarvan wordt aangeraden om een Schematron validatie te gebruiken. Voor SF2 is een document met Schematron regels beschikbaar in Annex E van het Simple Features profile for GML. Deze regels zijn beschreven in het volgende hoofdstuk, en zijn als validatie ook beschikbaar in de schema repository van de OGC en de online validator van Geonovum.
Vanwege de voordelen van voldoen aan internationale conventies en omdat het GML Simple Features profile level 2(SF2) bijna voldoet aan de eisen die er in Nederland gesteld worden is er besloten om SF2 als Nederlandse standaard voor de implementatie van GML 3.2.1 te nemen. In het vorige hoofdstuk is de inhoud van dat profiel toegelicht. In dit hoofdstuk wordt het profiel beschreven middels businessrules die van toepassing zijn op een GML document dat voldoet aan SF 2. De businessrules zijn opgesteld in Schematron, een taal ontwikkeld voor het valideren van XML documenten.
Schematron gaat in tegenstelling tot XML Schema niet uit van een definitie van de complete XML structuur van een set documenten, maar stelt in staat om regels op te stellen voor specifieke onderdelen van XML documenten. Schematron kan daardoor gebruikt worden om heel gericht enkele regels te controleren. Voor het opstellen van de regels zijn er veel mogelijkheden, waaronder het toetsen van onderlinge afhankelijkheden tussen onderdelen van de XML structuur, wat met XML Schema niet mogelijk is. Terwijl XML Schema te vergelijken is met UML, is Schematron verwant aan de Object Constraint Language (OCL). Beide zijn de implementatie van hun meer conceptuele equivalent.
De in Schematron opgestelde regels kunnen voor validatie van XML (GML) documenten worden gebruikt. Een deel van de bekende XML editors kan validaties tegen Schematron regels uitvoeren of de Schematron controle kan worden uitgevoerd als XSLT transformatie. Validatie tegen de Schematron implementatie van SF2 kan ook via de Geonovum validator worden uitgevoerd.
De nu volgende paragraaf geeft de Schematron regels die voor het valideren tegen GML SF2 zijn opgesteld. Door de toelichting bij elke regel wordt duidelijk gemaakt hoe op dat bepaalde onderwerp SF2 verschilt van de complete GML standaard.
De hieronder weergegeven business rules omvatten alleen de SF2 regels. De controle beperkt zich tot met name de restricties met betrekking tot geometrietypen. De restricties op XML Schema, die voor SF0 en SF1 gelden, zijn niet opgenomen. Deze Schematron regels kunnen echter wel gebruikt worden om tenminste de geometrie restricties voor een SF0 of SF1 bestand te valideren. Deze zijn immers voor SF0, SF1 en SF2 gelijk.
Deze schematron regels zijn ontleend aan het OGC Simple Feature Profile for GML. De nieuwste versie is te vinden op http://schemas.opengis.net/gmlsfProfile/2.0/.
Geen gebruik van gml:metaDataProperty.
<sch:assert test="not(gml:metaDataProperty)">
This profile prohibits use of gml:metaDataProperty elements for referencing metadata
in instance documents.
</sch:assert>
Geen topologie elementen
Geen voorkomens van Node
, Edge
, Face
, TopoSolid
, TopoPoint
, TopoCurve
, TopoSurface
, TopoVolume
, or TopoComplex
.
<sch:assert test="not(
self::gml:Node|self::gml:Edge|self::gml:Face|self::gml:TopoSolid |self::gml:TopoPoint|
self::gml:TopoCurve|self::gml:TopoSurface |self::gml:TopoVolume|self::gml:TopoComplex)">
Spatial properties are limited to the set of geometric types consisting of point,
curve with linear and/or circular arc interpolation, planar surface, or aggregates
thereof. Spatial topology is excluded.
</sch:assert>
Interpolatie van curve segmenten
Toegestaan binnen een gml:Curve
zijn LineStringSegment
, Arc
, Circle
, or CircleByCenterPoint
<sch:assert test="not(
self::gml:Curve) or self::gml:Curve/gml:segments[gml:LineStringSegment|gml:Arc|gml:Circle|
gml:CircleByCenterPoint]">
Curves (standalone or within surfaces) must have linear and/or circular arc interpolation
(LineString, Curve with Arc, Circle or CircleByCenterpoint segments)
</sch:assert>
Surface is Polygon of Surface.
Geen voorkomens van OrientableSurface
, CompositeSurface
, PolyhedralSurface
, Tin
, of TriangulatedSurface
.
<sch:assert test="not(
self::gml:OrientableSurface|self::gml:CompositeSurface|self::gml:PolyhedralSurface|
self::gml:Tin|self::gml:TriangulatedSurface)">
Planar surface types are restricted to Polygon or Surface elements.
</sch:assert>
Beperkt aantal geometrytypen.
Geen Solid
, MultiSolid
, CompositeSolid
, CompositeCurve
of Grid
.
<sch:assert test="not(
self::gml:Solid|self::gml:MultiSolid|self::gml:CompositeSolid|self::gml:CompositeCurve|
self::gml:Grid)">
Supported geometry types are restricted to point, curve with linear and/or circular arc
interpolation, planar surface, or aggregates thereof.
</sch:assert>
Punt coordinaten met gml:pos element.
Binnen een gml:Point
moeten de coordinaten zijn opgenomen in een gml:pos
element.
<sch:assert test="count(self::gml:Point/gml:pos) = count(self::gml:Point/*)">
Geometry coordinates shall only be specified using the gml:pos element for gml:Point.
</sch:assert>
Gml:CircleByCenterPoint gebruikt gml:pos element.
Binnen een gml:CircleByCenterPoint
moeten de coordinaten zijn opgenomen in een gml:pos
element.
<sch:assert test="count(
self::gml:CircleByCenterPoint/gml:pos|self::gml:CircleByCenterPoint/gml:radius) =
count(self::gml:CircleByCenterPoint/*)">
Geometry coordinates shall only be specified using the gml:pos element
for gml:CircleByCenterPoint.
</sch:assert>
Gml:posList element voor coordinaten in andere dan punt geometrien.
Gml:LineString:
Binnen een gml:LineString
moeten de coordinaten zijn opgenomen in een gml:posList
element.
<sch:assert test="count(
self::gml:LineStringSegment/gml:posList) = count(self::gml:LineStringSegment/*)">
Geometry coordinates shall only be specified using the gml:posList element
for gml:LineStringSegment.
</sch:assert>
Gml:LinearRing
Binnen een gml:LinearRing
moeten de coordinaten zijn opgenomen in een gml:posList
element.
<sch:assert test="count(
self::gml:LinearRing/gml:posList) = count(self::gml:LinearRing/*)">
Geometry coordinates shall only be specified using the gml:posList element for gml:LinearRing.
</sch:assert>
Gml:Arc
Binnen een gml:Arc
moeten de coordinaten zijn opgenomen in een gml:posList
element.
<sch:assert test="count(
self::gml:Arc/gml:posList) = count(self::gml:Arc/*)">
Geometry coordinates shall only be specified using the gml:posList element for
gml:Arc.
</sch:assert>
gml:Circle
Binnen een gml:Circle
moeten de coordinaten zijn opgenomen in een gml:posList
element.
<sch:assert test="count(
self::gml:Circle/gml:posList) = count(self::gml:Circle/*)">
Geometry coordinates shall only be specified using the gml:posList element for
gml:Circle.
</sch:assert>
Toegestane container elementen:
gml:pointMember
<sch:assert test="not(self::gml:MultiPoint/gml:pointMembers)">
This profile restricts instance documents to using the property container gml:pointMember
for the MultiPoint geometry type.
</sch:assert>
gml:curveMember
<sch:assert test="not(self::gml:MultiCurve/gml:curveMembers)">
This profile restricts instance documents to using the property container gml:curveMember
for the MultiCurve geometry type.
</sch:assert>
gml:surfaceMember
<sch:assert test="not(self::gml:MultiSurface/gml:surfaceMembers)">
This profile restricts instance documents to using the property container gml:surfaceMember
for the MultiSurface geometry type.
</sch:assert>
gml:geometryMember
<sch:assert test="not(self::gml:MultiGeometry/gml:geometryMembers)">
This profile restricts instance documents to using the property container gml:geometryMember
for the MultiGeometry geometry type.
</sch:assert>
Surface elementen zijn altijd gml:PolygonPatch
<sch:assert test="count(
self::gml:Surface/gml:patches/gml:PolygonPatch) = count(self::gml:Surface/gml:patches/*)">
The content of gml:Surface elements is restricted to gml:PolygonPatch patches.
</sch:assert>
De dimensie van het coordinaatreferentiesysteem is 1, 2 of 3
<sch:assert test="not(self::*/@srsDimension > 3)">
coordinate reference systems may have 1, 2 or 3 dimensions
</sch:assert>
SF2 is de standaard voor informatiemodellen in Nederland. Toch is het in sommige gevallen gewenst om te werken met een eenvoudiger informatiemodel, dat met name voor software die de complexere zaken in SF2 niet ondersteunt, te begrijpen is.
De beperkingen die SF0 oplegt aan de GML structuur op het gebied van datastructurering en datatypen maken dit niveau het meest verwant aan een gangbare databasestructuur. Dit kan bijvoorbeeld het importeren van een GML bestand of het serveren van GML data in een web service sterk vereenvoudigen.
Als het voor een implementatie nodig is dat de GML bestanden aan SF0 voldoen in plaats van het in Nederland algemeen geldende SF2, kan er naast het conceptuele informatiemodel, dat voldoet aan SF2, een afgeleide versie worden gemaakt die voldoet aan SF0. Dit brengt een aantal wijzigingen in het informatiemodel met zich mee, die in dit hoofdstuk besproken worden.
De in dit hoofdstuk opgenomen voorbeelden zijn fictief en hebben geen relatie met een actueel model.
Wie een informatiemodel moet omzetten dat voldoet aan SF2 naar een variant die voldoet aan het strengere SF0, moet met de volgende aspecten rekening houden:
string
, integer
, date
, real
, binary
, boolean
, en URI
gebruikt worden, plus het GML type measurement
.gml:ReferenceType
worden vastgelegd.nillable
functionaliteit mag niet gebruikt worden.Om een informatiemodel volgens SF0 te implementeren op basis van een SF2 informatiemodel kunnen de volgende normalisatieregels gevolgd worden.
In SF2 is het toegestaan om attributen (eigenschappen van features) meerdere keren te laten voorkomen. In SF0 mag elk attribuut maar één keer voorkomen.
Er zijn twee oplossingen waaruit gekozen kan worden:
Complexe datatypen, oftewel samengestelde attributen, met eigen geneste structuur, zijn in SF2 wel toegestaan, maar in SF0 niet.
Samengestelde attributen worden in een aan SF0 voldoend informatiemodel opgenomen als losse attributen. Met een gelijknamig stereotype dat bij elk van de attributen die bij het samengestelde attribuut horen wordt opgenomen, wordt in het UML informatiemodel aangegeven dat de attributen bij elkaar horen. Het stereotype wordt in de UML klasse weergegeven boven de attributen die het gemeenschappelijk hebben tussen << >>.
Daarnaast krijgen deze attributen een gemeenschappelijke prefix, die aangeeft dat ze een groep vormen. Zo zijn ze in een GML bestand ook te herkennen als bij elkaar horende groep.
Ook associaties zijn in een SF2 informatiemodel wel toegestaan, maar in een SF0 model niet. Associaties worden in een GML bestand gecodeerd als ofwel een geneste structuur, ofwel een link. In SF0 zijn geneste structuren niet toegestaan (zie de vorige paragraaf) en mogelijk links/verwijzingen alleen worden uitgedrukt met behulp van het gml:ReferenceType
.
Om het zo eenvoudig mogelijk te houden geldt voor de vertaling van associaties uit een SF2 model naar een SF0 model dat deze in plaats van als associaties tussen klassen in het model worden opgenomen als attributen:
<<objectverwijzing>>
,Ref
.Als de associatie meerdere keren mag voorkomen, wordt dit op de zelfde manier opgelost als bij meervoudige attributen.
In het attribuut wordt de identificatie opgenomen van het object waarnaar verwezen wordt.
Hoe uit een UML informatiemodel uiteindelijk een XML Schema wordt gemaakt is aan regels gebonden die in ISO 19118 en in annex E van de OGC standaard GML beschreven zijn. Dit hoofdstuk geeft een overzicht van de belangrijkste van deze regels.
In ISO/TC 211 en OGC en daarom ook in NEN3610, wordt het semantisch model in UML vastgelegd. Vervolgens wordt via een geautomatiseerde procedure een XML/GML Schema uit het UML model gegenereerd. Op deze wijze wordt geborgd dat er geen verschillen ontstaan tussen het semantisch model in UML en het technisch model in het uitwisselformaat XML/GML. Het is ook toegestaan om handmatig een GML-conform XML Schema te maken.
Het semantisch model, vastgelegd in UML, wordt een UML Application Schema genoemd. Het bijbehorende XML Schema wordt een GML Application Schema genoemd. De term 'application' duidt er daarbij op dat het om een toepassing van GML gaat voor een specifiek domein/sector.
Het informatiemodel wordt gemodelleerd middels één of meer UML klassendiagrammen. De klassen worden gegroepeerd in UML packages, één voor elk te genereren schema bestand. Aan de packages en klassen kan extra informatie worden toegekend die gebruikt wordt om het genereren van het schema te sturen. Dit wordt gedaan door een stereotype toe te kennen aan het package of de klasse. GML definieert een standaard set aan stereotypen (GML 3.2.1 Annex E).
Bij een package kan bijvoorbeeld worden aangegeven dat het van het stereotype <<applicationschema>>
is waarna kan worden aangegeven wat de gewenste target namespace, namespace prefix en bestandsnaam zijn van het te genereren XML Schema. Bij een klasse kan men aangeven dat het een <<featuretype>>
is (geo-object) waarna bij de klasse metadata specifiek voor FeatureTypes kan worden ingevuld. Een klasse kan echter ook bijvoorbeeld van het stereotype <<union>>
zijn.
Een klasse waarvan is aangegeven dat het een FeatureType is, zal volgens de GML encoding rules voor Features worden opgenomen in het te genereren XML Schema als een globaal XML element in de substitutionGroup van gml:AbstractFeature
met een
globaal complexType dat een extensie is van gml:AbstractFeatureType
. Een klasse waarvan is aangegeven dat het een Union is, zal heel anders naar het XML Schema vertaald worden, namelijk als een complexType
met een choice
.
Voor het genereren van het XML Schema wordt een tool gebruikt, ShapeChange van interactive instruments, die op basis van een UML model een of meer GML Application Schema's genereert volgens de door de GML standaard gestelde eisen. Wie deze tool gebruikt voor het genereren van het GML application schema hoeft zich dus geen zorgen meer te maken over de GML encoding rules.
Het XML Schema moet voldoen aan de eisen die GML eraan stelt (GML 3.2.1 clause 21 en delen van clause 7), en, indien uit UML gegenereerd, aan de eisen die GML stelt aan het vertalen van UML model naar XML Schema (GML 3.2.1 Annex E, ISO 19118).
Het GML XML Schema bevat abstracte typen, die in een GML Application Schema worden uitgebreid, en concrete typen die direct kunnen worden gebruikt.
De belangrijkste eisen aan GML Application schema's zijn:
gml:AbstractFeatureType
. gml:AbstractFeatureType
is op zijn beurt een extensie van gml:AbstractFeatureType
. Van dit type erven alle objecten het verplichte gml:id
attribuut.gml:AbstractFeature
(dat wil zeggen: moet zich direct of indirect in de substitutionGroup=”gml:AbstractFeature”
bevinden).gml:AbstractGML
.GOED:
<gml:Integer>5</gml:Integer>
FOUT:
<gml:Integer>
<gml:value>5</gml:value>
</gml:Integer>
gml:id
. Zie ook clause 7.1.3.In deze bijlage wordt aan de hand van een eenvoudig model de relatie tussen een UML een daarvan afgeleid XML Schema en een concreet GML document weergegeven.
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:IMGolf="http://www.geonovum.nl/IMGolf"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0"
elementFormDefault="qualified" targetNamespace="http://www.geonovum.nl/IMGolf"
version="1.0">
<import namespace="http://www.opengis.net/gml/3.2"
schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
<import namespace="http://www.opengis.net/gmlsf/2.0"
schemaLocation="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd"/>
<!--GML Applicatie Schema voor voorbeeld van NEN3610 Versie 1.0 datum 2012-02-20-->
<annotation>
<appinfo source="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd">
<gmlsf:ComplianceLevel>2</gmlsf:ComplianceLevel>
</appinfo>
</annotation>
<element name="FeatureCollectionIMGolf" type="IMGolf:FeatureCollectionIMGolfType"
substitutionGroup="gml:AbstractGML"/>
<complexType name="FeatureCollectionIMGolfType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="featureMember">
<complexType>
<complexContent>
<extension base="gml:AbstractFeatureMemberType">
<sequence>
<element ref="gml:AbstractFeature"/>
</sequence>
</extension>
</complexContent>
</complexType>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<element name="Hole" substitutionGroup="gml:AbstractFeature" type="IMGolf:HoleType"/>
<complexType name="HoleType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="geometrie" type="gml:PointPropertyType"/>
<element name="identificatie" type="IMGolf:NEN3610IDPropertyType"/>
<element name="beginGeldigheid" type="dateTime"/>
<element minOccurs="0" name="eindGeldigheid" type="dateTime"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="HolePropertyType">
<!-- <sequence minOccurs="0">
<element ref="IMGolf:Hole"/>
</sequence>-->
<attributeGroup ref="gml:AssociationAttributeGroup"/>
<attributeGroup ref="gml:OwnershipAttributeGroup"/>
</complexType>
<simpleType name="TypeHindernisType">
<restriction base="string">
<enumeration value="waterpartij"/>
<enumeration value="bunker"/>
</restriction>
</simpleType>
<element name="ToegangGolfbaan" substitutionGroup="gml:AbstractObject"
type="IMGolf:ToegangGolfbaanType"/>
<complexType name="ToegangGolfbaanType">
<sequence>
<element name="alleenVoorLeden" type="boolean"/>
<element minOccurs="0" name="vereisten" type="string"/>
<element minOccurs="0" name="etiquette" type="string"/>
</sequence>
</complexType>
<complexType name="ToegangGolfbaanPropertyType">
<sequence>
<element ref="IMGolf:ToegangGolfbaan"/>
</sequence>
</complexType>
<simpleType name="TypeGolfbaanType">
<restriction base="string">
<enumeration value="linksbaan"/>
<enumeration value="bosbaan"/>
<enumeration value="parkbaan"/>
</restriction>
</simpleType>
<element name="Parcours" substitutionGroup="gml:AbstractFeature"
type="IMGolf:ParcoursType"/>
<complexType name="ParcoursType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="identificatie" type="IMGolf:NEN3610IDPropertyType"/>
<element name="nummer" type="integer"/>
<element name="geometry" type="gml:MultiSurfacePropertyType"/>
<element name="par" type="integer"/>
<element maxOccurs="unbounded" minOccurs="0" name="afslagplaats"
type="IMGolf:TeePropertyType">
<annotation>
<appinfo>
<targetElement
xmlns="http://www.opengis.net/gml/3.2">IMGolf:Tee</targetElement>
</appinfo>
</annotation>
</element>
<element maxOccurs="unbounded" name="parcoursDeel"
type="IMGolf:ParcoursDeelPropertyType">
<annotation>
<appinfo>
<targetElement
xmlns="http://www.opengis.net/gml/3.2">IMGolf:ParcoursDeel</targetElement>
</appinfo>
</annotation>
</element>
<element minOccurs="0" name="hindernis" type="IMGolf:HindernisPropertyType">
<annotation>
<appinfo>
<targetElement
xmlns="http://www.opengis.net/gml/3.2">IMGolf:Hindernis</targetElement>
</appinfo>
</annotation>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="ParcoursPropertyType">
<!--<sequence minOccurs="0">
<element ref="IMGolf:Parcours"/>
</sequence>-->
<attributeGroup ref="gml:AssociationAttributeGroup"/>
<attributeGroup ref="gml:OwnershipAttributeGroup"/>
</complexType>
<element name="ParcoursDeel" substitutionGroup="gml:AbstractFeature"
type="IMGolf:ParcoursDeelType"/>
<complexType name="ParcoursDeelType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="geometry" type="gml:SurfacePropertyType"/>
<element name="identificatie" type="IMGolf:NEN3610IDPropertyType"/>
<element name="TypeParcoursDeel" type="IMGolf:TypeParcoursDeelType"/>
<element name="hole" type="IMGolf:HolePropertyType" minOccurs="0">
<annotation>
<appinfo>
<targetElement
xmlns="http://www.opengis.net/gml/3.2">IMGolf:Hole</targetElement>
</appinfo>
</annotation>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="ParcoursDeelPropertyType">
<!-- <sequence minOccurs="0">
<element ref="IMGolf:ParcoursDeel"/>
</sequence>-->
<attributeGroup ref="gml:AssociationAttributeGroup"/>
<attributeGroup ref="gml:OwnershipAttributeGroup"/>
</complexType>
<element name="Tee" substitutionGroup="gml:AbstractFeature" type="IMGolf:TeeType"/>
<complexType name="TeeType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="geometry" type="gml:SurfacePropertyType"/>
<element name="identificatie" type="IMGolf:NEN3610IDPropertyType"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="TeePropertyType">
<!-- <sequence minOccurs="0">
<element ref="IMGolf:Tee"/>
</sequence>-->
<attributeGroup ref="gml:AssociationAttributeGroup"/>
<attributeGroup ref="gml:OwnershipAttributeGroup"/>
</complexType>
<element name="NEN3610ID" substitutionGroup="gml:AbstractObject"
type="IMGolf:NEN3610IDType"/>
<complexType name="NEN3610IDType">
<sequence>
<element name="namespace" type="string"/>
<element name="lokaalID" type="string"/>
<element minOccurs="0" name="versie" type="string"/>
</sequence>
</complexType>
<complexType name="NEN3610IDPropertyType">
<sequence>
<element ref="IMGolf:NEN3610ID"/>
</sequence>
</complexType>
<simpleType name="TypeParcoursDeelType">
<restriction base="string">
<enumeration value="fairway"/>
<enumeration value="green"/>
<enumeration value="rough"/>
<enumeration value="semi-rough"/>
</restriction>
</simpleType>
<element name="Hindernis" substitutionGroup="gml:AbstractFeature"
type="IMGolf:HindernisType"/>
<complexType name="HindernisType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="geometrie" type="gml:SurfacePropertyType"/>
<element name="identificatie" type="IMGolf:NEN3610IDPropertyType"/>
<element name="typeHindernis" type="IMGolf:TypeHindernisType"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="HindernisPropertyType">
<!-- <sequence minOccurs="0">
<element ref="IMGolf:Hindernis"/>
</sequence>-->
<attributeGroup ref="gml:AssociationAttributeGroup"/>
<attributeGroup ref="gml:OwnershipAttributeGroup"/>
</complexType>
<element name="Golfbaan" substitutionGroup="gml:AbstractFeature"
type="IMGolf:GolfbaanType"/>
<complexType name="GolfbaanType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="geometry" type="gml:MultiSurfacePropertyType"/>
<element name="naam" type="string"/>
<element name="typeGolfbaan" type="IMGolf:TypeGolfbaanType"/>
<element name="toegang" type="IMGolf:ToegangGolfbaanPropertyType"/>
<element name="identificatie" type="IMGolf:NEN3610IDPropertyType"/>
<element maxOccurs="unbounded" minOccurs="0" name="hole"
type="IMGolf:ParcoursPropertyType">
<annotation>
<appinfo>
<targetElement
xmlns="http://www.opengis.net/gml/3.2">IMGolf:Parcours</targetElement>
</appinfo>
</annotation>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GolfbaanPropertyType">
<attributeGroup ref="gml:AssociationAttributeGroup"/>
<attributeGroup ref="gml:OwnershipAttributeGroup"/>
<sequence minOccurs="0">
<element ref="IMGolf:Golfbaan"/>
</sequence>
</complexType>
</schema>
<?xml version="1.0" encoding="UTF-8"?>
<FeatureCollectionIMGolf xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns="http://www.geonovum.nl/IMGolf" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.geonovum.nl/IMGolf IMGolf.xsd" gml:id="ID001">
<gml:boundedBy>
<gml:Envelope srsDimension="2" srsName="urn:opengis:def:crs:EPSG::xxxxx">
<gml:lowerCorner>10 10</gml:lowerCorner>
<gml:upperCorner>20 20</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<featureMember>
<Golfbaan gml:id="G11">
<geometry>
<gml:MultiSurface gml:id="x00">
<gml:surfaceMember>
<gml:Polygon gml:id="x2">
<gml:exterior>
<gml:LinearRing>
<gml:posList>10 10 20 10 20 20 10 20 10 10</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</geometry>
<naam>Openbare golfbaan Westlaren</naam>
<typeGolfbaan>bosbaan</typeGolfbaan>
<toegang>
<ToegangGolfbaan>
<alleenVoorLeden>false</alleenVoorLeden>
</ToegangGolfbaan>
</toegang>
<identificatie>
<NEN3610ID>
<namespace>NL.IMGOLF</namespace>
<lokaalID>G1</lokaalID>
</NEN3610ID>
</identificatie>
<hole xlink:href="#Hin1v1"/>
</Golfbaan>
</featureMember>
<featureMember>
<Parcours gml:id="Hin1v1">
<identificatie>
<NEN3610ID>
<namespace>NL.IMGOLF</namespace>
<lokaalID>Hin1</lokaalID>
<versie>1</versie>
</NEN3610ID>
</identificatie>
<nummer>1</nummer>
<geometry>
<gml:MultiSurface gml:id="x01">
<gml:surfaceMember>
<gml:Polygon gml:id="x3">
<gml:exterior>
<gml:LinearRing>
<gml:posList>11 11 15 11 15 19 11 19 11 11</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</geometry>
<par>5</par>
<afslagplaats xlink:href="#t01"/>
<parcoursDeel xlink:href="#pd01"/>
<parcoursDeel xlink:href="pd02"/>
</Parcours>
</featureMember>
<featureMember>
<Tee gml:id="t01">
<geometry>
<gml:Polygon gml:id="x4">
<gml:exterior>
<gml:LinearRing>
<gml:posList>12 12 14 12 14 13 12 13 12 12</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</geometry>
<identificatie>
<NEN3610ID>
<namespace>NL.IMGOLF</namespace>
<lokaalID>t01</lokaalID>
</NEN3610ID>
</identificatie>
</Tee>
</featureMember>
<featureMember>
<ParcoursDeel gml:id="pd01">
<geometry>
<gml:Polygon gml:id="x06">
<gml:exterior>
<gml:LinearRing>
<gml:posList>12 13 14 13 14 17 12 17 12 13</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</geometry>
<identificatie>
<NEN3610ID>
<namespace>NL.IMGOLF</namespace>
<lokaalID>pd01</lokaalID>
</NEN3610ID>
</identificatie>
<TypeParcoursDeel>fairway</TypeParcoursDeel>
</ParcoursDeel>
</featureMember>
<featureMember>
<ParcoursDeel gml:id="pd02">
<geometry>
<gml:Polygon gml:id="x07">
<gml:exterior>
<gml:LinearRing>
<gml:posList>12 17 14 17 14 18.5 12 18.5 12 17</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</geometry>
<identificatie>
<NEN3610ID>
<namespace>NL.IMGOLF</namespace>
<lokaalID>pd01</lokaalID>
</NEN3610ID>
</identificatie>
<TypeParcoursDeel>green</TypeParcoursDeel>
<hole xlink:href="#h01"/>
</ParcoursDeel>
</featureMember>
<featureMember>
<Hole gml:id="h01">
<geometrie>
<gml:Point gml:id="x5">
<gml:pos>13 18</gml:pos>
</gml:Point>
</geometrie>
<identificatie>
<NEN3610ID>
<namespace>NL.IMGOLF</namespace>
<lokaalID>h01</lokaalID>
</NEN3610ID>
</identificatie>
<beginGeldigheid>2011-12-01T00:00:00</beginGeldigheid>
</Hole>
</featureMember>
</FeatureCollectionIMGolf>
In deze bijlage wordt ingegaan op de verschillen tussen de GML versies 3.2.1 en 3.1.1.
In de praktijk zijn er momenteel drie versies van GML in gebruik:
GML 3.3 is op het moment van schrijven net uitgekomen (begin 2012). Deze versie is volledig backwards compatible met GML 3.2.1 en bestaat uit enkele uitbreidingen die in nieuwe namespaces zijn gedefinieerd. GML 3.3 wordt hier verder buiten beschouwing gelaten.
In Nederland is tot nu toe met name gestandaardiseerd op GML 3.1.1. De overstap naar GML 3.2.1 wordt pas de laatste tijd gemaakt, omdat eerder deze versie nog niet altijd ondersteund werd door software applicaties. Sommige nieuwe standaarden maken nog steeds gebruik van GML 3.1.1: dit geldt bijvoorbeeld voor IMGeo 2.0 vanwege de aansluiting met CityGML (een OGC standaard voor 3D geo-informatie), waarin een afhankelijkheid met GML 3.1.1 zit.
Dit appendix beschrijft de verschillen tussen 3.1.1 en 3.2.1, zodat:
Alleen de verschillen die GML onderdelen raken die in Nederland waarschijnlijk of mogelijk gebruikt worden, zijn hier opgesomd. Een volledige beschrijving van de verschillen is te vinden in de officiële Revision Notes voor GML 3.2.1 (OGC documentnummer 07-061) , of in het hierop gebaseerde document Analysis of changes between GML 3.1.1 and GML 3.2.1, te vinden op de website van Geonovum.
Hieronder volgt een opsomming en beschrijving van de belangrijkste verschillen.
Vanaf GML 3.2.1 moet een GML application schema het volledige GML schema importeren. In GML 3.1.1 was het nog toegestaan een gestript GML schema te importeren. Dit onderwerp is al behandeld in paragraaf 3.7.
De XML namespace van het GML schema ("http://www.opengis.net/gml
") is gewijzigd naar "http://www.opengis.net/gml/3.2
".
Dit betekent dat alle componenten van GML nu in een andere namespace staan en dus andere componenten zijn.
De "_" (underscore) in element namen om aan te geven dat ze abstract zijn, is vervangen door het beginnen van de naam met "Abstract".
Dit betekent dat bijvoorbeeld het GML element _Feature
is hernoemd naar AbstractFeature
.
GML objecten hebben identiteit en daarom is het attribuut gml:id
verplicht geworden. Ook geometrieën zoals gml:Point
, gml:Curve
en gml:Surface
worden in GML gezien als objecten en krijgen nu een verplicht gml:id
.
Gevolgen:
gml:id
aanmaken, met een binnen het document unieke waarde, voor elk GML object. In GML 3.1.1 hoefde dit niet en vaak werd dit dan ook niet gedaan voor objecten waarnaar niet werd verwezen, bijvoorbeeld voor een geometrie object binnen een feature.gml:id
had, er een toevoegen met een unieke waarde. Dit kan geautomatiseerd gedaan worden.Aanbeveling: wie nu nog GML 3.1.1 gebruikt maar binnen afzienbare tijd naar GML 3.2.1 (of GML 3.3) wil overstappen, kan het beste vast beginnen het gml:id
overal op te nemen waar dit in GML 3.2.1 verplicht wordt.
Alle in GML 3.1.1 aanwezige collection typen, inclusief die voor feature collections, zijn geschrapt. Het is nu de bedoeling date en GML application schema zelf een collection definieert als dit nodig is, met als basis de nieuwe typen gml:AbstractMemberType
en gml:AbstractFeatureMemberType
.
Dit heeft gevolgen voor alle GML toepassingen die collecties gebruiken. Zowel de software die collecties maakt of leest, als het GML applicatie schema en GML documenten moeten worden aangepast.
Een aantal van de normatieve verwijzingen naar aan GML gerelateerde standaard documenten verwijzen nu naar een nieuwere versie daarvan. Hiervan zijn er slechts drie mogelijk relevant voor NEN 3610 gebruikers:
gml:_MetaData
en gml:metaDataProperty
zijn geschrapt en vervangen door een abstract property type als basis waarop men eigen metadata eigenschappen kan definiëren. Men kan nu daardoor in het eigen GML applicatie schema afdwingen dat metadata wordt ingevuld. Door het eigen metadata element af te leiden van het daarvoor bestemde abstracte GML element kan software de metadata herkennen.
Gevolgen als deze GML 3.1.1 elementen gebruikt werden:
gml:name
en gebruiken nu dus gml:CodeType
als type.gml:axisName
> gml:axisLabel
gml:fileName
> gml:fileReference
gml:SequenceRulesNames
> gml:SequenceRuleEnumeration
.gml:StringOrRefType
is geschrapt. Eigenschappen die een string of een verwijzing als inhoud hebben worden nu gecodeerd als twee aparte eigenschappen in plaats van één.Gml:Envelope
is expliciet gedefinieerd als zijnde geen geometrie door het in de substitutionGroup AbstractObject
te zetten.gml:CircleByCenterPointType
is nu gedefinieerd als een restriction van
ArcByCenterPointType
.gml:Shell
is toegevoegd als implementatie van ISO geometrietype GM_Shell
.interpolationType
attribuut ontbrak op sommige segment typen en is daar toegevoegd.De verwijzing in GML naar het gebruikte coördinaatreferentiesysteem (CRS) wordt meestal gedaan door de URN of EPSG code te gebruiken waaronder het bekend staat. Het is echter ook mogelijk de CRS expliciet te definiëren in een GML dictionary. Wie dit in GML 3.1.1 heeft gedaan, krijgt te maken met een wijziging die niet backwards compatible is.
De encoding is ingrijpend gewijzigd om te voldoen aan ISO 19111:2007 en de GML coderingsconventies.
Het weglaten van een kenmerk (middels minOccurs=”0”
in het schema) is niet hetzelfde als Void zoals gedefinieerd in ISO/IEC 11404:1996. GML 3.2.1 is aangepast om Void correct te implementeren:
xsi:nil
moet worden gebruikt als implementatie van Void.Gml:Null
is geschrapt.gml:NilReasonType
is toegevoegd voor het kunnen opnemen van metadata over de reden van een ontbrekende waarde.Dit heeft gevolgen voor GML application schemas die gebruik maakten van gml:Null
of een eigen implementatie van Void hanteerden. Het GML application schema, GML documenten en software die het GML application schema ondersteunt, moeten aangepast worden.