GRASS GIS - teemakuva

Laitetaanko KuntaGML:ää Geopakettiin?

Kunta-alan tuottamien paikkatietoaineistojen kanssa tekemisissä ollut paikkatietoammattilainen lienee joskus kuullut termin KuntaGML. KuntaGML on Suomen kuntaliiton organisoimissa kehitysprojekteissa kehitetty formaatti kuntien tuottamien paikkatietoaineistojen yhdenmukaistamiseksi ja siirtämiseksi tietojärjestelmästä toiseen. KuntaGML perustuu OGC:n GML-formaattiin.

KuntaGML:n tietorakenne poikkeaa tavallisen GML:n tietorakenteesta. Suurin eroavaisuus tavalliseen GML:ään on se, että KuntaGML sisältää ns. kompleksisia tietotyyppejä mistä johtuen KuntaGML-aineistot ovat haasteellisia monillr normaaleja GML-aineistoja lukeville paikkatietosovelluksille.

Tässä artikkelissa ihmetellään, miten KuntaGML WFS-rajapinnan aineistoja voidaan lukea avoimen lähdekoodin paikkatietosovellus GRASS GIS:llä. GRASS GIS:n tuki KuntaGML-rajapinnalle ei ole täydellinen, mutta sitä voi hyödyntää KuntaGML-rajapintojen tutkimiseen.

GRASS GIS  on avointen paikkatietosovellusten raskassarjalainen

GRASS GIS on erittäin monipuolisen toimintovalikoiman sisältävä avoimen lähdekoodin paikkatietosovellus. GRASS GIS:n käyttölogiikka poikkeaa hieman muista yleisesti käytetyistä paikkatietosovelluksista, mistä johtuen jotkut pitävät GRASS GIS:iä hieman vaikeasti lähestyttävänä paikkatietosovelluksena.

Tähän fiilikseen oli helppo yhtyä, etenkin käytön alkuvaiheessa. Aikansa sovellusta käytettyään GRASS GIS:n logiikkaan alkaa kuitenkin tottua. Niille jotka eivät totu, tarjoaa tässä artikkelissa esitetty skripti toivottavasti vähän helpotusta elämään 🙂

Omasta mielestäni GRASS GIS:n mahtavin ominaisuus on se, että sen toimintaa voi ohjata komentoriviltä. Tämä mahdollistaa mm. sen, että aineistoja voidaan sarjakäsitellä ja työnkulkuja automatisoida.

GRASS GIS:n ajaminen komentoriviltä ei varsinaisesti ole mitään avaruustiedettä, mutta sen saaminen toimimaan ns. stand alone -periaatteella (ilman, että ennakkoon ei ole määritelty LOCATION- ja MAPSET-arvoja) vaatii melkoisen komentokavalkaadin suorittamisen ennen varsinaisten GRASS-komentojen suorittamista.

GRASS GIS:n on saatavilla useille eri käyttöjärjestelmille. Tässä esimerkissä GRASS GIS -paikkatietosovellusta käytetään Windows 10 -käyttöjärjestelmässä Windows-järjestelmän komentoriviä (CMD.exe) hyödyntäen. Muiden käyttöjärjestelmien komentoriviä hyödynnettäessä komennot tulee kirjoittaa ko. komentorivin syntaksia noudattaen.

GRASS käyntiin ilman sessiota

Erotuksena käytännölliseen GDAL-kirjastoon, ei GRASS GIS -työkalujen ajaminen onnistu pelkästään työkalua komentoriviltä kutsumalla. Toimiakseen GRASS GIS -paikkatietojärjestelmän työkalut vaativat mm. tietyllä tavalla määritellyn datahakemiston vaadittuine kansioineen ja tiedostoineen. Tämän lisäksi myös eräitä GRASS:n tarvitsemia ympäristömuuttujia tulee olla määritelty.

Käytetyn GRASS GIS -paikkatietosovelluksen versio vaikuttaa myös skriptin toimintaan, sillä skriptissä kutsutaan nimen omaisesti GRASS GIS -sovelluksen versiota 7.4 (uusin versio kirjoitushetkellä). Vaikutusta on myös QGIS:n versiolla, sillä tässä tapauksessa GRASS GIS on asennettu QGIS-paikkatieto-ohjelman asennuksen yhteydessä (GRASS majailee QGIS:n asennuspolussa).

Viittaaminen johonkin tiettyyn levyasemalla olevaan hakemistorakenteeseen toimisi hyvin, mikäli skriptiä ajettaisiin koneilla joissa on vakioitu kansiorakenne. Tällaista tilannetta ei kuitenkaan ole, joten ajon alkajaisiksi skripti kysyy käyttäjältä kansiota, jonka sisälle skripti luo GRASS GIS:n vaatiman kansiorakenteen tarvittavine tiedostoineen. Kohdehakemistoksi sopii vaikkapa käyttöjärjestelmän TEMP-kansio.

Skripti muodostaa lennossa GRASS GIS -paikkatietosovelluksen tarvitsemat WIND, VAR- ja GISRC-tiedostot. WIND-tiedosto liittyy GRASS GIS -sovelluksen sijainnin (LOCATION) hallintaan ja käynnistettäessä GRASS GIS -sessiota sitä ei vielä tässä tapauksessa tiedetä. Tästä johtuen käynnistysvaiheessa luodaan tyhmä WIND-tiedosto, joka ei sisällä mitään tiettyä sijaintia. Sijainti asetetaan myöhemmin käyttäjän antaman EPSG-tunnisteen perusteella.

VAR-tiedostossa määritellään tietokanta-ajuri, jota GRASS GIS käyttää tiedon tallentamiseen ohjelman sisällä. Uudemmat versiot GRASS GIS -paikkatietosovelluksesta hyödyntävät SQLite-tietokantaa ja vanhemmat yleensä dBASE-tietokantaa. Tässä esimerkissä käytetään SQLite-pohjaista tietokantaa.

GISRC-tiedostossa määritellään käytettävä datahankemisto sekä käynnistyksen yhteydessä ladattava sijainti ja karttajoukko. Tiedostossa määritellään lisäksi se, että GRASS GIS-halutaan käynnistyvän ilman graafista käyttöliittymää.

Lisäksi skriptissä tulee määritellä ympäristömuuttujat, jotka kertovan GRASS GIS:lle mm. mistä kansiosta GRASS GIS löytää tarvittavat ohjelmapätkät ja suorituksenaikaiset skriptit. Nyt kun kaikki tarvittavat ennakkovalmistelut on tehty, voidaan skriptissä kutsua varsinaista GRASS GIS -sovellusta (grass74.bat). Alla skriptin sisältö kokonaisuudessaan. Linkki valmiiseen komentojono-tiedostoon löytyy artikkelin lopusta.

:: KuntaGML-rajapinnan aineistoja OGC GeoPackageen muuntava GRASS-skripti - paikkatietomies.fi

@ECHO OFF

:: QGIS-ohjelman hakemisto
SET QGIS_KANSIO = "C:\Program Files\QGIS 3.2"

:: GRASS GIS:n käynnistävän BAT-tiedoston sijainti
SET GRASS_BAT_SIJAINTI = %QGIS_KANSIO%\bin\

:: Kirjoitetaan ruudulle skriptin käynnistyksen alkusanat
ECHO KuntaGML-rajapinnan aineistoja OGC GeoPackageen muuntava GRASS-skripti - paikkatietomies.fi
ECHO GRASS GIS -paikkatietosovelluksen alustusskriptin (grass74.bat) tulee olla kansiossa %GRASS_BAT_SIJAINTI%
ECHO ---

ECHO Aloita antamalla prosessoinnissa tarvittavia tietoja (paina jotakin)
PAUSE > NUL

:: Pyydä käyttäjältä WFS-rajapinnan tietoja
SET /P WFS_GETCAPABILITIES_URL= Anna WFS-rajapinnan GetCapablities URL (lopeta kysymysmerkkiin):
SET /P WFS_TASON_NIMI= Anna muunnettavan WFS-tason nimi palvelimella:
SET /P WFS_TASON_EPSG_TUNNISTE= Anna WFS-tason EPSG-tunniste (esim. EPSG:3067 tulee antaa muodossa 3067):
SET /P ULOSKIRJOITTETAVAN_TIEDOSTON_NIMI= Anna tallennettavan GeoPackage-tiedoston nimi:
SET /P PROSESSOINTIKANSIO= Anna prosessointikansion polku (esim. C:\TEMP):

:: Tiedot annettu, ilmoitetaan käyttäjälle etenemisestä
ECHO Tarvittavat tiedot annettu. Aloita aineiston haku WFS-rajapinnasta (paina jotakin)
PAUSE > NUL

:: GRASS GIS -ohjelman hakemisto
SET GISBASE = %QGIS_KANSIO%\apps\grass\grass-7.4.1

:: Prosessointikansion luonti
SET PROSESSOINTIKANSIO_POLKU = %PROSESSOINTIKANSIO%\GRASS

:: Määritellään luotu hakemisto GRASS GIS:n datahakemistoksi
SET GISDBASE = %PROSESSOINTIKANSIO_POLKU%

:: Määritellään GRASS-sijainti
SET LOCATION_NAME = GRASS_SIJAINTI

:: Määritellään GRASS-karttajoukko
SET MAPSET = KUNTAGML

:: Käynnistetään GRASS tekstitilassa
SET GUI = text

:: Luodaan prosessointihakemisto
MKDIR %PROSESSOINTIKANSIO_POLKU%

:: Luodaan GRASS GIS:n sijaintia ja karttajoukkoa varten kansiot
MKDIR %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%
MKDIR %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT
MKDIR %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%
MKDIR %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\sqlite

:: Muodostetaan karttajoukon WIND-tiedosto
ECHO proj: 0 > %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO zone: 0 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO north: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO south: 0 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO east: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO west: 0 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO cols: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO rows: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO e-w resol: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO n-s resol: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO top: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO bottom: 0 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO cols3: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO rows3: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO depths: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO e-w resol3: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO n-s resol3: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND
ECHO t-b resol: 1 >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND

:: Muodostetaan PERMANENT-karttajoukon DEFAULT_WIND-tiedosto 
COPY %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT\DEFAULT_WIND"

:: Kopioidaan luotu WIND-tiedosto PERMANENT-karttajoukkoon
COPY %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\WIND %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT\WIND"

:: Muodostetaan VAR-tiedosto
ECHO DB_DRIVER: sqlite > %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\VAR
ECHO DB_DATABASE: %GISDBASE%\%LOCATION_NAME%\%MAPSET%\sqlite\sqlite.db >> %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\VAR

:: Kopioidaan VAR-tiedosto PERMANENT-karttajoukkoon
COPY %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\%MAPSET%\VAR %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT\VAR"

:: Määritellään GISRC-tiedoston sijainti
SET GISRC = %GISBASE%\gisrc

:: Muodostetaan GISRC-tiedosto
ECHO GISDBASE: %GISDBASE% > %GISRC%
ECHO LOCATION_NAME: %GISDBASE%\%LOCATION_NAME% >> %GISRC%
ECHO MAPSET: %GISDBASE%\%LOCATION_NAME%\%MAPSET% >> %GISRC% 
ECHO GUI: %GUI% >> %GISRC%

:: Asetaan tarvittavat polut
SET PATH=%PATH%;%QGIS_KANSIO%\bin
SET PATH=%PATH%;%GISBASE%\bin
SET PATH=%PATH%;%GISBASE%\lib
SET PATH=%PATH%;%GISBASE%\scripts

:: Luodaan kansio johon tallennetaan GeoPackage-tiedosto
MKDIR %PROSESSOINTIKANSIO_POLKU%\GPKG

:: Ajetaan GRASS GIS:n WFS-rajapintaa lukeva komento
CALL %QGIS_KANSIO%\bin\grass74.bat %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT --exec v.in.wfs url=%WFS_GETCAPABILITIES_URL% output=%ULOSKIRJOITTETAVAN_TIEDOSTON_NIMI% name=%WFS_TASON_NIMI% srs=EPSG:%WFS_TASON_EPSG_TUNNISTE% maximum_features=100000

:: Ajetaan GRASS GIS:n komento jolla asetetaan PERMANENT-karttajoukon sijainniksi käyttäjältä pyydetty EPSG-koodi
CALL %QGIS_KANSIO%\bin\grass74.bat %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT --exec g.proj --quiet -c epsg=%WFS_TASON_EPSG_TUNNISTE%

:: Ilmoitetaan käyttäjälle, että tiedot on haettu WFS-rajapinnalta
ECHO Aineisto haettu WFS-rajapinnalta. Aloitetaan aineiston kirjoitus GeoPackage-muotoon (paina jotakin)
PAUSE > NUL

:: Kirjoitetaan WFS-tason sisältö GeoPackage muotoon käyttäjän antamaan kansioon
CALL %QGIS_KANSIO%\bin\grass74.bat %PROSESSOINTIKANSIO_POLKU%\%LOCATION_NAME%\PERMANENT --exec v.out.ogr input=%ULOSKIRJOITTETAVAN_TIEDOSTON_NIMI%@PERMANENT output=%PROSESSOINTIKANSIO_POLKU%\GPKG\%ULOSKIRJOITTETAVAN_TIEDOSTON_NIMI%.gpkg format=GPKG

:: Ilmoitetaan käyttäjälle, että valmista tuli 
ECHO Valmista tuli! GeoPackage-tiedosto on tallennuttu sijaintiin: %PROSESSOINTIKANSIO_POLKU%\GPKG
PAUSE > NUL

CMD /k

Skripti hakee, muuntaa ja tallentaa

Kuten ylläolevaa skriptiä tarkastelemalla voidaan havaita, tulee melkoiset seremoniat suorittaa ennen kuin skriptissä voidaan kutsua varsinaista GRASS GIS -paikkatietosovellusta. Skriptissä käytettävistä komentorivikomennoista ei tässä yhteydessä sen enempää (halukkaat voivat tiedustella lisätietoja sähköpostitse tai kommentoida artikkelia).

KuntaGML-rajapinnan lukemiseen käytetään GRASS GIS -järjestelmän v.in.wfs -työkalua, joka suoriutuu tästä tehtävästä näennäisesti hyvin. Parametreiksi ko. työkalulle annetaan käyttäjältä skriptin suorituksen alussa pyydetyt WFS-rajapinnan GetCapabilities-dokumentin URL-osoite, WFS-tason nimi palvelimella, EPSG-tunniste ja karttatason nimi GRASS GIS:n sisällä. Haettavien kohteiden määrä on tässä esimerkissä rajattu 100 000 kappaleeseen (maximum_features=100000), joka riittänee useimmissa tapauksissa.

Seuraavassa vaiheessa GRASS GIS -sovellukseen ladatulle aineistolla määritellään koordinaattijärjestelmä (GRASS GIS -istuntoa alustettaessahan luotiin ns. tyhmä sijainti, joka nyt päivitetään oikeaksi). Karttatasolle määritellään sijainti g.proj -työkalulla, jolle annetaan parametriksi käyttäjältä skriptin suorituksen alussa pyydetty EPSG-tunniste.

Viimeisessä vaiheessa GRASS GIS -paikkatietosovellukseen ladattu WFS-aineisto tallennetaan GeoPackage-muotoon. GeoPackage on OGC:n kehittämä formaatti paikkatietoaineistojen tallentamiseen. GeoPackagen hienous on siinä, että sen sisään voi tallentaa useita karttatasoja (GeoPackage perustuu SQLite-tietokantaan) ja jopa sijaintitiedon sisältäviä rasterikuvia. Tuki GeoPackage-formaatille on nykyään vakio-ominaisuutena useimmissa paikkatieto-ohjelmissa.

Tallennus GeoPackage-formaattiin tapahtuu GRASS GIS:n v.out.ogr -työkalulla. Parametreiksi ko. työkalulle annetaan uloskirjoitettavan karttatason nimi GRASS GIS -sovelluksessa, muodostettavan GeoPackage-tiedoston nimi täydellisen tiedostopolun kanssa. Koordinaattijärjestelmän v.out.ogr -työkalu lukee karttatasojoukosta.

Testaillaan skriptiä

Skriptiä voi käyttää niinkin yksinkertaisesti, että lataa oheisen ZIP-pakatun komentojono-tiedoston omalle tietokoneelleen, purkaa sen ja tuplaklikkaa sitä. Skriptin suoritus käynnistyy, jolloin se avaa Windows-käyttöjärjestelmän komentokehoitteen ja ilmoittaa suorituksen alkamisesta (kuva 1).

KuntaGML-rajapinnalta aineistoja hakeva GRASS-skripti käynnistetty
Kuva 1: Skriptin suorituksen alussa käyttäjää kehoitetaan painamaan jotakin näppäintä.

Suorituksen alussa käyttäjää pyydetään syöttämään KuntaGML-aineiston hakemisessa tarvittavia tietoja. Tällaisia tietoja ovat KuntaGML-rajapinnan osoite (kysymysmerkkiin päättyen), WFS-tason nimi palvelimella, WFS-tason EPSG-tunniste, tallennettavan GeoPackage-tiedoston nimi ja työkansio. Kun tarvittavat tiedot on annettu, voidaan skriptin suoritus käynnistää (kuva 2).

Tässä esimerkissä tietoja noudetaan Lahden kaupungin testikäytössä olevalta avoimelta KuntaGML-rajapinnalta. Lisätietoja Lahden kaupungin tarjoamista avoimista paikkatietoaineistoista ja rajapinnoista löydät Lahden kaupungin Paikkatietoaineistot-internetsivuilta.

KuntaGML-aineiston haku voidaan käynnistää
Kuva 2: Skriptiä testataan hakemalla Lahden kaupungin avoimelta KuntaGML-rajapinnalta kaavayksiköt.

Mikäli skriptissä kutsuttava GRASS GIS onnistuu noutamaan aineistoja KuntaGML-rajapinnalta, ei skriptin konsoliin tulostu mitään epämäärisiä virheilmoituksia – ainoastaan suorituksenaikaisia varoitus-tasoisia ilmoituksia. Skripti toimii ainoastaan autentikoimattomien KuntaGML-rajapintojen tapauksissa, joten jos haluat testata jotakin autentikointia vaativaa KuntaGML-rajapintaa tällä skriptillä, tarvitsee skriptiä muokata. Onnistuneen KuntaGML-aineiston noudon (ja sijainnin asettamisen) jälkeen käyttäjälle annetaan ilmoitus onnistuneesta hausta ja käyttäjää pyydetään etenemään GeoPackage-aineiston kirjoitukseen (kuva 3).

KuntaGML-aineisto noudettu WFS-rajapinnalta
Kuva 3: Skripti on yhdistynyt KuntaGML-rajapintaan ja noutanut aineistot rajapinnalta GRASS GIS -karttatasolle.

Mikäli kaikki menee putkeen myös aineiston uloskirjoituksessa, vältytään konsolissa virheilmoituksilta. Mikäli aineiston haku KuntaGML-rajapinnalta on jostakin syystä epäonnistunut, tulee virheilmoituksia luonnollisesti myös uloskirjoituksen yhteydessä. Suorituksen lopuksi skripti tulostaa konsoliin vielä tiedostopolun, josta luotu GeoPackage-tiedosto on löydettävissä, mikäli aineisto on siis onnistuneesti haettu KuntaGML-rajapinnalta ja muunnettu GeoPackage-muotoon (kuva 4).

KuntaGML-aineisto tallennettu OCG GeoPackage -formaatiin
Kuva 4: Skripti on tallentanut GeoPackage-tiedoston käyttäjän ilmoittamaan työkansioon.

Katsellaan lopputulosta

Otetaan selvää, että millaista aineistoa skripti tallensi GeoPackage-tiedostoon ja avataan se jollakin sitä tukevalla paikkatietosovelluksella. Tässä esimerkissä GeoPackage avataan QGIS-paikkatietosovelluksella. Aineiston avaamisvaiheessa huomataan, että GeoPackage-tiedosto sisältää piste- ja aluegeometrioita. Tässä tullaan artikkelin alkusanoissakin todettuun KuntaGML-formaatin haasteellisuuteen paikkatietosovelluksille.

Näyttää siltä, että osa aluemuotoista paikkatietokohteista (tässä tapauksessa kaavayksiköistä) ei tule perille saakka alueina, vaan geometrioita muuntautuu jossakin vaiheessa prosessia pistemäisiksi. Tämä arvio perustuu seuraavaan visuaalisesti tehtyyn havaintoon: alueella, jolta näyttäisi puuttuvan aluemainen geometria, on kuitenkin pistemäinen geometria. Tätä havaintoa tukee myös se, että pistemäisen geometrioiden omaisuustiedot näyttäisivät vastaavan ympäröivien kaavayksiköiden ominaisuustietoja loogisuutensa puolesta.

Vaihe, jossa alueet muuntuvat pisteiksi, on mitä ilmeisemmin jo KuntaGML-rajapinnalta tehtävä haku (GRASS:n konsoliin tulostuu jo siinä vaiheessa viestejä, että rajapinnalta tuotiin pistemäisiä paikkatietokohteita). Se mistä tämä johtuu, onkin sitten asia jota tulee selvitellä tarkemmin. Todennäköisesti kyse on GRASS GIS -paikkatietosovelluksen kyvystä käsitellä kompeksisia tietotyyppejä.

Valtaosa aluemuotoisista paikkatietokohteista tulee kuitenkin perille ongelmitta ominaisuustietoineen, jolloin niitä voi jatkohyödyntää haluamallaan tavalla. Alla olevassa esimerkissä (kuva 5) tarkastellaan Lahden kaavayksiköitä Lahdenseudun Opaskartan (haettu Lahden kaupungin WMS-rajapinnalta) päällä. Oheisessa kuvassa aluemuotoiset kaavayksiköt (oikein muodostuneet paikkatietokohteet) on esitetty sinisellä viivasymbolilla ja pistemäiset kaavayksiköt (paikkatietokohteet joiden geometria ei todennäköisesti ole oikein) punaisella pistesymbolilla.

Lahden kaupungin KuntaGML-rajapinnasta haetut asemakaavan kaavayksiköt Lahdenseudun Opaskartan päällä tarkasteluna
Kuva 5: Lahden kaupungin KuntaGML-rajapinnan aineistoja GeoPackage muodossa QGIS-paikkatietosovelluksessa. Taustakarttana Lahdenseudun Opaskartta Lahden kaupungin WMS-rajapinnalta.

Lopputulema

Skripti näyttäisi toimivan, mikäli KuntaGML-rajapinta on autentikoimaton ja palauttaa kelvollisen vastauksen WFS-standardin mukaiseen GetFeature-kyselyyn.

Halusin verrata GRASS GIS:n kykyä lukea KuntaGML-rajapintaa johonkin muuhun samaan toiminnallisuuteen kykenevään sovellukseen, joten kokeilin toteuttaa saman muunnoksen (KuntaGML WFS > OGC GeoPackage) myös eräällä kaupallisella KuntaGML-rajapintoja lukemaan kykenevällä ETL-sovelluksella. Pieneksi ihmetyksekseni havaitsin lopputuloksen olevan pääosin samanlainen, itse asiassa kaupallinen toteutus palauttaa paikkatietokohteita hieman vähemmän. GRASS GIS:n kyky suoriutua hommasta on siis vähintäänkin kohtuullinen.

Tässä vaiheessa on lisäksi hyvä todeta, ettei skripti ei ole mitenkään erityisen viimeistelty ja saattaa sisältää logiikkaa, jota ei välttämättä tarvita, ja joka ei ole kaikkien CMD-ohjelmoinnin parhaiden käytäntöjen mukaista. GRASS GIS:n saaminen toimimaan stand alone -periaatteella luetutti melkoisen määrän aiheeseen liittyviä englanninkielisiä ohjeita/keskustelupalstalankoja, ja vaati muutaman harjoituskerran ennen kuin tieto alkoi siirtymään. Lisäksi internetin GRASS-ohjeet ovat pääasiassa Linux-ympäristöön suunnattuja, mistä johtuen niitä joutui hieman soveltelemaan Windowsin-komentorivin puolella.

Homma kuitenkin kannatti, sillä nyt ollaan hitusen viisaampia mm. siinä, miten GRASS GIS:iä voidaan käyttää komentoriviltä itsenäisesti. Tätä osaamista tulen takuulla hyödyntämään jatkossa, sillä GRASS GIS -paikkatietojärjestelmässä on useita mielenkiintoisia ja testaamisen arvoisia työkaluja, joita on on kätevää ajaa osana GDAL-kirjaston työkaluihin muuten turvaavassa skriptissä.

Kovasti olisi toiveissa, että GRASS GIS -ohjelmiston kyky lukea KuntaGML-rajapintoja, ilman että aineistojen geometrioita hajoilee matkalla, paranisi jatkossa. KuntaGML-tukea toivoisi toki myös huomattavasti helpommin käytettävissä olevaan GDAL-kirjastoon. Mikäli KuntaGML-rajapintoja haluaa tutkia jollakin muulla avoimen lähdekoodin paikkatietosovelluksella, kannattaa jatkotutkimukset suunnata Gaia 3 -nimiseen paikkatietosovellukseen, joka osaa myös avata KuntaGML-rajapintoja.

Ja tässä vielä linkki, jonka kautta voit ladata skriptin ZIP-pakattuna. Skriptiä voi kokeilla, hyödyntää ja jatkokehittää vapaasti omiin tarkoituksiin sopivaksi. Ja näin loppuun on vielä paikallaan lausua kiitokset Lahden kaupungille avoimesta KuntaGML-rajapintatoteutuksesta, jota saatoin käyttää tässä esimerkissä demoaineistona.

Täydennys 21.7.2021: Artikkelissa käytetty Lahden kaupungin ylläpitämä KuntaGML-rajapinta ei näyttäisi olevan enää toiminnassa.