Julkaistu 26.6.2019

Kartta-animaatiota QGIS Atlaksen avulla

Olen postaillut verkkoon paljon kartta-animaatioita viimeisten vuosien aikana ja myös kirjoittanut muutaman blogikirjoituksenkin niiden tekemisestä. 

Suurin osa animaatioista on tehty erinomaisella QGISin Time Manager lisäosalla. Time Manager on monella tapaa erinomainen pieni työkalu, mutta varsinaisen animaation ulkoasun ja yksityiskohtien muokkaamiset ovat hieman rajoittuneita. Esimerkiksi resoluutio on riippuvainen QGISin ruudun resoluutiosta eikä QGISin Print Layoutin kaikkia ominaisuuksia ulkoasun hienosäädön suhteen pääse hyödyntämään. 

Keväällä sain idean uudenlaisesta lähestymistavasta kartta-animaatioihin. Näin Twitterissä animaation, jossa “kamera” seuraa kohdetta. Kyseinen animaatio oli tehty käyttäen R-ohjelmointikieltä ja sen gganimate pakettia. Aloin miettimään voisiko saman tehdä QGISillä ja selvisikin että kyllä voi!

Mikä QGIS Atlas?

Atlas on toiminnallisuus QGIS Print Layoutin sisällä, joka lyhyesti sanottuna mahdollista kartantuotannon automoinnin. Tämä tarkoittaa monia asioita, mutta tyypillinen käyttötapaus voisi olla esimerkiksi tarve tuottaa hallinnollisten alueiden kohdalta samanlainen kartta. Jos esimerkiksi Suomesta pitäisi tuottaa jokaisesta 311:sta kunnasta samanlainen väestökartta, vaihtoehdot olisivat joko palkata maantieteen opiskelija kesätöihin tuottamaan niitä karttoja tai tehdä se QGIS Atlaksen avulla. Atlas siis voi iteroida jokaisen siihen lisätyn tason rivin ja luo siitä kartan. 

Valmista videota Atlas ei siis tuota, mutta kuvia joita voi myöhemmin muuttaa videoksi. Lisää Atlaksesta voit lukea virallisesta dokumentaatiosta

Tyypillisesti Atlas on siis tarkoitettu raporttien tekoon, mutta se taipuu moneen muuhunkin. Tällainen “liikkuvan kameran animaatio” tuskin oli alkuperäisten ideoiden joukossa kun Atlasta on kehitetty, mutta omasta mielestäni kiinnostavimmat jutut löytyvät usein kokeellisista jutuista, joissa työkaluja käytetään uudella tavalla. Eli ei muuta kuin vasaroimaan kirveellä!

Dataa animaatioon

Animaation tekemiseen tarvitset tietenkin dataa

Liikkuvan aineiston suhteen on periaatteessa kaksi vaihtoehtoa. Ensimmäinen ja helpoin vaihtoehto on, että sinulla on pisteitä jotka kuvaavat liikkumisen pisteitä tiettynä ajanhetkenä. Datan pitäisi sisältää aikaleimoja tai ainakin joku tieto pisteiden järjestyksestä. Tämä voi olla dataa aktiivisuusrannekkeestasi, ajoneuvojen sijainteja tai jotain aivan muuta, kuten vaikkapa lintujen reittejä Movebank.org -sivustolta. Toinen vaihtoehto on, että sinulla on viivamuotoista paikkatietoaineistoa, jonka varrelle interpoloit pisteitä. Pisteet viivalle voi luoda QGISin sisällä helposti (Vector processing → Points along geometry). Pisteiden määrä riippuu täysin omista tarpeistasi. Animaatiosi voi olla 2 kuvaa tai 200 000 kuvaa. Kokeilumielessä voit myös luoda uuden väliaikaisen viivatason, jolle luot pisteitä.

QGIS

Tarvitset myös taustakartan, koska muuten et huomaa pisteidesi liikkuvan lainkaan. Yksinkertaisinta on käyttää suoraan OpenStreetMap -karttatasoa joka löytyy QGISistä XYZ Tilesien alta. Toinen vaihtoehto on oma WMS-taso, ilmakuva tai vaikka joku oma vektoriaineistosi.

Kuvista animaatioksi Atlaksen avulla

Kun olet saanut pisteet ja datan kuntoon, voit avata uuden Print Layoutin QGISin projektien alta ja lisätä uuden kartan taustan päälle. Säädä taustan muoto ja koko omien tarpeidesi mukaan.

Ensin valikossa ruudun vasemmassa laidassa etene Atlas-välilehdelle ja klikkaa ruutu jossa lukee Generate an Atlas. Tämän jälkeen valitse taso (coverage layer) alasvetovalikosta ja uniikit arvot kohtaan Page name.

QGIS

Tämän jälkeen mene Item properties -välilehdelle ruudun oikeassa laidassa ja valitse keltaisella merkityt kohdat alla näkyvässä kuvakaappauksessa (ruutu jossa lukee Controlled by atlas ja maapalloikoni ruudun ylälaidassa).

QGIS

Tämän jälkeen kun painat sinistä nuolta ruudun ylälaidassa oikealle muutamaan kertaan (ja jos kaikki on mennyt kuten pitääkin) sinun pitäisi nähdä kuinka kartta liikkuu pisteidesi mukaan. Nämä ovat siis elokuvasi ensinäkymät!

QGIS

Jos haluat että kartalla näkyy ainoastaan yksi piste kerrallaan, siirry takaisin QGISin pääikkunaan Print Layoutista. Avaa atlas tason properties-valikko ja valitse tason symboleiksi rule-based symbology. Sieltä avaat tason suodatuksen (filter) ja pääset asettamaan säännön jonka mukaan elementit näkyvät kartalla. Expression String Builderiin asetat distance ominaisuuden vastaamaan Atlaksen sivunimeä. Voit myös toteuttaa tämän lausekkeella $id = @atlas_featureid. Kuulostaa ehkä monimutkaiselta, mutta olennaiset askeleet näkyvät alla kuvakaappauksessa.

QGIS

Tämän jälkeen painelet OK muutamaan kertaan ja suurin osa pisteistä häviää kartalta. Nyt mene takaisin Print Layouttiin ja klikkaile taas sinistä nuolta ja nyt sinun pitäisi nähdä vain yksi piste kerrallaan.

Tämän jälkeen kaikki on kiinni omista visualisointitaidoistasi ja siitä mitä haluat tehdä tyylien kanssa. Ole luova ja lisää vaikka toinen karttaikkuna mukaan tai muokkaa symbolit dynaamiseksi nopeuden mukaan!

Kun olet tyytyväinen lopputulokseen, voit tallentaa kaikki animaation kuvat kuvamuotoon Export Atlas -napista, joka löytyy ruudun ylälaidasta. Tämän jälkeen vain odotat renderöinnin valmistumista.

Videon luominen FFmpegilla

Nyt sinulla pitäisi olla kansio täynnä karttakuvia. 

Lyhyen gif-animaation voi helposti luoda verkossa tai vaikkapa avoimen lähdekoodin kuvankäsittelyohjelma GIMPillä. Kun yksittäisiä kuvia alkaa olemaan enemmän (omana ohjeena yli 200) kannattaa tarkastella muita työkaluja.

FFmpeg on avoimen lähdekoodin komentorivityökalu, jonka avulla voi luoda tehdä hyvin monipuolisia operaatioita videotiedostoille ja esimerkiksi luoda kuvatiedostoista videon. Ajoin Windowsin PowerShellillä seuraavan komennon:

D:\temp_pics\atlas_demo> C:\gis\software\ffmpeg\bin\ffmpeg.exe -r 25 -f image2 -i frame_%05d.png -crf 25 -c:v libx264 -pix_

Komennossa näkyvä -r parametri määrittää videon frameraten, eli nopeuden. Käytän tässä hyvin korkeata numeroa, koska animaatiossa on yli 3000 yksittäistä kuvaa. -f on tiedostoformaatti jota luetaan, -i määrittää luettavan tiedosto nimen muodon. (esim. Kuva_00012.png). On hyvä huomata, että FFmepg haluaa nimien olevan yhtä pitkiä!

Lopuista parametreista -crf määrittää pakkausmuodon, -c:v on videon kodekki ja -pix_fmt määrittää pikseliformaatin. Päädyin yllä näkyviin märityksiin muutaman iteraatiokierroksen jälkeen ja ne toimivat minun käyttötapaukseeni. FFmepgin dokumentaation löydät täältä.

Lopputuotteet

Loin muutaman erilaisen animaation testaillessani Atlaksen toiminnallisuutta. Ensimmäinen on noin 3 000 karttakuvaa ja kaksi karttaikkunaa sisältävä animaatio, jossa on Maanmittauslaitoksen WMS-taustakarttataso ja dynaamisesti nopeuden mukaan muuttuva zoomaus. Varsinainen data on Väylän avointa junien kulkuaineistoa, josta on poimittu junan GPS-tiedot Helsingistä Kemijärvelle kulkevasta junasta. 14 tunnin junamatka on tiivistetty tässä kahteen minuuttiin.

Train Tripping with QGIS Atlas from Topi Tjukanov on Vimeo.

Seuraava video lyhyemmästä raidematkasta, jossa HSL:n avoimesta rajapinnasta on poimittu raitiovaunun 4 reitti läpi Helsingin kantakaupungin. 

Kokeilin myös hieman erilaista liikkuvan kameran animaatiota, joka on lähellä minua alunperin inspiroitunutta animaatiota. Tämä lyhyt gif-animaatio näyttää vuodelta 2015 hurrikaani Ritan jäljet, joissa tuulen nopeus näkyy symbolin koossa. Symbolit saa siis näkyviin myös kumulatiivisesti ja Print Layoutin lausekkeilla myös erilaiset datan ominaisuustiedot ruudulle näkyviin. Tässä käytetyt avoimet datat löytyvät Natural EarthiltaEOX:n taustakarttatasoista ja varsinainen hurrikaanidatan lähde on NOAA.

QGIS

Yksi loistava resurssi Atlaksen opetteluun on Alasdair Raen kotisivu, jossa hänellä on paljon esimerkkejä ja tutoriaaleja. Itse olen kirjoittanut tämän saman blogin myös englanniksi ja myös tutoriaalin QGIS Time Managerin käyttöön

Mukavaa kesää ja hauskoja hetkiä kartta-animaatioiden parissa!

Profiilikuva

Gispo

Gispo on suomalainen avoimen lähdekoodin paikkatietotalo, jonka palveluihin kuuluu paikkatietokonsultointia, sovelluskehitystä, koulutusta sekä ylläpitoa ja tukea.