Suhteet kuntoon

Ja nyt ei puhuta parisuhteista vaan relaatioista. Eli tietokannoista ja QGISistä. En ole ihan varma olisiko tuo ensimmäinen helpompi aihe. Jos relaatiot, suhteet ja tietomallit eivät ole tuttuja, kannattaa tutustua aiheeseen ja kirjoihin, kuten Fundamentals of Database Systems (Elmasri & Navathe). Lisäksi QGISin ohjeistus relaatioiden tekemiseen ja attribuuttitaulujen käsittelyyn on todella hyvä (Working with the Attribute Table).

Pekka-pomo tiesi, että nykyään laajasti käytössä olevat relaatiotietokannat (kuten PostgreSQL) perustuvat 1970-luvulla kehitettyyn relaatiomalliin (http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf).  Yksinkertaistettuna relaatiomallissa tiedot organisoidaan sarakkeista ja riveistä koostuviin tauluihin sekä taulujen välisiin relaatioihin. Eli tarvitaan pari taulua ja pohtia miten ne liittyvät toisiinsa.

Tehdään testiaineisto

Helpoiten homman opettelu menee, kun miettii itselleen tutun ja järkevän ja suhteellisen simppelin keissin, jossa taulujen välille pitää muodostaa yhteys. Tässä esimerkissä palaan lempiaiheeseeni, eli puutarhaan.

Puutarha-taulu on päätaulu (parent), joka sisältää ainoastaan puutarhan nimen ja ulkorajauksen. Puutarhaan sisältyy kukkapenkkejä (child). Tärkeää on ymmärtää, että kukkapenkkejä voi olla useita yhden puutarhan sisällä. Eli relaatiomaailmassa tämä on 1:N -relaatio (yhden suhde moneen). Tämä on vielä helppoa käsittää, eikö?

Kukkapenkissä voi olla useita kasvilajeja. Halutaan tietää missä kaikissa kukkapenkeissä kasvaa sama kasvilaji eli myös kasvilajilla on useita kukkapenkkejä. Tällöin tarvitaan monen suhde moneen relaatio (N:M). Sama kasvilaji voi siis liittyä useaan kukkapenkkiin.

Miten tämä hoidetaan QGISissä?

Tässä esimerkissä tehdään GeoPackage, jossa on neljä taulua. Taulut sisältävät puutarhat, kukkapenkit ja lajilistan. Yksi tauluista on aputaulu, joka yhdistää monen-suhde-moneen relaation tarvitsemat kukkapenkit ja lajit. Jos toteutus perustuisi esimerkiksi PostGIS-tietokantaan, johon on viety valmis relaatiomalli, QGIS tunnistaisi relaatiot ja tarvittavat taulut automaattisesti.

Eikun tekee vaan – luodaan taulut

  • Puutarhan_rajaus (polygon), kenttänä fid
  • Kukkapenkki (polygon), kenttänä fid + nimi + fk_puutarha (jonka avulla toteutetaan viittaus puutarhaan)
  • Lajilista (ei-geometriaa sisältävä taulu), kenttänä fid + lajinimi (lisää muutama rivi tietoa tauluun)
  • Lajit_kukkapenkki (ei-geometriaa sisältävä taulu, jolla yhdistetään lajilistat ja kukkapenkki), kenttänä fid, lajit_fk  ja kukkapenkki_fk

Luodaan relaatiot QGIS-työtilaan

Varmista, että työtilassa on kaikki neljä taulua oikeilla kenttänimillä. Avaa QGISin Ominaisuudet > Relaatiot ja määritä taulujen välille yhteydet. Se tehdään tuottamalla tarvittavat relaatiot siten, että taulujen id:t linkittyvät oikein (parent ja child).

QGISin Projektin ominaisuudet > Relaatiot -kohdasta löytyy uuden relaation lisäämisdialogi.

Tarvitaan 1:N-relaatio: Kukkapenkki kuuluu puutarhaan (Puutarhan_rajaus.fidKukkapenkki.fk_puutarha).

Tarvitaan myös N:M-relaatio molempiin suuntiin, tässä käytetään aputaulua: 

  • Kukkapenkki_laji: Kukkapenkki.fid lajit_kukkapenkki.kukkapenkki_fk
  • Laji_kukkapenkki: Lajit.fid – lajit_kukkapenkki.lajit_fkRelaatioiden pitäisi näyttää tältä
Relaatioiden määritysikkuna Projektin ominaisuudet-dialogissa.

Attribuuttitaulun lomakkeen tuunailua

Voit tarkastaa miltä tasojen attribuuttitaulukko näyttää. Seuraava vaihe on tuunata QGISin attribuuttilomakkeita siten, että relaatioiden käyttö on mahdollisimman kätevää.

Klikkaan ensin Puutarhan_rajaus-tason Ominaisuudet > Attribuuttilomake > Drag and Drop. Vedä lomakkeelle vain seuraavat kentät: nimi + tehty relaatio. Tarkista relaation määritykset kuvan mukaiseksi.

Attribuuttitaulun Drag and Drop Designer ja relaatiot.

Säädä myös Kukkapenkki-taulun lomaketta Drag and Drop designerilla ja tarkista, että kentällä fk_puutarha (relaatio puutarhaan) on määritelty relaatio widgettiin. Vedä Taittoon Kukkapenkin_tunniste ja relaatio Kukkapenkki_laji. Säädä Kukkapenkki_laji-relaatiosta, että lomakkeella ei näy linkkausnappulaa.

Relaatio-vimpain.

Säädä Lajit-taulusta Drag and Drop -näkymässä, että lomakkeella näytetään vain yksilölliset arvot Lajeista.

Yksilölliset arvot -vimpain.

Säädä lajit_kukkapenkki-taulusta molemmat relaatiot kuntoon ja salli niiden editointi. Poista näkyvistä muut kuin Laji_fk (sille voi antaa Alias-nimeksi vaikka “Lajin id”). Tarkasta display expression -kohdasta, että vimpain näyttää halutusti lajin nimen eikä id:tä (tämä helpottaa käyttöä).

Alias-nimen määrittely sarakkeelle sekä relaation viite-vimpaimen Display expression-kohta.

Testaa lopputulos

Tarkasta Puutarhan_rajaus taulusta, että lomake näyttää hyvältä, jos haluat, säädä alias-nimiä. Tallenna työtila.

Mene lopuksi Projektin ominaisuuksiin ja salli Transaktiot tasojen välillä. Tällöin sallit sen, että kaikki tasot ovat editoitavana yhtäaikaa. Huomioi, että jos jokin taso on editoitavana, transaktio-nappula ei ole aktiivinen. Eli poista kaikkien tasojen editointitila, jos jokin sattuu olemaan päällä.

Testaa toimiiko piirtämällä ensin puutarhan rajaus ja siihen kuuluva kukkapenkki. Kannattaa tallentaa kohteet välillä ennen lajien syöttöä.

Valmis Puutarhan_rajaus-taulun attiribuuttilomake, jolla voi liittää kukkapenkkejä puutarhaan ja määrittää kukkapenkeille lajeja.

Huomioita QGISin relaatioista

  • Jotta relaation kautta haettavat tiedot voidaan linkittää kohteeseen, pääkohteen pitää olla aina olemassa. Tämän vuoksi, jos kohdetta vasta luodaan, kohde on hyvä tallentaa ensin. 
  • N:M-relaatioissa voi olla tarpeen hakea aputauluun myös jokin toinen kenttä kuin id, sillä se ei aina kerro käyttäjälle kaikkea.
Kukkapenkin lajilistalla näkyy vain lajin id, ei itse lajin nimeä, ellei aputauluun ole lisätty nimi-tietoa.

Topin vinkki geometria-funktion käyttämiseen

On se vaan kiva kun on kollegoja. Pohdin, että varmaan on mahdollista liittää automaattisesti geometriaan perustuvia tietoja toiseen tauluun ja kävi ilmi, että näin on. Topilta sain vinkin, että jos kohde kuuluu johonkin alueeseen, voidaan funktion avulla hakea geometriaan perustuen toisen kohteen tietoja. Esimerkiksi jos piirretään kukkapenkkejä erikseen ja puutarhoja on useita ja kukkapenkki osuu jonkin puutarhan sisälle, siihen tallentuu kyseisen puutarhan id. Tällaisia expressioneita voi tuottaa attribuuttitauluun Oletus-kohtaan. 

aggregate(
layer:= 'Puutarhan_rajaus_c199cd10_d86e_4d68_806e_4e7d2adeb2a4',
aggregate:='concatenate',
expression:=nimi,
concatenator:=', ',
filter:=intersects($geometry, geometry(@parent))

Yllä olevan funktion voi laittaa Oletusarvoksi, joka nappaa sitten oikean id:n päivityksessä, jos kukkapenkki osuus puutarhan kohdalle.

Sanna Jokela
Tietoa

Sanna Jokela on maantieteen FM, jota kiinnostaa erityisesti avoimen lähdekoodin ja avoimen datan verkostot ja yhteistyö, karttojen teko sekä laajat paikkatietojen yhteiskäyttöisyyteen liittyvät projektit. Sanna harrastaa mm. sisustamista ja puutarhan "hoitoa".