GeoServer-teemakuva | Paikkatietomies

GeoServerillä enemmän irti GetFeatureInfo-kyselyistä

Eletään koronakevättä 2020 ja moni asia on eri asennossa kuin yleensä. Korona iski myös minun paikkatietoaiheiseen tekemiseen, sillä alun perin minun piti esitellä Oskari-karttapalvelualustan yhteisöpäivän tilaisuudessa Joensuun kaupungin paikkatiedolla johtamisen karttapalvelu Oskaria ja sitä, miten paikkatietokohteiden ominaisuustietoja voidaan visualisoida paremmin GeoServerin WMS GetFeatureInfo-pohjia hyödyntäen. Koronan kutistaessa tilaisuudet webinaareiksi, jäi esitys tällä erää pitämättä.

Ei kuitenkaan hätää, sillä tähän teemaan paneudutaan nyt tässä blogikirjoituksessa. Blogikirjoitus mahdollistaa myös PowerPoint-tykitystä laveamman lähestymistavan asiaan, mistä ei liene haittaa kokonaisuuden hahmottamisen näkökulmasta; ensiksi esitellään hieman GetFeatureInfo-pyynnön rakennetta, sitten sukelletaan hetkeksi GeoServerin pellin alle ja lopuksi näytetään ihan käytännön esimerkkejä.

GetFeatureInfo-kysely on osa WMS-standardia

Open Geospatial Consortiumin kehittämät avoimet rajapintateknologiat ovat eräs avoimen paikkatietomaailman hienoimmista asioista. Rajapintojen avulla on mahdollista luoda avoimeen teknologiaan perustuvia selainpohjaisia paikkatietoratkaisuja ja saada paikkatiedot virtaamaan eri järjestelmien/sovellusten välillä.

OGC:ltä on tuloillaan uusi ns. OGC API-rajapintamäärittelyt, joiden myötä muutosten tuulet tulevat puhaltamaan ennemmin tai myöhemmin entiset rajapinnat kumoon. Uskon, että tämä tulee tapahtumaan myöhemmin, joten keskitytään me vielä näihin tuttuihin, turvallisiin ja tuettuihin nykyisiin OGC-rajapintoihin ja erityisesti Web Map Service -rajapintaan, josta olen kirjoittanut myös aikaisemmin.

Web Map Service -standardiin sisältyy useita erilaisia pyyntöjä, joiden avulla asiakassovellus voi kommunikoida palvelimen kanssa. GetCapabilities-kyselyn avulla palvelimelta voidaan pyytää listaus tarjolla olevista karttakuva-aineistoista, niihin liittyvistä metatiedoista sekä mahdollisista vaihtoehtoisista tyyleistä, joiden avulla aineistoa voi katsella.

GetMap-kysely puolestaan palauttaa asiakassovellukselle karttakuvan haluttuun suorakaiderajaukseen perustuen ja GetLegendGraphic-kyselyn avulla palvelimelta on mahdollista pyytää karttaselite.

Tässä artikkelissa keskitytään GetFeatureInfo-kyselyyn (linkki avaa Web Map Service -määrittelydokumentin, GetFeatureInfo-kyselystä on kerrottu tarkemmin sivulla 38), jonka avulla asiakassovellus voi pyytää palvelimelta paikkatietokohteen ominaisuustietoja.

GetFeatureInfo-kyselyjä voidaan välittää WMS-palvelimelle useilla eri asiakassovelluksilla. Vastausta voidaan pyytää useissa eri formaateissa, palvelimesta riippuen esim. teksti-, HTML- ja XML-muodossa. Vastauksen muodostamista ohjataan kyselyn mukana välitettävien parametrien avulla.

Avoimen lähdekoodin sovelluksista tuki kyselyjen tekemiseen löytyy mm. QGIS– ja gvSIG-paikkatietosovelluksista, OpenLayers– ja Leaflet-kirjastoista sekä kotimaista tuotantoa olevasta Oskarista (oskari hyödyntää OpenLayers-kirjastoa). Myös kaupallisissa paikkatietosovelluksissa on hyvä tuki GetFeatureInfo-kyselyiden muodostamiseen ja lopputuloksen esittämiseen.

GetFeatureInfo-kyselyn rakenne

Alla esimerkki palvelimelle välitettävän GetFeatureInfo-kyselyn rakenteesta. Pyynnön mukana välitettävät parametrit ilmaistaan avain-arvo-pareina (=-merkki toimii erottimena) ja parit erotetaan toisistaan &-merkeillä. Parametrien järjestyksellä ei ole merkitystä. Parametrit on rivitetty esimerkissä eri riveille lukemisen helpottamiseksi.

<rajapintapalvelimen osoite>/wms?
REQUEST=GetFeatureInfo
&FORMAT=image/png
&LAYERS=<karttatason nimi>
&QUERY_LAYERS=<karttatason nimi>
&INFO_FORMAT=text/html
&X=<klikatun kohdan x-koordinaatti karttakuvassa>
&Y=<klikatun kohdan y-koordinaatti karttakuvassa>
&SRS=<koordinaattijärjestelmän EPSG-tunniste>
&WIDTH=<WMS-karttakuvan leveys>
&HEIGHT=<WMS-karttakuvan korkeus>
&BBOX=<xmin>,<ymin>,<xmax>,<ymax>

Oheinen rautalankamalli antaa käsityksen siitä, millaisia tietoja palvelimelle välitetään GetFeatureInfo-kyselyn yhteydessä. Kannattaa huomata, ettäGetFeatureInfo-kyselyssä on mukana myös sellaisia parametreja (FORMAT, LAYERS, SRS, WIDTH, HEIGHT ja BBOX), joita välitetään myös GetMap-kyselyssä. Pelkästään GetFeatureInfo-kyselyssä välitettäviä parametreja ovat sen sijaan QUERY_LAYERS, INFO_FORMAT, X ja Y.

Mikäli käytetään tiilitettyä WMS-palvelua, tulee X- ja Y-koordinaatti ilmoittaa yksittäisen karttakuvan sisäisinä koordinaatteina riippumatta siitä, missä kohtaa näytöllä näytettävää ”karttakuvamosaiikkia” tämä yksittäinen kuva on.

Toinen merkittävä asia on palautettavan ominaisuustiedon formaatti, joka ilmoitetaan INFO_FORMAT-kohdassa. Tässä kirjoituksessa myöhemmin esitettävä esimerkki edellyttää sitä, että ominaisuustietokyselyn vastaus pyydetään nimenomaisesti HTML-muodossa.

GeoServerin valmiudet GetFeatureInfo-kyselyissä

GeoServer on avoimen lähdekoodin rajapintapalvelin, jonka valmiudet eri OGC-rajapintastandardien toteuttamiseen ovat erinomaiset. GeoServeristä olen kirjoittanut aikaisemmin mm. SLD-tyylikieltä ja GeoServer-palvelinta käsitelleessä kirjoituksessa. Tässä artikkelissa sukelletaan kuitenkin hieman syvemmälle GeoServerin pellin alle ja tutustutaan GeoServerin ominaisuuteen, jonka avulla GetFeatureInfo-kyselyiden vastauksia voidaan kustomoida.

Tässä vaiheessa estradille astuu Apache FreeMarker -teknologia. Apache FreeMarker -teknologian avulla on mahdollista luoda erilaisia pohjia (template), joihin GeoServer sitten istuttaa kulloinkin klikatun paikkatietokohteen ominaisuustiedot ja palauttaa vastauksen asiakassovellukselle. Teknologian avulla on mahdollista toteuttaa monenlaista tiedon käsittelyä mukaan lukien erilaiset ehtolauseet ja silmukat.

Ohjeen FreeMarker-pohjien hyödyntämiseen GeoServerissä löydät GeoServerin dokumentaatiosta. FreeMarker-pohjasta käytetään jatkossa termiä FTL-pohja.

Esimerkki kustomoidusta GetFeatureInfo-pohjasta

GeoServerin dokumentoinnista saatetaan huomata, että luotaessa kustomoituja vastauspohjia GetFeatureInfo-pyyntöjen muodostamista varten, tarvitaan itse asiassa kolme erillistä FTL-pohjaa, joiden avulla muodostetaan kokonainen ja eheä asiakassovellukselle palautettava HTML-dokumentti. Nämä FTL-pohjat ovat nimeltään header.ftl, content.ftl ja footer.ftl. Ensimmäisenä mainittu header.ftl on varsin yksinkertainen sisältäen HTML-dokumentin alkuosassa tarvittavat elementit.

<#-- header.ftl -->
<html>
<head>
<title>GetFeatureInfo-ominaisuustietokyselyn vastauspohja</title>
</head>
<body>

Varsinaisen GetFeatureInfo-kyselyyn palautettavan vastauksen tietosisällön generointi tapahtuu content.ftl-tiedostossa. Alla oleva esimerkki on varsin yksinkertainen, jossa vastaus muodostetaan GeoServer-palvelimen oletuksena olevan vaakasuuntaisen taulukon sijaan listamaisena (lista on luettavampi). Listaukseen generoidaan kaikki sellaiset paikkatietokohteen ominaisuustiedot, jotka eivät ole geometrioita.

Lisäksi  tehdään suodatusta boolean-tyyppisen kentän (sis_gfi_vastaukseen) perusteella, jonka avulla voidaan määritellä paikkatietokohteen ominaisuustietotasolla se, sisällytetäänkö ko. kohde ominaisuustietokyselyyn. Mikäli tässä kentässä on arvo false, näytetään teksti Tämän paikkatietokohteen ominaisuustietoja ei voida näyttää. Mukana on myös yksinkertaista tekstin formatointia.

<#-- content.ftl -->
<#list features as paikkatietokohde>
 <#if paikkatietokohde.sis_gfi_vastaukseen.value?string == 'true'>
  <h3>${paikkatietokohde.type.title}</h3>
   <#list paikkatietokohde.attributes as ominaisuustieto>
    <#if !ominaisuustieto.isGeometry>
     <b>${ominaisuustieto.name
     ?replace("m2", "(m²)", "i")
     ?replace("_", " ", "i")
     ?cap_first}:</b>
     ${ominaisuustieto.value}
     <br />
    </#if>
   </#list>
 <#else>
  Tämän paikkatietokohteen ominaisuustietoja ei voida näyttää.
 </#if>
</#list>

Lopuksi tarvitaan vielä HTML-dokumentin ”sulkevat” lopputagit. Nämä saadaan lisättyä footer.ftl-tiedoston avulla.

<#-- footer.ftl -->
</body>
</html>

Yllä esitetty ratkaisu on varsin yksinkertainen, mutta FTL-pohjilla pystyy tekemään paljon enemmänkin. Hyviä esimerkkejä ovat mm. erilaisten grafiikoiden upottaminen ominaisuustietokyselyihin, lennossa paikkatietokohteen ominaisuustietojen perusteella luotavat infograafit erillistä Chart API:ia kutsuen ja näytettävän aineiston latauslinkin (WFS tai WCS) generoiminen suoraan samalta rajapintapalvelimelta.

Diagrammien sisällyttäminen GetFeatureInfo-vastaukseen

Seuraavaksi muutamia esimerkkejä siitä, mitä kaikkea FTL-pohjilla voi tehdä GeoServer-palvelimella. Uskallan väittää, että varsin monenlaiseen tarkoitukseen tämä teknologia on kyllä taivuteltavissa. Esimerkit ovat Joensuun kaupungin Oskari-karttapalvelusta, jossa niitä voi katsella vapaasti kuka tahansa. Esimerkeissä nähtävät diagrammit generoidaan toistaiseksi Google Chart API:n avulla, mutta selvittelyssäa on mm. jonkin avoimen ja riippumattoman Chart API:n käyttäminen Googlen Chart API:n sijaan.

GetFeatureInfo esimerkki 1 (infograafit)
Kuva 1: Chart API:n avulla muodostettavia diagrammeja GetFeatureInfo-kyselyn vastauksessa

Kuvassa 1 nähtävään GetFeatureInfo-kyselyn vastaukseen on generoitu erilaisia diagrammeja klikatun paikkatietokohteen (Joensuun kaupungin tilastoalue, jolle on laskettu tietokannassa tunnuslukuja väestöpisteisiin perustuen) ominaisuustietojen perusteella. Pieninä kuvina esitettävien diagrammien lisäksi käyttäjälle tarjotaan myös mahdollisuus avata diagrammi suurempana, jolloin kuvaajassa voidaan näyttää enemmän informaatiota (tällöin Chart API:sta pyydetään suurempi diagrammi).

Käyttäjälle tarjotaan lisäksi mahdollisuus taustalla olevan vektorimuotoisen paikkatietoaineiston lataamiseen WFS-rajapinnalta (lisähuomio: jos haluaa OGC GeoPackagea ulos GeoServerin WFS-rajapinnalta, tarvitaan GeoServeriin lisäosa). Tausta-aineistona toimii PostGIS-tietokannassa oleva materialisoitu tietokantanäkymä.

Tarkastele Joensuun Oskarissa

GetFeatureInfo esimerkki 2 (infograafit ja summatiedot)
Kuva 2: Ympyrädiagrammi ja summatietoja GetFeatureInfo-kyselyn vastauksessa

Kuvassa 2 nähtävässä vastauksessa FTL-pohjan avulla generoidaan ympyrädiagrammi, jossa esitetään edellisenä vuonna tarkastelualueella (Joensuun kaupungin tilastoalue/kaupunginosa) valmistuneet rakennukset rakennustyypeittäin. Tausta-aineistona toimii PostGIS-tietokannassa oleva reaaliaikainen tietokantanäkymä.

Tarkastele Joensuun Oskarissa

Dynaamiset linkit ja valokuvat

Linkkien ja grafiikan lisääminen GetFeatureInfo-kyselyn vastaukseen onnistuu myös FTL-pohjien avulla. FTL-pohjien avulla on mm. mahdollista generoida paikkatietokohteen ominaisuustietona olevasta URL-osoitteesta automaattisesti tarvittava HTML-kielen hyperlinkki -tagi. Mahdollista on myös generoida URL-osoite paikkatietokohteen ominaisuustietojen perusteella. Sama logiikka on mahdollista myös kuvien tapauksessa.

GetFeatureInfo esimerkki 3 (linkkejä)
Kuva 3: Paikkatietokohteen ominaisuustietojen perusteella luotuja linkkejä GetFeatureInfo-kyselyn vastauksessa

Kuva 3 sisältää lähinnä paikkatietokohteen ominaisuustietojen perusteella generoitavia linkkejä. Toteutus on kehitetty RPAS-järjestelmällä tuotettujen ortokuvien hallintaa ja jakelua varten (kuvat prosessoidaan GDAL-kirjastolla sarjakäsittelyrutiinin avulla ja julkaistaan GeoServerille REST-rajapinnan avulla).

Kuvan lisäämisen yhteydessä tuotetaan kuvan maantieteellistä kattavuutta ilmaiseva vektorimuotoinen indeksi QGIS-sovelluksella, jonka avulla kuvausten kattavuutta voidaan tarkastella, ja jonka avulla yksittäisiä kuvia voidaan tarjota käyttäjälle ladattavaksi.

Indeksin käyttöön liittyy lisäksi halu rohkaista käyttäjiä käyttämään aineistoja suoraan OGC-rajapinnoilta kuvien latailemisen sijaan. Tätä varten jokaisen GetFeatureInfo-pyynnön osana tarjoillaan tietoa rajapinnoista ja ohje niiden käyttämiseen (Suorakäytä OGC-rajapinnoilta -osio). Mikäli klikattu kohta sisältää päällekkäin useita kuvia (paikkatietokohteita vektorimuotoisessa indeksissä), näytetään niiden kaikkien latauslinkit (FTL-pohjien #list-toiminto), mutta ainoastaan yksi Suorakäytä OGC-rajapinnoilta -osio.

Tarkastele Joensuun Oskarissa

GetFeatureInfo esimerkki 4 (grafiikkaa, linkkejä)
Kuva 4: Grafiikkaa ja linkkejä ulkoisiin resursseihin GetFeatureInfo-kyselyn vastauksessa

Neljännessä esimerkissä (kuva 4) esitetään kaavoitusprosessin laadinnan yhteydessä tuotetun kulttuuriympäristöselvityksen yhteydessä laaditun paikkatietoaineiston pohjalta muodostettua GetFeatureInfo-vastausta. Kyseessä on ns. yksittäisen rakennusinventointikohteen (pistemuotoinen paikkatietokohde) kohdetiedot.

Varsinaisen paikkatietomuotoon tuotetun kohdetiedon lisäksi kohdetietojen yhteydessä esitetään pienikokoinen valokuva, linkki täysikokoisen kuvan lataamiseksi palvelimelta, linkki kohteen tarkastelemiseksi Google Street View -palvelussa ja linkki selvityksen PDF-raporttiin sivulle, jossa ko. kohdetta käsitellään. Tausta-aineistona toimii PostGIS-tietokannassa oleva tietokantataulu.

Tarkastele Joensuun Oskarissa

Pohjien muokkaaminen on tiedostojen muokkaamista

Pienellä asiaan perehtymisellä GeoServerin ja Apache FreeMarker Template Enginen liitto vaikuttaa hyvin erinomaiselta ratkaisulta. Ainoa huono puoli asiassa on se, että muokatakseen FTL-pohjia, tarvitaan pääsy GeoServer-palvelimen tiedostojärjestelmään. Tämä vaatii sitten palvelimella käytetystä käyttöjärjestelmästä riippuen joko esimerkiksi etätyöpöytäyhteyden tai SFTP-yhteyden muodostamista palvelimelle tiedostojen siirtämiseksi muokkaamiseksi.

Tähän on kuitenkin tullut muutos uusimman GeoServer-julkaisun myötä. GeoServerin 2.17 version myötä päivänvalon on nimittäin nähnyt Web Resource Extension, jonka avulla GeoServerin datahakemistoon on mahdollista päästä kiinni GeoServerin selainpohjaisen käyttöliittymän kautta. Itselläni ei ole vielä kirjoitushetkellä kokemusta tästä uudesta ominaisuudesta, mutta sen ennakko-oletusten valossa se näyttää hyvinkin lupaavalta.