JHS 162 Paikkatietojen mallintaminen tiedonsiirtoa varten

Liite 3 GML-mallinnus

  • Versio: 2.0
  • Julkaistu: 31.10.2011
  • Voimassaoloaika: toistaiseksi

1 Johdanto

Geography Markup Language (GML) on alun perin OGC:n piirissä kehitetty XML-pohjainen paikkatietojen mallintamis- ja koodaustapa. OGC:n ja ISO TC211:n yhteistyönä toteutetun editointiprosessin tuloksena on GML -kielestä valmistunut myös ISO-standardi (SFS-EN ISO 19136). Tämän suosituksen pohjana on ko. GML:n yhteisstandardin versionumero 3.2.1.

GML perustuu yksinkertaiseen kohdepohjaiseen tietomalliin, joka on konkreettinen implementaatio ISO 19109 -standardin määrittelemästä General Feature Model (GFM) -kohdemallista. Koska GML pohjautuu XML-syntaksin mukaisten rakenne-elementtien käyttämiseen tiedon koodaamisessa, asettaa tämä tiettyjä rajaavia reunaehtoja GFM:n implementaatiolle. Nämä rajoitukset käyvät ilmi seuraavassa tarkastelussa.

GML voidaan nähdä ISO:n yleisen paikkatietojen koodausstandardin (SFS-EN ISO 19118 Geographic Information - Encoding) profiilina. Encoding-standardi asettaa yleisluonteisia sääntöjä paikkatietojen koodaamisesta XML-syntaksin mukaisena rakenteena. GML määrittelee konkreettisen implementaation, joka on yhteensopiva näiden sääntöjen kanssa.

GML määrittelee ainakin osittaisen XML-pohjaisen implementaation mm. seuraavista ISO–standardeista: ISO/TS 19103 Conceptual schema language, SFS-EN ISO 19107 Spatial schema, SFS-EN ISO 19108 Temporal schema, SFS-EN ISO 19109 Rules for application schemas, SFS-EN ISO 19111 Spatial referencing by coordinates ja SFS-EN ISO 19123 Schema for coverage geometry and functions. GML on siis muodostunut hyvin keskeiseksi tekijäksi käsitteellisellä tasolla määriteltyjen ISO-standardien käytännöllisen implementoinnin kannalta.

Tässä suosituksessa käydään läpi vain ne osuudet GML-kielestä, jotka implementoivat GFM:n määrittämiä mallintamisen peruskäsitteitä. Täten tarkastelun ulkopuolelle jäävät mm. koordinaattijärjestelmien määrittelyyn, eksplisiittiseen topologian osoittamiseen, ajan ilmaisemiseen ja havaintojen käsittelyyn tarkoitetut kielen rakenteet. Nämä osat jäävät muutoinkin suosituksen ulkopuolelle, koska lähtökohdaksi otetaan pitäytyminen GML:n ns. Simple Features -profiilin mukaiseen kokonaisuuteen.

2 Yleistä

GML on XML-sovellus, joka on formaalisti määritelty XML Scheman avulla. Koska GML perustuu XML Scheman soveltamiseen tietomallinnuksen työvälineenä, edellyttää GML:n ominaisuuksiin tutustuminen kohtuullista tietämystä XML Scheman periaatteista. Tämä JHS-suositus ei pyri antamaan perustietoja XML Schema -kielestä. Tärkeimmät kielen piirteet käyvät ilmi W3C:n johdantodokumentista XML Schema Primer.

GML:n perusskeemat määrittelevät laajan joukon yleisluontoisia paikkatietoihin liittyviä tietorakenteita, joita voidaan käyttää sellaisenaan. Erilaisten paikkatietoaineistojen tietosisällöt muodostavat kuitenkin niin kirjavan ja monitahoisen kokonaisuuden, että GML ei edes pyri esittelemään konkreettisia kohdetyyppejä, kuten ’Rakennus’, ’Tie’ tai ’Jarvi’. Nämä tulee sen sijaan aina määritellä tiettyä aineistoa tai käyttötarkoitusta palvelevassa paikallisessa XML Schemassa, jota kutsutaan GML-sovellusskeemaksi (GML Application Schema). Paikallisen skeeman skeematiedostot muodostavat yhdessä GML:n perusskeemojen kanssa kokonaisuuden, jonka pohjalta sovellusskeema tulee määritellyksi ja sitä vastaava datatiedosto voidaan validoida.

GML määrittelee abstraktin perustyypin ’AbstractFeatureType’, josta kaikkien sovellusskeeman kohdetyyppien tulee periytyä joko suoraan tai jonkin toisen kohdetyypin välityksellä. Lisäksi GML antaa joukon ohjeita, joita tulee noudattaa paikallisia kohdetyyppejä määriteltäessä (Rules for Application Schema). Seuraavaan listaan on koottu joukko keskeisiä yleisohjeita sovellusskeemojen laatimisesta.

  • GML:n perusskeemoissa esiteltyjä yksinkertaisia (<simpleType>) ja rakenteisia (<complexType>) tietotyyppejä voidaan sellaisenaan käyttää sovellusskeemassa esiteltävien elementtien tyyppeinä.
  • Sovellusskeemassa voidaan esitellä uusia tietotyyppejä, jotka periytyvät vastaavista GML:n perustyypeistä joko laajentavan (<extension>) tai rajoittavan (<restriction>) perintämekanismin välityksellä.
  • Kaikki kohdetyypit periytyvät suoraan tai jonkin toisen kohdetyypin välityksellä abstraktista perustyypistä ’gml:AbstractFeatureType’.
  • Kaikki paikallisessa skeemassa esitellyt tietorakenteet kuuluvat paikalliseen XML-nimiavaruuteen, jonka tulee olla muu kuin GML:n perusnimiavaruus (http://www.opengis.net/gml/3.2).
  • Paikallisen sovellusskeeman tulee liittää mukaan (<import>) koko GML-skeema. Mahdollisesti käytetty GML:n profiili voidaan osoittaa rakenteella ’schema/annotation/appInfo/gml:gmlProfileSchema’ (kts. GML 3.2.1 luku 20.5).
  • Kohdeluokka esitellään XML-elementtinä (<element>) ja kohdeluokan ominaisuudet esitellään tämän elementin lapsielementteinä; elementtien nimeksi annetaan ko. kohdeluokan tai ominaisuuden nimi.
  • Kaikki kohdeluokkia vastaavat elementit esitellään ns. globaaleina elementteinä, eli niiden esittelyn (<element>) tulee olla skeeman juurielementin (<schema>) välittömiä lapsielementtejä.
  • Elementin tyyppi voidaan ilmaista paikallisesti (sisäinen <simpleType> tai <complexType> -rakenne) tai viittauksena nimettyyn globaaliin tyyppiin (skeeman juurielementin lapsielementtinä oleva <simpleType> tai <complexType> -rakenne).
  • Kaikkien kohdeluokkia vastaavien elementtien tulee olla perintäryhmässä, jonka pää (head) on GML:n abstrakti elementti ’gml:AbstractFeature’ tai jokin tästä elementistä periytyvä sovellusskeeman elementti (osoitetaan ’substitutionGroup’ -attribuutilla). Kaikkien muiden paikallisessa sovellusskeemassa esiteltävien objektien tulee olla perintäryhmässä ’gml:AbstractGML’.
  • Ominaisuuksien toistuvuus osoitetaan skeemassa attribuuteilla ’minOccurs’ ja ’maxOccurs’; molempien attribuuttien oletusarvo on ’1’ (esim. valinnainen ominaisuus osoitetaan kirjoittamalla: minOccurs=”0”).
  • Kohdeluokan sijaintiominaisuuden tyyppinä on jokin GML:n perusgeometriatyypeistä tai näistä paikallisessa sovellusskeemassa periytetty tyyppi.
  • Elementtejä ja elementtityyppejä nimettäessä tulee huomioida seuraavat suositukset:
  • Kohdeluokkia vastaavien elementtien nimet kirjoitetaan isolla alkukirjaimella.
  • Ominaisuuksia vastaavien elementtien nimet kirjoitetaan pienellä alkukirjaimella.
  • Useasta sanasta koostuvat nimet kirjoitetaan yhteen, aloittaen kaikki ensimmäisen sanan jälkeen tulevat sanat isolla alkukirjaimella.
  • Kohdetyypin nimi muodostetaan lisäämällä luokan nimeen ’Type’, esim. ’MeriType’.
  • Abstraktien elementtien ja tyyppien nimen eteen lisätään ’Abstract’, esim. ’AbstractVesisto’.

3 GML-kohdemalli

3.1 Objekti/ominaisuus -rakenne

GML:n tietomalli sisältää vain kaksi peruskäsitettä: objekti ja ominaisuus. Objekti (object) voi olla mikä tahansa mallissa kuvattava, identifioitavissa oleva tietoyksikkö. Objekti koostuu joukosta ominaisuuksia (property), jotka luonnehtivat tai kuvaavat objektia. Kohde (feature) on sellainen objekti, joka vastaa yksilöitävissä olevaa reaalimaailman abstraktia tai konkreettista asiaa tai ilmiötä.

GML:n perusskeema ei sisällä konkreettisia kohdetyyppejä – ne määritellään aina paikallisessa sovellusskeemassa. GML määrittelee kuitenkin runsaasti muita objekteja, joita voidaan sellaisenaan hyödyntää sovellusskeemassa. Esimerkiksi kohteisiin liittyvä geometria mallinnetaan objekteina, mm. ’Point’, ’LineString’ ja ’Polygon’. Aineistokohtaisessa sovellusskeemassa määritellään kohteiden lisäksi muut tarvittavat objektit. Kaikki sovellusskeemassa määritellyt objektit tulee soveltuvin osin periyttää GML:n perusobjekteista.

Objektit ja ominaisuudet muodostavat GML:n tietomallissa vuorottelevan rakenteen. Perussäännön mukaisesti objektit koostuvat joukosta ominaisuuksia. Ominaisuudet jakautuvat kahteen pääryhmään: yksinkertaiset ominaisuudet ja rakenteiset ominaisuudet. Yksinkertaisen ominaisuuden arvona on merkkijono (joka voi myös vastata numeerista arvoa). Rakenteisen ominaisuuden arvona on objekti. Tämä objekti koostuu taas joukosta ominaisuuksia. Näin muodostuu tietorakenne, jossa objektit ja ominaisuudet vuorottelevat hierarkiarakenteessa ylös- tai alaspäin liikuttaessa.

GML:n XML-pohjaisessa koodauksessa objekti mallinnetaan XML-elementtinä, jonka nimenä on objektiluokan nimi. Kaikki objektiin liittyvät ominaisuudet esitetään tämän elementin lapsielementteinä. Yksinkertaisen ominaisuuden osalta elementin sisältönä on merkkijonolla ilmaistu arvo. Rakenteisen ominaisuuden osalta taas elementin sisällä on ko. objektia kuvaava XML-elementtirakenne.

3.2 Kohde

Keskeinen periaate GML:n kohdemallissa on se, että kohteet koostuvat joukosta ominaisuuksia. Kuten muillakin GML:n objekteilla, kohteen ominaisuudet jakautuvat kahteen pääryhmään: yksinkertaiset ominaisuudet ja rakenteiset ominaisuudet. Tärkeä alatyyppi rakenteisista ominaisuuksista on sijaintiominaisuus, jonka arvona on jokin GML:ssä määritellyistä geometriaobjekteista tai näistä paikallisessa skeemassa periytetty objekti. GML sisältää myös erityisen metatieto-ominaisuustyypin 'AbstractMetadataPropertyType', josta periyttämällä voidaan kohteille määritellä metadataan liittyviä ominaisuuksia.

Esimerkki 1. UML-kaaviossa esitetyn kohdeluokan 'Meri' XML Schema -muodossa kuvattu GML -sovellusskeema ja GML-koodattu esimerkki mahdollisesta vastaavasta kohdeinstanssista.

Liite3_Kuva1

Ote skeemasta:

<xsd:complexType name="VesistoType">

  <xsd:complexContent>

     <xsd:extension base="gml:AbstractFeatureType">

       <xsd:sequence>

         <xsd:element name="nimi" type="xsd:string"/>

       </xsd:sequence>

    </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="VesialueType">

   <xsd:complexContent>

    <xsd:extension base="oma:VesistoType">

       <xsd:sequence>

         <xsd:element name="pintaAla" type="xsd:double" minOccurs="0"/>

        <xsd:element name="sijainti" ref="gml:SurfacePropertyType"/>

      </xsd:sequence>

    </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="MeriType">

  <xsd:complexContent>

    <xsd:extension base="oma:VesialueType">

      <xsd:sequence>

        <xsd:element name="suolaisuus" type="xsd:double"/>

      </xsd:sequence>

    </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:element name="Meri" type="oma:MeriType"

          substitutionGroup="gml:AbstractFeature"/>

Esimerkki kohdeinstanssista:

<Meri>

  <nimi>Itämeri</nimi>

    <pinta-ala>123.456</pinta-ala>

     <sijainti>

       <gml:Polygon>

        <gml:exterior>

          <gml:LinearRing>

            <gml:posList>...</gml:posList>

          </gml:LinearRing>

        </gml:exterior>

      </gml:Polygon>

     </sijainti>

  <suolaisuus>1.234</suolaisuus>

</Meri>

GML-konvention mukaisesti objektien nimiä vastaavat elementit kirjoitetaan isolla alkukirjaimella. Kaikki ominaisuuksia vastaavat elementtinimet alkavat pienellä kirjaimella. Ominaisuudelle 'pintaAla' määritelty vapaaehtoisuus ([0..1] UML-kaaviossa) näkyy XML Schemassa vastaavana attribuuttina (minOccurs="0").

Koska sovellusskeemassa määritellyt kohdeluokat periytetään GML:n abstraktista perustyypistä ('gml:AbsractFeatureType'), periytyvät tälle kantaluokalle määritellyt ominaisuudet myös kaikille uusille kohdeluokille. Nämä ominaisuudet ja niiden käyttötarkoitus on listattu seuraavassa.

Määritelty kantatyypissä 'AbstractGMLType' (periytyvät kaikille objekteille):

  • description: sanallinen kohteen kuvailu
  • descriptionReference: viittaus muualla annettuun kohteen sanalliseen kuvailuun, osoitetaan Xlink-viittauksella
  • identifier: kohteen yksikäsitteinen identifiointitunnus
  • name: kohteen nimi
  • id: elementin yksikäsitteinen tunniste XML-tiedoston sisällä; XML-tyyppiä ID.

Määritelty kantatyypissä 'AbtractFeatureType' (periytyvät vai kohteille):

  • boundedBy : koko kohteen geometrian kattava suorakaide, käytetään erityisesti spatiaalisissa indeksoinneissa (vapaaehtoinen kohteelle).

3.3 Kohdejoukko

GML:n kohdemalli sisältää myös GFM:n mukaisen kompleksisen kohteen implementaation. GML määrittelee käsitteen kohdejoukko (Feature Collection). Ainakin yksi kohdejoukko on aina määriteltävä GML-sovellusskeemassa, koska XML-tietorakenteessa on aina oltava yksi juurielementti. Jotta useamman kohteen siirtäminen yhdessä XML-viestissä olisi mahdollista, tarvitaan nämä yksittäiset kohteet sisäänsä sulkeva elementti, eli siis kohdejoukko.

Kohdejoukko on itsessään myöskin kohde. Näin ollen kohdejoukkoon voidaan liittää koko joukkoa kuvaavia ominaisuuksia aivan samalla tavoin kuin yksittäiseen kohteeseenkin. Myös kohdejoukon luokka periytyy GML-abstraktista kohdeluokasta 'gml:AbstractFeatureType". Tunnusomainen piirre kohdejoukolle on kuitenkin se, että sillä on ominaisuus, joka periytyy GML:n perustyypistä 'gml:AbstractFeatureMemberType'. Tällainen ominaisuus on rakenteinen ja se sisältää kohteen. Ominaisuuden määrittelyssä voidaan rajata joukkoon sallittujen kohteiden tyyppiä.

Esimerkki 2. XML Schema –pohjainen määrittely kohdejoukosta, joka on rajattu vain vesistökohteille, sekä GML-koodattu esimerkki mahdollisesta vastaavasta kohdeinstanssista.

Ote skeemasta:

<xsd:element name="AbstractVesisto" type="oma:VesistoType"

        abstract="true" substitutionGroup="gml:AbstractFeature"/>

<xsd:element name="Meri" type="MeriType"

        substitutionGroup="oma:AbstractVesisto"/>

<xsd:complexType name="VesistoKohdejoukkoType">

  <xsd:complexContent>

     <xsd:extension base="gml:AbstractFeatureType">

      <xsd:sequence>

         <xsd:element name="pvm" type="xsd:date"/>

        <xsd:element name="vesistoKohde" maxOccurs="unbounded"

                 type="oma:VesistoKohdePropertyType"/>

       </xsd:sequence>

     </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="VesistoKohdePropertyType">

  <xsd:complexContent>

    <xsd:extension base="gml:AbstractFeatureMemberType">

      <xsd:sequence>

        <xsd:element ref="oma:AbstractVesisto"/>

      </xsd:sequence>

      <xsd:attributeGroup ref="gml:AssociationAttributeGroup"/>

    </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:element name="VesistoKohdejoukko" type="VesistoKohdejoukkoType"

substitutionGroup="gml:AbstractFeature"/>

Esimerkki kohdeinstanssista:

<VesistoKohdejoukko>

   <pvm>2005-05-09</pvm>

  <vesistoKohde>

    <Meri>...</Meri>

  </vesistoKohde>

  <vesistoKohde>

    <Meri>...</Meri>

  </vesistoKohde>

...

</VesistoKohdejoukko>

Sovellusskeema esittelee abstraktin kohdeluokan 'AbstractVesisto'. Kaikki ne kohdeluokat, jotka halutaan sallia mukaan kohdejoukkoon, liitetään tämän abstraktin kohdeluokan määrittämään perintäryhmään (attribuutilla 'substitutionGroup'). Kun sitten kohdejoukon määrittelyssä otetaan käyttöön rakenteinen ominaisuus ('vesistoKohde'), jonka tyyppi periytyy GML:n kantatyypistä 'gml:AbstractFeatureMemberType' ja jolle sallitaan arvoksi määritetty abstrakti luokka ('AbstractVesisto'), on haluttu rajaus kohdejoukkoon sallittavista kohdeluokista tehty. Koko kohdejoukkoa kuvaavana ominaisuutena on skeemassa mukana ominaisuus 'pvm'.

Kohdejoukon ominaisuudelle, jonka arvona on kohde (edellisen esimerkin ’vesistoKohde’), periytyy abstraktista perustyypistä ’gml:AbstractFeatureMemberType’ myös totuusarvoinen attribuutti ’owns’. Tällä attribuutilla voidaan instanssitasolla osoittaa, omistaako kohdejoukko ao. kohteen vai ei. Jos attribuutilla on arvo ’true’, kyseessä on kohdejoukon ja kohteen välinen komposiittisuhde. Jos attribuutilla taas on arvo ’false’, edustaa kyseinen ominaisuus aggregaattisuhdetta kohdejoukon ja kohteen välillä.

3.4 Kohdeluokkien välinen perintähierarkia

Koska GML on määritelty XML Schema -dokumentin muodossa, asettavat XML Schema -kielen periaatteet omat reunaehtonsa GML:n tietomallille. XML Schema ei tue moniperintää ja sen myötä GML ei myöskään salli kohdeluokan periytyvän useammasta kuin yhdestä kantaluokasta. XML Schema tukee kahta erityyppistä perintämekanismia, laajentavaa (extension) ja rajoittavaa (restriction) perintää. Laajentava toimii perinteisen objektiorientoituneen mallinnuksen periaatteiden mukaisesti: kaikki kantaluokalle määritellyt ominaisuudet periytyvät myös aliluokalle, joka voi tarpeen mukaan laajentaa määrittelyä lisäämällä uusia ominaisuuksia luokkaan.

Rajoittava perintä puolestaan toimii niin, että kantaluokasta ei periydy mitään ominaisuuksia, vaan ne määritellään uudelleen aliluokassa. Samalla mallin rajausta voidaan tiukentaa tarkasti määriteltyjen sääntöjen mukaisesti (esim. vapaaehtoisista elementeistä voidaan tehdä pakollisia ja tyypitettyjen arvojen arvoalueita rajoittaa lisää). Se objektiorientoituneen perinnän perusperiaate, että aliluokan kohde voi aina esiintyä kantaluokan kohteen asemesta, on näin voimassa myös rajoittavan perinnän tapauksessa.

Esimerkki 3. Osa kuvassa esitetyn UML-luokkakaavion mukaisen perintähierarkian toteutuksesta XML Schema -rakenteina.

Liite3_Kuva2

Ote skeemasta:

<xsd:complexType name="VesistoType">

  <xsd:complexContent>

    <xsd:extension base="gml:AbstractFeatureType">...</extension>

   </xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="VesialueType">

  <xsd:complexContent>

    <xsd:extension base="oma:VesistoType">...</extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="MeriType">

  <xsd:complexContent>

    <xsd:extension base="oma:VesialueType">...</extension>

  </xsd:complexContent>

</xsd:complexType>

<xsd:element name="Meri" type="oma:MeriType"

         substitutionGroup="gml:AbstractFeature"/>

Nimiavaruuslyhenne 'oma' viittaa paikalliseen laadittavaan sovellusskeemaan ja lyhenne 'gml' GML:n määrittelyskeemaan. Kohdeluokkien tyyppiniminä käytetään GML-vakiokäytännön mukaisesti tunnuksia, joissa luokan nimeen on lisätty merkkijono 'Type'. Abstraktien kohdeluokkien ja tyyppien nimissä on GML-käytännön mukaan lisätty alkuun merkkijono 'Abstract'. Konkreettinen XML-elementti, jolla kohdetyypin kohteita koodataan, on esitelty XML Schema -rakenteella 'element'. Tässä annetaan myös tieto siitä, mihin perintäryhmään kohdeluokka kuuluu (attribuutti 'substitutionGroup').

3.5 Kohteiden väliset suhteet

Kohteiden välinen suhde ('GF_AssociationType') on keskeinen käsite GFM:ssa. GML implementoi viittauksen objektista toiseen objektiin käyttäen hyväksi W3C:n määrittelemää linkkimekanismia (XLink). Itse asiassa kaikki GML-sovellusskeemassa määritellyt ominaisuudet voivat olla joko paikallisia (inline) tai viitattuja (by-reference). Viittaus ominaisuuselementin ulkopuolella annettuun ominaisuuden arvoon tehdään käyttäen hyväksi XLink-mekanismin mukaista attribuuttia 'xlinks:href'.

Kahden objektin välinen suhde voidaan mallintaa GML:ssa kohdeluokan nimetyllä ominaisuudella (suhderooli), joka sisältää mahdollisuuden viitata suhteen toisena osapuolena olevaan kohteeseen 'xlinks:href' -attribuutin avulla. Tällainen suhdeviittaus on lähtökohtaisesti yksisuuntainen. Vastakkaissuuntainen suhde mallinnetaan omana, päinvastaiseen suuntaan määriteltynä suhderoolinaan.

Esimerkki 4. XLink-mekanismilla osoitettu kohteiden välinen kaksisuuntainen suhde.

<Meri id="m1">

...

  <syottoUoma xlinks:href="#j1"/>

</Meri>

<Joki id="j1">

...

  <purkuAllas xlinks:href="#m1"/>

</Joki>

Myös kohdejoukko voidaan muodostaa XLink-viittauksilla joukkoon kuuluviin kohteisiin. Viittaukset ilmaisevat tällöin koostesuhdetta kohdejoukon ja kohteiden välillä.

Esimerkki 5. Kohdejoukko koostettuna XLink-viittauksilla.

<VesistoKohdejoukko>

  <pvm>2005-05-09</pvm>

  <vesistoKohde xlink:href="Meret.xml#m1"/>

  <vesistoKohde xlink:href="Joet.xml#j1"/>

...

</VesistoKohdejoukko>

Paitsi paikallisena ominaisuutena, kohteiden välinen suhde voidaan koodata myös omana kohdeluokkanaan. Kohdeluokkana mallinnettava suhde implementoidaan kuten mikä tahansa kohdeluokka; sillä voi siis olla myös omia ominaisuuksia. Oleellinen piirre tällaisessa luokassa on se, että se sisältää suhderooliviittaukset niihin kohdeluokkiin, joiden välistä suhdetta se mallintaa. Nämä suhderoolit näkyvät ao. luokan paikallisina ominaisuuksina. Suhteeseen osallistuvat kohdeluokat puolestaan sisältävät suhderooliviittauksen suhdetta mallintavaan kohdeluokkaan. Yksisuuntaisen suhteen tapauksessa nämä viittaukset kulkevat vain suhteen mukaiseen suuntaan.

4 GML Simple Features -profiili

4.1 Yleistä

GML on kehityksensä aikana paisunut varsin laajaksi ja vaikeasti hallittavaksi kokonaisuudeksi. Tämä nostaa luonnollisesti standardin käyttöönottokynnyksen korkeaksi. Kaikkien kielen piirteiden tukemisesta palveluissa ja sovelluksissa on muodostunut kohtuuttoman haasteellinen tehtävä. Niinpä GML:stä on laadittu jo useitakin eri käyttötarkoituksiin suunnattuja osajoukkoja, profiileja. Paikkatietopalveluissa käytettäväksi yksinkertaiseksi perusprofiiliksi on kehitetty GML Simple Features -profiili 2.0 (OGC 10-100r2).

GML Simple Features -profiili määrittelee yksityiskohtaiset ohjeet siitä, mitä XML Schema -rakenteita GML-sovellusskeeman määrittelyssä voidaan käyttää ja toisaalta mitä osajoukkoa GML 3.2.1 -versiossa määritellyistä tietotyypeistä näissä skeemoissa voidaan soveltaa. Näin profiili muodostaa osajoukon sekä XML Scheman että GML:n tietotyyppien osalta.

Profiilissa määritellään kolme yhteensopivuustasoa (0, 1 ja 2), jotka muodostavat asteittain laajenevan osajoukon GML 3.2.1 -version sisällöstä (taso 0 on yksinkertaisin ja rajoittunein, 1 ja 2 tätä laajempia). Yhteensopivuustaso 2 vastaa standardin ISO 19125-2:2004 Simple feature access – Part 1: Common Architecture mukaista laajuutta.

4.2 Yhteensopivuustasot

Yhteensopivuustaso SF-0

Tässä GML:n profiilissa kaikki kohteiden ei-sijainnilliset ominaisuudet rajataan seuraaviin perustietotyyppeihin: kokonaisluku (integer), mittaluku (measurement), päiväys (date), totuusarvo (boolean), binääriluku (binary), URI, merkkijono (character), reaaliluku (real). Mittaustulos ilmoitetaan double-tyyppisessä elementissä, jolle annetaan käytetyn mittayksikön osoittava lisätieto 'uom' -nimisenä attribuuttina. Näin SF-0-profiili rajaa pois rakenteisten ominaisuuksien käytön sovellusskeemoissa. Lisäksi profiili kiinnittää kaikkien ominaisuuksien toistuvuusmääreeksi arvot 0 tai 1; ts. ominaisuudet voivat olla vapaaehtoisia tai pakollisia, mutta eivät voi toistua.

Sijainnilliset ominaisuudet rajataan SF-0-profiilissa seuraaviin: piste, lineaarisesti interpoloitu viiva, tasomainen pinta ja näiden yhdistelmät. Ominaisuuksien käsittely XLink -mekanismin avulla tehtyinä viittauksina toisiin samassa dokumentissa oleviin tai muualta verkosta löytyviin elementteihin on rajattu pois SF-0-profiilista. Viittaukset ovat tässä profiilissa mahdollisia vain eksplisiittisesti määritellyn 'gml:ReferenceType' -tietotyypin välityksellä.

Yhteensopivuustaso SF-1

Taso SF-1 on määritelty muutoin kuin SF-0, paitsi että ominaisuudet voivat toistua ja että sovellusskeemassa voidaan vapaasti määritellä uusia ei-sijainnillisia ominaisuuksia. Näin myös rakenteiset ominaisuudet ovat käytettävissä.

Yhteensopivuustaso SF-2

Yhteensopivuustaso SF-2 vastaa siis ISO 19125-2:n mukaista Simple Feature – Common Architecture -laajuutta. Ei-sijainnillisiin ominaisuuksiin liittyen ei aseteta mitään rajoituksia. Sijaintiominaisuudet on sen sijaan sidottu samoihin perusgeometriatyyppeihin kuin yhteensopivuustasolla SF-0 ja SF-1. Yhteensopivuustaso SF-2 ei myöskään sisällä kohteiden ominaisuuksien XLink-viittauksiin liittyvää rajoitusta.

4.3 Sijaintiominaisuudet

GML Simple Features -profiili rajaa käytettävät sijaintiominaisuustyypit ja näiden arvoina esiintyvät geometriset objektit seuraavasti (GML 3.2.1 sisältää kymmeniä erilaisia geometriatyyppejä):

Sijaintiominaisuustyyppi

Tuetut geometriset objektit

gml:PointPropertyType

gml:CurvePropertyType

'gml:LineString' tai 'gml:Curve', joka koostuu 'gml:LineStringSegment' tai gml:Arc -tyyppisistä osista (huom: gml:Arc on tämän JHS:n laajennos SF-profiiliin)

gml:SurfacePropertyType

'gml:Polygon' tai 'gml:Surface', joka koostuu 'gml:PolygonPatch' -tyyppisistä osista

gml:GeometryPropertyType

'gml:Point', 'gml:LineString', 'gml:Curve', 'gml:Polygon', 'gml:Surface', 'gml:MultiPoint', 'gml:MultiCurve', 'gml:MultiSurface'

gml:MultiPointPropertyType

gml:MultiCurvePropertyType

samat kuin kohdassa: 'gml:CurvePropertyType'

gml:MultiSurfacePropertyType

samat kuin kohdassa: 'gml:SurfacePropertyType'

gml:MultiGeometryPropertyType

samat kuin kohdassa: 'gml:GeometryPropertyType'

Taulukko 1 GML Simple Features profiilin mukaiset geometriatyypit

Koordinaattien osoittamiseen geometristen objektien sisällä käytetään elementtiä ’gml:pos’ ’gml:Point’ -objektin tapauksessa ja elementtiä ’gml:posList’ kaikissa muissa tapauksissa. Käytettävässä koordinaattijärjestelmässä voi olla 1,2 tai 3 dimensiota. Kohteilla voi olla mielivaltainen määrä sijaintiominaisuuksia.

Kohdejoukolla tulee aina olla määriteltynä ’gml:boundedBy’ -ominaisuus. Tämän ominaisuuden arvona olevan ’gml:Envelope’ -elementin attribuutti ’gml:srsName’ osoittaa käytetyn koordinaattijärjestelmän. Tätä arvoa käytetään oletusarvona kaikille ko. kohdejoukon sisältämille koordinaateille, ellei yksittäisissä geometriaobjekteissa erikseen toisin osoiteta.

4.4 Sovellusskeeman laatiminen

Tässä kappaleessa esitellään GML Simple Features -profiilin mukaiset koodausmallit erilaisten tietoelementtien koodaamiseen sovellusskeemoissa. Näissä malleissa annetaan täsmällinen ohje kunkin tietotyypin esittelemisestä skeemassa; pyrkimyksenä on rajata XML Schema:n käytettävissä olevasta laajasta elementtivalikoimasta suppea osajoukko ja vakioida koodauskäytännöt skeemojen luomisen ja erityisesti niiden prosessoinnin yksinkertaistamiseksi. Seuraavia malleja tulee siis sovellusskeemoissa noudattaa yksityiskohtaisesti; kaikkien elementtien ja attribuuttien tulee olla mukana ja mitään malleista pois jätettyjä XML Schema:ssa mahdollisesti määriteltyjä valinnaisia piirteitä ei tule käyttää. XML-attribuuttien järjestyksellä ei kuitenkaan ole merkitystä.

4.4.1 Skeeman juurielementti

<xsd:schema

    targetNamespace=" target_name_space "

    xmlns: prefix =" target_name_space "

    xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns:gml="http://www.opengis.net/gml/3.2"

    xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0"

    elementFormDefault="qualified"

    version=" 99.99.99 ">

Skeeman nimiavaruus annetaan attribuutissa 'targetNamespace'. Jos ko. nimiavaruuteen halutaan liittää skeemadokumentissa etuliite (prefix), annetaan tämä seuraavassa attribuutissa 'xmlns:prefix' (tässä 'prefix' -tekstin paikalle voidaan valita haluttu merkkijono). Kaikki nimiavaruuksien etuliitteet ovat vapaasti valittavissa, kunhan avaruuden tunnus on oikea, tässä mallissa näkyvä arvo. Skeemadokumentin oletusnimiavaruus on skeeman laatijan päätettävissä. Versionumerointia voidaan soveltaa vapaasti (attribuutti 'version').

4.4.2 Skeeman yhteensopivuustason osoittaminen

<xsd:annotation>

  <xsd:appinfo source=”http://schemas.opengis.net/gml/3.2.1/profiles/gmlsfProfile/2.0/gmlsfLevels.xsd”>

    <gmlsf:ComplianceLevel>0|1|2</gmlsf:ComplianceLevel>

    <gml:GMLProfileSchema>

          http://schemas.opengis.net/gml/3.2.1/profiles/gmlsfProfile/2.0/gmlsf[2].xsd

    </gml:GMLProfileSchema>

   </xsd:appinfo>

</xsd:annotation>

Edellä esitetyllä 'xsd:annotation' -elementillä voidaan osoittaa ao. skeeman yhteensopivuustaso GML Simple Features -profiiliin nähden. Elementin 'gmlsf:ComplianceLevel' sisällä kerrotaan tason numero (0, 1 tai 2). Elementin 'gml:gmlProfileSchema' arvona taas on viittaus ao. yhteensopivuustason mukaiseen GML Simple Features -profiilin skeematiedostoon (tasoilla 0 ja 1 on samansisältöinen skeematiedosto, joka on oletusarvoisesti nimetty: 'gmlsf.xsd'; tasolla 2 on näistä poikkeava skeematiedosto nimeltä 'gmlsf2.xsd').

Edellä esitellyn ’annotation’ -elementin tulee sijaita skeematiedostossa välittömästi juurielementin alapuolella, siten että se voidaan saavuttaa seuraavalla XPath-lausekkeella: /xsd:schema/xsd:annotation/xsd:appinfo/gmlsf:ComplianceLevel

4.4.3 Muiden skeematiedostojen sisällyttäminen

<xsd:import namespace="http://www.opengis.net/gml/3.2"

    schemaLocation="http://…schema repository path…/gml.xsd"/>

Sovellusskeeman tulee viitata tällä 'xsd:import' -elementillä varsinaiseen täydelliseen GML 3 -skeemakokonaisuuteen. Osuus ”... schema repository path ...” korvataan todellisella, saavutettavissa olevalla osoitteella, josta GML 3:n mukaiset skeemat löytyvät.

<xsd:import namespace="http://www.opengis.net/gmlsf/2.0"

    schemaLocation="http://…schema repository path…/gmlsfLevels.xsd"/>´

Edellisellä 'xsd:import' -elementillä viitataan yhteensopivuustason ilmoittamiseen tarvittavan elementin (gmlsf:ComplianceLevel) määrittävään skeemaan.

Muihin sovellusskeemassa tarvittaviin ulkoisiin skeemoihin voidaan viitata tarpeen mukaan. Ehtona on, että myös nämä skeemat ovat Simple Features -profiilin kanssa yhteensopivia ja yhteensopivuustasoltaan samoja tai matalampia kuin ao. skeema.

4.4.4 Kohdejoukkojen esittely

<xsd:element name=" FeatureCollectionName "

        type="[prefix:] FeatureCollectionNameType "

         substitutionGroup="gml:AbstractGML"/>

<xsd:complexType name=" FeatureCollectionNameType ">

  <xsd:complexContent>

    <xsd:extension base="gml:AbstractFeatureType">

      <xsd:sequence minOccurs=”0” maxOccurs=”unbounded”>

        <xsd:element name=”featureMember”>

          <xsd:complexType>

<xsd:complexContent>

<xsd:extension base=”gml:AbstractFeatureMemberType”

             <xsd:sequence>

               <xsd:element ref=”gml:AbstractFeature”/>

             </xsd:sequence>

</xsd:extension>

</xsd:complexContent>

          </xsd:complexType>

        </xsd:element>

      </xsd:sequence>

    </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

Käytettävän kohdejoukon (Feature Collection) nimi annetaan 'xsd:element' -elementin 'name' -attribuutissa. Tyyppi määritellään 'xsd:complexType' -elementin avulla, jossa osoitetaan kohdejoukon periytyminen GML:n abstraktista perustyypistä 'gml:AbstractFeatureType'. Muita sisäisiä elementtejä ei tule esitellä. Tämä merkitsee sitä, että ainoa kohdejoukolla käytettävissä oleva ominaisuus on kohteiden sisällyttämiseksi kohdejoukkoon määritelty elementti 'featureMember'. On syytä korostaa, että tämä elementti kuuluu ao. sovellusskeeman omaan nimiavaruuteen, eikä siis vastaa GML:n omaa ’gml:featureMember’ -elementtiä, joka mahdollistaa myös XLink-viittauksina annetut kohteet.

Kaikilla yhteensopivuustasoilla voidaan sovellusskeemassa esitellä vain yksi kohdejoukko ja jos tätä kohdejoukkoa käytetään aineistotasolla, sen tulee olla ao. dokumentin juurielementti. Simple Features -profiili ei siis salli monitasoista sisäkkäisten kohdejoukkojen hierarkiaa.

4.4.5 Kohdeluokkien esittely

<xsd:element name=" FeatureTypeName "

        type="[ prefix :] FeatureTypeName Type"

        substitutionGroup="gml:AbstractFeature"/>

<xsd:complexType name=" FeatureTypeName Type">

  <xsd:complexContent>

    <xsd:extension base="gml:AbstractFeatureType">

       <xsd:sequence>

         <!-- ominaisuuksien esittely, kuten on selostettu alla -->

      </xsd:sequence>

    </xsd:extension>

  </xsd:complexContent>

</xsd:complexType>

Kohdeluokan nimeäminen tapahtuu kuten edellä kohdejoukon tapauksessa. Kohdeluokka esitellään periytyvänä GML:n abstraktista perustyypistä 'gml:AbstractFeatureType'. Täältä se perii seuraavat kaikille GML-objekteille määritellyt vapaaehtoiset perusominaisuudet: 'gml:description', 'gml:descriptionReference', 'gml:identifier', 'gml:name', jotka voidaan ottaa käyttöön kohteiden lapsielementteinä näkyvinä ominaisuuksina, sekä XML-attribuuttina määritellyn yksikäsitteisen identifiointitunnuksen 'gml:id' (XML Schema -tyyppiä ID).

Kohdeluokalle määriteltävät luokkakohtaiset ominaisuudet esitellään 'xsd:sequence' -elementin sisällä noudattaen jäljempänä esiteltäviä koodausmalleja. Ominaisuuksien esittelyjärjestys on merkittävä, eli instanssitasolla elementtien pitää noudattaa samaa järjestystä.

4.4.6 Ominaisuuksien esittely

Kuten edellä on todettu Simple Features -profiili (SF-0 ja SF-1) rajaa XML Schemassa määritellystä laajasta joukosta tietotyyppejä sovellusskeemoissa käytettäväksi seuraavat perustietotyypit: kokonaisluku (integer), mittaluku (measurement), merkkijono (character string), päiväys (date), totuusarvo (boolean), binäärimuotoinen data (binary data), URI-referenssit, merkkijono, joka edustaa koodiarvoa (code list), reaaliluku (real).

Sovellusskeemassa esiteltävien ominaisuuksien tietotyyppimäärittelyissä voidaan käyttää seuraavia rajausehtoja (perustyyppien 'integer', 'real', 'date', 'dateTime', 'measurement' yhteydessä): minInclusive (<xsd:minInclusive value="min value"/>), minExclusive (<xsd:minExclusive value="min value"/>), maxInclusive (<xsd:maxInclusive value="max value"/>), maxExclusive (<xsd:maxExclusive value="max value"/>), Enumeration (<xsd:Enumeration value="value"/>). Lisäksi Enumeration-rajausehtoa voidaan käyttää myös tietotyyppien ’string’, ’URI’ ja ’reference’ yhteydessä.

XML-skeemassa voidaan elementtien toistuvuutta osoittaa attribuuteilla ’minOccurs’ ja ’maxOccurs’. Yhteensopivuustasolla SF-0 toistuvuusattribuuttien tulee aina olla arvoissa minOccurs="0" tai minOccurs="1" ja maxOccurs="1", eli ominaisuuden voi määritellä vapaaehtoiseksi, mutta ei toistuvaksi. Yhteensopivuustasoilla SF-1 ja SF-2 ao. attribuutit voivat saada arvoja välillä 0 – ääretön ('minOccurs') ja 1 – ääretön ('maxOccurs'); ominaisuudet voivat siis vapaasti toistua. Oletusarvot näille attribuuteille ovat: minOccurs="1" ja maxOccurs="1", joten jos attribuutteja ei skeemassa ole, on kyseessä pakollinen yhteen kertaan esiintyvä ominaisuus. Vapaaehtoiseksi määriteltyä ominaisuutta (minOccurs=”0”) vastaava elementti voi olla instanssitasolla tyhjä. Tällöin ao. ominaisuus tulkitaan null-arvoiseksi. Kaikissa muissa tapauksissa tyhjä elementti edustaa skeemaan nähden virheellistä (invalid) instanssia.

Kokonaislukutyyppinen ominaisuus

<xsd:element name=" propertyName " [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

  <xsd:simpleType>

    <xsd:restriction base="xsd:integer">

      <xsd:totalDigits value=" nDigits "/>

       <!-- mahdolliset yhteiset rajausehdot: min/max/Inclusive/Exclusive ja Enumeration-->

     </xsd:restriction>

  </xsd:simpleType>

</xsd:element>

Lyhyt muoto: <xsd:element name="propertyName" type="xsd:integer"

                           [minOccurs="0|N"] [maxOccurs="N|unbounded"]>

Yksinkertaisimmillaan (lyhyt muoto) kokonaislukutyyppinen ominaisuus esitellään antamalla sille nimi ('name' -attribuutti), kertomalla sen olevan tyyppiä 'xsd:integer' ja asettamalla mahdolliset 'minOccurs' ja 'maxOccurs' -attribuutit (osoittavat ominaisuuden toistuvuutta).

Jos kokonaislukutyyppistä ominaisuutta halutaan tarkemmin rajata, voidaan tämä tehdä määrittelemällä sille 'xsd:integer' -tyypistä periytetty uusi yksinkertainen tietotyyppi ('xsd:simpleType'). Edellä esiteltyjen yhteisten rajausehtojen (minInclusive, minExclusive, maxInclusive, minExclusive, Enumeration) lisäksi ominaisuutta voi rajata luvussa esiintyvien numeroiden maksimilukumäärän suhteen ('xsd:totalDigits').

Mittaluku –tyyppinen ominaisuus

<xsd:element name=" propertyName " [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

  <xsd:complexType>

    <xsd:simpleContent>

      <xsd:restriction base="gml:MeasureType">

         <!-- mahdolliset yhteiset rajausehdot: min/max/Inclusive/Exclusive ja Enumeration-->

       </xsd:restiction>

    </xsd:simpleContent>

  </xsd:complexType>

</xsd:element>

Lyhyt muoto: <xsd:element name=" propertyName " type="gml:MeasureType"

[minOccurs="0| N "] [maxOccurs=" N |unbounded "]>

Mittalukua edustava ominaisuus esitellään tietotyyppinä, jonka perustyyppinä toimii 'gml:MeasureType'. 'gml:MeasureType' on määritelty 'xsd:double' -tyyppisenä elementtinä, jolla on 'uom' -niminen attribuutti. Tällä attribuutilla on tarkoitus ilmaista käytetty mittayksikkö joko yksinkertaisina arvoina, kuten 'kg', 'm' tai 'm/s', tai yksikäsitteisen URI-viittauksen muodossa. Jos mittayksikköä ei tunneta, attribuutin arvoksi voidaan antaa ’unknown’.

Merkkijonotyyppinen ominaisuus

<xsd:element name=" propertyName " [minOccurs="0|N"] [maxOccurs="N|unbounded"]>

  <xsd:simpleType>

    <xsd:restriction base="xsd:string">

      <xsd:maxLength value=" nCharacters "/>

      <!-- tai -->

      <xsd:length value=” nCharacters ”/>

       <!-- mahdolliset yhteiset rajausehdot: min/max/Inclusive/Exclusive ja Enumeration-->

     </xsd:restriction>

  </xsd:simpleType>

</xsd:element>

Lyhyt muoto: <xsd:element name="propertyName" type="xsd:string"

                 minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

Merkkijonona ilmaistava ominaisuus periytyy tyypistä 'xsd:string' ja voi saada rajausehtona joko kiinteän merkkien lukumäärän ('xsd:length') tai merkkien maksimimäärän ('xsd:maxLength'). Jos rajausehtoja ei tarvita, voidaan ominaisuus esitellä suoraan 'xsd:string' -tyyppisenä (lyhyt muoto). Merkkijonon kieli voidaan tarvittaessa osoittaa käyttäen attribuuttia ’xml:lang’ (kts. GML Simple Feature -profiili, luku 8.4.4.7.2).

Päiväys- tyyppinen ominaisuus

<xsd:element name=" propertyName " [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

  <xsd:simpleType>

    <xsd:restriction base="xsd:date|xsd:dateTime">

      <!-- mahdolliset yhteiset rajausehdot: min/max/Inclusive/Exclusive ja Enumeration-->

    </xsd:restriction>

  </xsd:simpleType>

</xsd:element>

Lyhyt muoto: <xsd:element name="propertyName" type="xsd:date | xsd:dateTime" [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

Päiväystietoa edustava ominaisuus periytyy joko 'xsd:date' tai 'xsd:dateTime' -tietotyypeistä. 'xsd:date' sisältää vain päivämäärätiedon, 'xsd:dateTime' myös kellonajan. XML Schema määrittelee päiväyksille tarkan kirjaamismuodon.

Totuusarvoinen ominaisuus

<xsd:element name="propertyName"

         type="xsd:boolean"

        [minOccurs="0|N"] [maxOccurs="N|unbounded"]/>

Totuusarvoinen ominaisuus esitellään suoraan tyyppiä 'xsd:boolean' edustavana elementtinä. Koska rajausehtoja ei sovelleta, voidaan käyttää esittelyn lyhyttä muotoa. Ominaisuus voi saada arvot 'true', '1', 'false', '0'.

Ominaisuus, joka edustaa binäärimuotoista dataa

<xsd:element name=" propertyName " [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

   <xsd:complexType>

    <xsd:simpleContent>

      <xsd:extension base="xsd:base64Binary|xsd:hexBinary">

      <xsd:attribute name="url" type="xsd:anyURI"

              use="optional"/>

      <xsd:attribute name="mimeType" type="xsd:string"

              use="required"/>

      <xsd:attribute name="role" type="xsd:string"

              use="optional"/>

      <xsd:attribute name="length" type="xsd:positiveInteger"

              use="optional"/>

      </xsd:extension>

    </xsd:simpleContent>

   </xsd:complexType>

</xsd:element>

Binäärimuotoista dataa edustava ominaisuus esitellään elementtinä, joka periytyy perustyypistä 'xsd:base64Binary' tai tyypistä 'xsd:hexBinary'. Lisäksi elementillä on attribuutti 'url', jonka avulla voidaan antaa viittaus ulkopuoliseen binääritiedostoon. Esittämistavan vaihtoehtoina datatiedostossa ovat siis joko dokumenttiin sisään merkkikoodattu binääritieto tai ulkoiseen tiedostoon osoittava URI-viittaus. Pakollinen attribuutti 'mimeType' ilmaisee käytetyn binääriformaatin tyypin.

Sijaintiominaisuus

<xsd:element name=" propertyName "

           type=" gml_geometric_propertyType "

          minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

Sijaintiominaisuuden tyypiksi voidaan valita jokin aiemmin esitellyistä Simple Features -profiiliin sisällytetyistä GML:n sijaintiominaisuustyypeistä (kts. sijaintiominaisuudet edellä).

URI-tyyppinen ominaisuus

<xsd:element name=" propertyName "

         type="xsd:anyURI"

         minOccurs="0| N "] [maxOccurs=" N |unbounded"]/>

URI-viittauksena esiintyvä ominaisuus esitellään 'xsd:anyURI' -tyyppisenä.

Ominaisuus, joka viittaa johonkin resurssiin

<xsd:element name=" propertyName " type=" gml:ReferenceType" minOccurs="0|1">

   <xsd:annotation>

    <xsd:appinfo source="urn:x-gml:targetElement"> kohde-elementti </xsd:appinfo>

   </xsd:annotation>

</xsd:element>

Ominaisuus, joka viittaa johonkin samassa dokumentissa olevaan tai dokumentin ulkopuoliseen resurssiin, esitellään 'gml:ReferenceType' -tyyppisenä elementtinä. 'xsd:appinfo' -elementillä voidaan eksplisiittisesti rajata viittauksen kohteena oleva elementti. Datatiedostossa viittaus osoitetaan ominaisuuselementin 'xlink:href' -attribuutilla, joka voi viitata samassa tiedostossa olevaan elementtiin seuraavaa muotoa olevalla linkillä: '#gml:id_attribuutin_arvo_kohde-elementissä'. Dokumentin ulkopuolisiin elementteihin viitataan lisäämällä edellisen linkin eteen asianmukainen URI-viittaus.

Ominaisuus, jonka arvo valitaan koodilistasta

<xsd:element name=" propertyName " [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

   <xsd:complexType>

    <xsd:simpleContent>

      <xsd:restriction base="gml:CodeType">

        <xsd:attribute name="codeSpace" type="xsd:anyURI" [use="optional"]

                default="…uri…" | fixed="…uri…"/>

      </xsd:restriction>

    </xsd:simpleContent>

  </xsd:complexType>

</xsd:element>

Ominaisuus, joka saa arvokseen koodilistasta valittavan koodin esitellään elementtinä, jonka tietotyyppi on 'gml:CodeType'. Käytetty koodilista voidaan identifioida attribuutilla 'codeSpace'. Koodilistojen oletetaan olevan määritelty GML-profiilin: ’Simple Dictionary profile’ mukaisina hakemistoina.

Reaalilukutyyppinen ominaisuus

<xsd:element name=" propertyName " [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

  <xsd:simpleType>

    <xsd:restriction base="xsd:double|xsd:decimal">

      <!-- mahdolliset yhteiset rajausehdot:

                min/max/Inclusive/Exclusive ja Enumeration-->

       [<xsd:totalDigits value="N"/>]

       [<xsd:fractionDigits value="N" />]

    </xsd:restiction>

  </xsd:simpleType>

</xsd:element>

Lyhyt muoto: <xsd:element name=" propertyName " type="xsd:double"

                 [minOccurs="0| N "] [maxOccurs="N|unbounded"]>

Reaalilukuarvoinen ominaisuus esitellään tyyppiä 'xsd:double' tai 'xsd:decimal' olevana elementtinä. 'xsd:decimal' -tyyppiä edustavalle ominaisuudelle tulee antaa rajoittavina lisäehtoina numeroiden kokonaismäärä ('xsd:totalDigits') ja desimaalien lukumäärä ('xsd:fractionDigits'). Kaikki mittaustuloksiin pohjautuvat numeeriset lukuarvot tulee esitellä 'measurement' -tyyppisinä ominaisuuksina, jolloin käytetyn mittayksikön ilmaiseminen mahdollistuu.

Rakenteinen, sovellusskeemassa määritelty ominaisuus (SF-1)

<xsd:element name=" propertyName "

          type=" userDefinedName PropertyType"

         [minOccurs="0| N "] [maxOccurs=" N |unbounded"]>

  <xsd:complexType name=" userDefinedName PropertyType">

    <xsd:sequence>

      <xsd:element ref=" tns:userDefinedName "/>

    </xsd:sequence>

  </xsd:complexType>

  <xsd:element name=" userDefinedName ">

     <xsd:complexType>

     <xsd:sequence>

      <!-- yksi tai useampia ominaisuusmääreitä;

            esitellään kuten selostettu edellä -->

    </xsd:sequence>

  </xsd:complexType>

</xsd:element>

Yhteensopivuustasolla SF-1 voidaan käyttää sovellusskeemassa määriteltyjä rakenteisia ominaisuuksia. Tällainen ominaisuus esitellään elementtinä, jonka tyyppi on skeemassa määritelty kompleksinen tyyppi ('xsd:complexType'). Ao. tyypin nimen loppuosan tulee olla GML-konvention mukaisesti '...PropertyType'. Näin nimetyn tyypin sisällä on tasan yksi elementti, joka myöskin on skeemassa määritelty rakenteinen elementti ('userDefinedName') (merkkijono ’tns’ edustaa skeeman nimiavaruuden lyhennettä (prefix)). Tämän elementin sisällä on joukko yksinkertaisia ominaisuuksia, jotka esitellään, kuten edellä on käsitelty. Jos tyypin määrittelyssä käytetään elementtiä ’<xsd:choice>’ elementin ’<xsd:sequence>’ sijasta, tulee datatasolla esiintyä vapaavalintaisesti yksi listatuista yksinkertaisista ominaisuuksista.

Datatiedostoon muodostuu näin elementtirakenne, jossa kohteen sisällä on ominaisuutta edustava elementti, tämän sisällä ao. ominaisuuden arvoa (objekti) edustava elementti ja vasta tämän sisällä yksittäiset ominaisuudet, jotka muodostavat ao. rakenteisen ominaisuuden komponentit.

Yhteensopivuustasolla SF-1 ominaisuudet voivat saada tyhjiä arvoja. Tämä osoitetaan attribuutilla ’nillable’ skeemassa ja attribuutilla ’xsi:nil’ datatiedostossa (kts. GML Simple Feature -profiili, luku 9.2.4).

Yhteensopivuustasolla SF-2 ei aseteta mitään rajoituksia varsinaiseen GML-standardiin nähden ei-sijainnillisten ominaisuuksien määrittämisen osalta. Geometriatyypit on kuitenkin rajattu edellä esiteltyihin tyyppeihin (kts. sijaintiominaisuudet).

4.5 Esimerkki GML SF -yhteensopivasta sovellusskeemasta

Tämän suosituksen johdanto-osassa käsiteltiin yksinkertaista tietomallia. Vastaava General Feature Model -pohjainen UML-malli on esitetty seuraavassa kuvassa.

Liite3_Kuva3

Seuraavassa esitellään GML Simple Features -yhteensopiva sovellusskeema, joka vastaa tätä mallia siltä osin, kuin se on yhteensopivuustason SF-0 mukaisena mahdollista toteuttaa.

Koska Simple Features profiili ei tue kohdetyyppien välistä perintää, ei kohdeluokkaa ’Liikennevayla’ voida määritellä erillisenä, vaan kaikki ominaisuudet täytyy esitellä paikallisesti kummassakin konkreettisessa alityypissä ’Katu’ ja ’KevyenliikenteenVayla’. Skeema esittelee myös XML-tiedoston juurielementtinä tarvittavan kohdejoukon ’EsimerkkiAineisto’, jota ei ole mukana UML-kaaviossa.

Sovellusskeema (EsimerkkiAineisto.xsd)

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema   xmlns:jhs="http://skeemat.jhs-suositukset.fi/JHS162/esimerkki"

                      xmlns:xsd= " http://www.w3.org/2001/XMLSchema "

                      xmlns:gml="http://www.opengis.net/gml/3.2"

                      xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0"

                       targetNamespace="http://skeemat.jhs-suositukset.fi/JHS162/esimerkki"

                       elementFormDefault="qualified"

                       version="1.0.0">

  <xsd:annotation>

    <xsd:appinfo source="http://schemas.opengis.net/gml/3.2.1/profiles/gmlsfProfile/2.0/gmlsfLevels.xsd">

      <gmlsf:ComplianceLevel>0</gmlsf:ComplianceLevel>

      <gml:GMLProfileSchema>

          http://schemas.opengis.net/gml/3.2.1/profiles/gmlsfProfile/2.0/gmlsf.xsd

      </gml:GMLProfileSchema>

    </xsd:appinfo>

  </xsd:annotation>

  <xsd:import namespace="http://www.opengis.net/gml/3.2"

        schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>

   <!-- Kohdejoukko: EsimerkkiAineisto -->

  <xsd:element name="EsimerkkiAineisto"

         type="jhs:EsimerkkiAineistoType" substitutionGroup="gml:AbstractGML"/>

  <xsd:complexType name="EsimerkkiAineistoType">

    <xsd:complexContent>

      <xsd:extension base="gml:AbstractFeatureType">

        <xsd:sequence minOccurs="0" maxOccurs="unbounded">

          <xsd:element name="featureMember">

            <xsd:complexType>

              <xsd:sequence>

                <xsd:element ref="gml:AbstractFeature"/>

              </xsd:sequence>

            </xsd:complexType>

          </xsd:element>

        </xsd:sequence>

      </xsd:extension>

    </xsd:complexContent>

  </xsd:complexType>

   <!-- Kohdeluokka: Katu -->

  <xsd:element name="Katu" type="jhs:KatuType" substitutionGroup="gml:AbstractFeature"/>

  <xsd:complexType name="KatuType">

    <xsd:complexContent>

      <xsd:extension base="gml:AbstractFeatureType">

        <xsd:sequence>

          <!-- Ominaisuus: leveys -->

          <xsd:element name="leveys">

            <xsd:simpleType>

              <xsd:restriction base="xsd:decimal">

                <xsd:totalDigits value="3"/>

                <xsd:fractionDigits value="1"/>

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

           <!-- Ominaisuus: keskilinja -->

          <xsd:element name="keskilinja" type="gml:CurvePropertyType"/>

          <!-- Ominaisuus: katunumero -->

          <xsd:element name="katunumero">

             <xsd:simpleType>

              <xsd:restriction base="xsd:integer">

                <xsd:totalDigits value="4"/>

              </xsd:restriction>

             </xsd:simpleType>

          </xsd:element>

          <!-- Ominaisuus: pintamateriaali -->

           <xsd:element name="pintamateriaali">

            <xsd:simpleType>

              <xsd:restriction base="xsd:string">

                <xsd:enumeration value="asfaltti"/>

                <xsd:enumeration value="öljysora"/>

                <xsd:enumeration value="betoni"/>

                <xsd:enumeration value="sora"/>

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

           <!-- Ominaisuus: katualue -->

          <xsd:element name="katualue" type="gml:SurfacePropertyType"/>

          <!-- Ominaisuus: liitannaisalue -->

           <xsd:element name="liitannaisalue" type="gml:ReferenceType">

            <xsd:annotation>

              <xsd:appinfo source="urn:x-gml:targetElement">

                jhs:Pysakki

              </xsd:appinfo>

            </xsd:annotation>

          </xsd:element>

        </xsd:sequence>

      </xsd:extension>

    </xsd:complexContent>

  </xsd:complexType>

   <!-- Kohdeluokka: KevyenliikenteenVayla -->

  <xsd:element name="KevyenliikenteenVayla"

        type="jhs:KevyenliikenteenVaylaType" substitutionGroup="gml:AbstractFeature"/>

  <xsd:complexType name="KevyenliikenteenVaylaType">

    <xsd:complexContent>

      <xsd:extension base="gml:AbstractFeatureType">

        <xsd:sequence>

          <!-- Ominaisuus: leveys -->

          <xsd:element name="leveys">

            <xsd:simpleType>

              <xsd:restriction base="xsd:decimal">

                <xsd:totalDigits value="3"/>

                <xsd:fractionDigits value="1"/>

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

           <!-- Ominaisuus: keskilinja -->

          <xsd:element name="keskilinja" type="gml:CurvePropertyType"/>

          <!-- Ominaisuus: tyyppi -->

          <xsd:element name="tyyppi">

             <xsd:simpleType>

              <xsd:restriction base="xsd:integer">

                <xsd:totalDigits value="2"/>

                <xsd:minInclusive value="1"/>

                <xsd:maxInclusive value="5"/>

              </xsd:restriction>

            </xsd:simpleType>

          </xsd:element>

        </xsd:sequence>

      </xsd:extension>

    </xsd:complexContent>

  </xsd:complexType>

   <!-- Kohdeluokka: Pysakki -->

  <xsd:element name="Pysakki"

       type="jhs:PysakkiType" substitutionGroup="gml:AbstractFeature"/>

  <xsd:complexType name="PysakkiType">

    <xsd:complexContent>

      <xsd:extension base="gml:AbstractFeatureType">

        <xsd:sequence>

          <!-- Ominaisuus: sijainti -->

          <xsd:element name="sijainti" type="gml:PointPropertyType"/>

        </xsd:sequence>

      </xsd:extension>

    </xsd:complexContent>

   </xsd:complexType>

</xsd:schema>

Yo. skeemaa vastaava yksinkertainen GML-datatiedosto (EsimerkkiAineisto.xml)

<?xml version="1.0" encoding="UTF-8"?>

<jhs:EsimerkkiAineisto gml:id="ea1"

                  xmlns:jhs="http://skeemat.jhs-suositukset.fi/JHS162/esimerkki"

                xmlns:gml="http://www.opengis.net/gml/3.2"

                xmlns:xlink="http://www.w3.org/1999/xlink"

                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                xsi:schemaLocation="http://skeemat.jhs-suositukset.fi/JHS162/esimerkki

EsimerkkiAineisto.xsd">

  <gml:boundedBy>

    <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG::3067">

       <gml:lowerCorner>567890.123 6789000.123</gml:lowerCorner>

      <gml:upperCorner>567899.123 6789009.123</gml:upperCorner>

    </gml:Envelope>

  </gml:boundedBy>

  <jhs:featureMember>

     <jhs:Katu gml:id="ka1234">

      <jhs:leveys>6</jhs:leveys>

      <jhs:keskilinja>

         <gml:LineString gml:id="ls1234">

          <gml:pos>567890.123 6789000.123</gml:pos>

          <gml:pos>567899.123 6789009.123</gml:pos>

         </gml:LineString>

      </jhs:keskilinja>

      <jhs:katunumero>123</jhs:katunumero>

      <jhs:pintamateriaali>asfaltti</jhs:pintamateriaali>

       <jhs:katualue>

        <gml:Polygon gml:id="po1234">

          <gml:exterior>

            <gml:LinearRing>

              <gml:posList>567890.123 6789000.123

              567890.123 6789009.123

              567899.123 6789009.123

              567899.123 6789000.123

              567890.123 6789000.123</gml:posList>

            </gml:LinearRing>

          </gml:exterior>

         </gml:Polygon>

      </jhs:katualue>

      <jhs:liitannaisalue xlink:href="#py1234"/>

     </jhs:Katu>

  </jhs:featureMember>

  <jhs:featureMember>

     <jhs:KevyenliikenteenVayla gml:id="ke1234">

      <jhs:leveys>3</jhs:leveys>

      <jhs:keskilinja>

         <gml:LineString gml:id="ls1235">

          <gml:pos>567890.123 6789009.123</gml:pos>

          <gml:pos>567899.123 6789000.123</gml:pos>

         </gml:LineString>

      </jhs:keskilinja>

      <jhs:tyyppi>3</jhs:tyyppi>

     </jhs:KevyenliikenteenVayla>

  </jhs:featureMember>

   <jhs:featureMember>

    <jhs:Pysakki gml:id="py1234">

      <jhs:sijainti>

        <gml:Point gml:id="pn1234">

          <gml:pos>567890.123 6789000.123</gml:pos>

        </gml:Point>

      </jhs:sijainti>

    </jhs:Pysakki>

  </jhs:featureMember>

</jhs:EsimerkkiAineisto>

GML:n XML Schema -tiedostot löytyvät OGC:n skeemapalvelimelta. Tätä kirjoitettaessa GML Simple Features -version 2.0 viralliset skeemat eivät vielä ole saatavilla. Viimeisimmät skeemat löytyvät seuraavista osoitteista:

GML 3.2.1: http://schemas.opengis.net/gml/3.2.1/

GML SF: http://schemas.opengis.net/gml/3.1.1/profiles/gm