GeoServer-teemakuva | Paikkatietomies

Eri geometriatyyppejä sisältävien aineistojen visualisointi SLD-tyylikielen avulla

Vektorimuotoisia paikkatietokohteita on montaa sorttia. On pistettä, viivaa ja monikulmiota. Perinteinen ajattelu paikkatietojärjestelmien maailmassa on se, että kukin geometriatyyppi on omalla tasollaan. Mikäli paikkatietokohteita säilötään tietokannassa, ei tällaisen ajattelutavan noudattaminen ole välttämätöntä, vaan samassa tietokantataulussa voidaan säilöä geometriatyypiltään erilaisia paikkatietokohteita.

Tässä artikkelissa tutustutaan siihen, miten rakentaa sellainen SLD-visualisointi, joka hanskaa geometriasarakkeessa olevat eri geometriatyypit, ja osaa soveltaa niille määriteltyjä SLD-tyylikielen sääntöjä. SLD-tyylikieli (Styled Layer Descriptor) on OGC:n kehittämä XML-pohjainen kieli, jolla paikkatietokohteita voidaan visualisoida ns. tyylisääntöjen (rule) avulla. SLD-tyylikieltä käytetään esimerkiksi GeoServer-paikkatietopalvelimella.

Muokkaa lähtöaineistoa jos se on mahdollista

Todetaan heti alkuun, että mikäli sinulla on mahdollisuus muokata datan rakennetta konepellin alla siten, että saat yhdelle karttatasolle ainoastaan yhdentyyppisiä geometrioita, tee se ihmeessä. Useita eri geometriatyyppejä sisältävä tietolähde aiheuttaa hankaluuksia mm. WFS-rajapinnalta aineistoja jaeltaessa.

Vaihtoehtoja datan rakenteen muokkaamiseen on useita, joista kenties helpoin toteuttaa on SQL-näkymä, johon suodatetaan ainoastaan haluttua geometriatyyppiä sisältävät geometriat. Esimerkiksi PostGIS-tietokannassa tämä onnistuu näppärästi hyödyntämällä WHERE-ehdossa ST_GeometryType-funktiota.

Muita vaihtoehtoja ovat aineistojen jaottelu omiin tauluihin geometriatyypin perusteella, uuden sanallisesti/numeroarvolla geometriatyypin kertovan sarakkeen luonti tai erillisten geometriasarakkeiden luonti. Mikä näistä menetelmistä on sitten paras, on kysymys johon on vaikea antaa yksiselitteistä vastausta.

Itse kääntyisin ehkä SQL-näkymän kannalle, mutta senkin käyttämisessä on toki omat rajoitteensa. Joskus itse tietolähteen muokkaaminen ei kuitenkaan tule kysymykseen, jolloin ratkaisu täytyy pystyä toteuttamaan visualisointivaiheessa. Esimerkeissä esitettyjä ratkaisuja olen käyttänyt onnistuneesti ainakin PostGIS-, Oracle- ja Microsoft SQL Server -tietovarastojen kanssa julkaistaessa ns. dynaaminn WMS-taso GeoServer-palvelimelta. On hyvä huomioida, että säilöttäessä samassa geometria-sarakkeessa useita eri muotoisia geometrioita, tulee geometria-sarakkeen tyyppi tietokannassa olla ns. geometrian yleinen muoto eli geometry.

Vaihtoehto 1: geometryType-funktio

Geometriatyypittäinen visualisointi voidaan toteuttaa SLD:ssä kahden eri suodatinfunktion avulla. Ensimmäinen vaihtoehto on käyttää geometryType -funktiota. Käytettäessä geometryType -funktiota, tulee funktiolle määritellä parametriksi se, minkä geometriatyypin paikkatietokohteita ko. säännön halutaan koskevan.

Parametrit määritellään useasta muusta suodatinfunktiosta tunnetulla Literal-tagilla. Mahdollisia arvoja voivat olla piste, viiva, sulkeutunut viiva, monikulmio, moniosainen piste, moniosainen viiva, moniosainen monikulmio tai geometriakokoelma. Seuraavassa esimerkki, joka suodattaa visualisoitavaksi ainoastaan monikulmiot (sekä moniosaiset että yksiosaiset):

<Rule>
 <ogc:Or>
  <ogc:PropertyIsEqualTo>
   <ogc:Function name="geometryType">
    <ogc:PropertyName>geometriasarakkeen_nimi</ogc:PropertyName>
   </ogc:Function>
   <ogc:Literal>Polygon</ogc:Literal>
  </ogc:PropertyIsEqualTo>
  <ogc:PropertyIsEqualTo> 
   <ogc:Function name="geometryType"> 
    <ogc:PropertyName>geometriasarakkeen_nimi</ogc:PropertyName> 
   </ogc:Function> 
   <ogc:Literal>MultiPolygon</ogc:Literal> 
  </ogc:PropertyIsEqualTo>
 </ogc:Or>
 <PolygonSymbolizer>
  ... tähän väliin tulee monikulmion visualisointi ... 
 </PolygonSymbolizer>
</Rule>

Vaihtoehto 2: dimension-funktio

Toinen SLD-tyylikielessä käytettävissä oleva suodatinfunktio on dimension. Dimension-funktio on hitusen yksinkertaisempi kuin geometryType-funktio, mutta perusperiaate on melko samanlainen kuin geometryType-funktiolla.

Tässäkin tapauksessa funktiolle annetaan arvo Literal-parametrilla siten, että haluttaessa suodattaa pistegeometrioita, käytetään arvoa 0. Haluattaessa suodattaa viivageometrioita käytetään arvoa 1 ja haluttaessa suodattaa monikulmioita käytetään arvoa 2. Seuraavassa esimerkki, joka suodattaa visualisoitavaksi ainoastaan monikulmiot:

<Rule>
 <ogc:PropertyIsEqualTo>
  <ogc:Function name="dimension">
   <ogc:PropertyName>geometriasarakkeen_nimi</ogc:PropertyName>
  </ogc:Function>
  <ogc:Literal>2</ogc:Literal>
 </ogc:PropertyIsEqualTo>
<PolygonSymbolizer>
... tähän väliin tulee monikulmion visualisointi ... 
</PolygonSymbolizer>
</Rule>

Lopputulema & SLD-tyylipohjat

Edellä esitetyt esimerkit toimivat tilanteissa, jossa visualisoidaan ainoastaan tietolähteen sisältämiä monikulmiotyyppisiä geometrioita. Mikäli tietolähde sisältää esimerkiksi pistegeometrioita, ja myös niille halutaan luoda visualisointi samassa SLD-dokumentissa, tulee dokumenttiin lisätä pistetyyppisiä geometrioita visualisoiva tyylisääntö.

Samaa periaatetta noudatellaan myös tilanteessa, mikäli tietolähde sisältää viivamuotoisia geometrioita, ja ne halutaan visualisoida. Täydelliset SLD-tyylitiedostot, jotka sisältävät tyylisäännöt niin pisteiden, viivojen kuin monikulmioiden visualisointiin, voit ladata täältä (ZIP-paketti).

Oma suositukseni on seuraava: kannattaa käyttää dimension-funktiota. Tämä suositus perustuu havaintoon, että geometryType-funktiota käytettäessä ainakin allekirjoittaneen GeoServer-palvelin onnistui välillä korruptoimaan GetCapablities-dokumentin sellaiseksi, ettei QGIS-ymmärtänyt enää mitään sen päälle.

Tätä tapahtui ajoittain, joten kyse lienee jonkinasteisesta muistiongelmasta – välillä toimii ihan hyvin 🙂 Heti kun poistin geometryType-type -funktiota käyttäneen SLD-tyylin linkityksen tasoon (default style), alkoi GeoServer toimimaan normaalisti. Dimension-funktion kanssa tätä ongelmaa ei ilmennyt.

On toki mahdollista, että SLD-tyylissä on jokin virhe, jonka seurauksena tämä tilanne syntyy, mutta ainakaan GeoServerin sisältämän tyylivalidointityökalun mukaan tyylin pitäisi olla kunnossa. Alla vielä pikainen esikatselu siitä (GetMap-kyselyn palauttama karttakuva), millaisen visualisoinnin saa aikaan oheisilla esimerkinomaisilla SLD-tyylitiedostoilla. Kuvan oikeassa alakulmassa myös GetLegendGraphic-kyselyn palauttama karttaselite.

Eri geometriatyyppien visualisointi SLD-tyylikielellä