31  Maakaardid

Mõnikord on andmetel ka ruumiline mõõde, mis määrab vaatluste paiknemise geograafilises ruumis. Mõned andmed hõlmavadki ainult vaatluste paiknemist ruumis ilma mingi muu, mitteruumilise teabeta vaatluste kohta. Mõlemal juhul võib anda ruumilise mõõtme kirjeldamine ja analüüsi kaasamine sellist teavet vaatluste ja tunnuste kohta, mis muidu võib jääda märkatama. Nii saame arvesse võtta näiteks uuritavate nähtuste vahelisi kaugusi. Digitaalsete ruumiandmete kasutamine võetakse mõnikord kokku ka geoinfosüsteemi mõistega.

Andmete kujutamise viis sõltub sellest, kas eesmärk on kirjeldada andmete ruumi või siis hoois kujutatavat objekti. Sellest lähtub ka maakaadi vormistamse viis.

Important

Kõige üldisemalt võib digitaalsed maakaardid jagada kaheks:

  • rasterkaardid, millel on iga ruudukujuline osa mingist suuremast alast esitatud ühe pikslina;
  • vektorkaardid, millel on esitatud mitmesugused objektid punktide alusel.

Kaardiandmete vorming määrab võimalused andmete kujutamiseks ja nende alusel arvutuste tegemiseks.

Kõige lihtsam viis maakaarte mõista on läheneda neile kui piltidele. Digitaalses vormingus pildid koosnevad pikslitest, millest igaühel on mingi väärtus. Nii on see ka rasterkaardi puhul, kus pikslid esindavad maa-alasid. Teine viis on mõelda rasterkaardist kui andmemaatriksist, milles iga lahter on konkreetne maa-ala. Üks piksel pildil või lahter andmemaatriksis on rasterkaardi korral kaardiruut, mis esindab maastikul nt hektarit, ruutkilomeetrit või muu mõne suurusega ruudukujulist ala.

Nendes kaardiruutudes võivad väärtuse esineva kahte liiki skaalal:

Konkreetsete objektide kuvamiseks rasterkaardil peaksime seda lihtsustama vastavalt kaardiruutudele. Objekte on ruumis seetõttu vaistlik kujutada nende võimalikult täpse asukoha või piiride alusel mingil koordinaatteljestikul. Vektorkaarditel kujutatakse objektid vastavalt nende asukohale või piiridele sõltuvalt objekti omadustest:

Sealjuures sõltub objekti liik selle kujutamise täpsusest. Kui suure mõõtkava korral esitatakse objektid kujundina, siis väiksel mõõtkaval piisab objekti keskpunktist, sest kujund ei ole siis väiksuse tõttu eristatav.

31.1 Raster

Järgnevalt uurime rahvaarvu ruutkilomeetril ehk rahvastiku tihendust Eestis. Sellised andmed on sageli vormistatud andmetabelina, kus iga ruutkilomeeter on andmetabelis eraldi real. Kaardiruudud paiknevad sealjuures järjesttikku.

library('magrittr')
rahvaarv <- read.csv('andmed/rahvaarvraster.csv')
head(rahvaarv)
        x       y arv06 arv11 arv18
1 5032000 3925000     0     0     0
2 5031000 3926000     0     0     0
3 5032000 3926000     0     0     0
4 5102000 3926000     0     0     0
5 5103000 3926000     0     0     0
6 5104000 3926000     0     0     2

Andmetabelina esitatud rasterkaardi alusel on tunnuseid kasutades arvutuste tegemine lihtne. Vaatlusaluste andmete korral saame arvutada nt rahvaarvu muutuse aastate 2006 ja 2018 võrdluses iga ruutkilomeetri kohta. Samuti saame ruutude põhjal rahvastiku tihedust kirjeldada.

rahvaarv$muutus <- rahvaarv$arv18 - rahvaarv$arv06
summary(rahvaarv)
       x                 y               arv06              arv11         
 Min.   :5007000   Min.   :3925000   Min.   :    0.00   Min.   :    0.00  
 1st Qu.:5150000   1st Qu.:4002000   1st Qu.:    0.00   1st Qu.:    0.00  
 Median :5217000   Median :4044000   Median :    0.00   Median :    0.00  
 Mean   :5208866   Mean   :4048577   Mean   :   29.27   Mean   :   28.43  
 3rd Qu.:5278000   3rd Qu.:4094000   3rd Qu.:    6.00   3rd Qu.:    6.00  
 Max.   :5367000   Max.   :4185000   Max.   :18404.00   Max.   :17375.00  
     arv18              muutus         
 Min.   :    0.00   Min.   :-4612.000  
 1st Qu.:    0.00   1st Qu.:    0.000  
 Median :    2.00   Median :    0.000  
 Mean   :   29.38   Mean   :    0.114  
 3rd Qu.:    6.00   3rd Qu.:    2.000  
 Max.   :16861.00   Max.   : 5749.000  

Näeme, et kõige suurema tihedusega ruutkilomeetril elas Eestis 2018. aastal peaaegu 17 tuhat inimest. Aastate 2006 ja 2018 võrdluses kasvas neljandikus ruutudest rahvaarv vähemalt 2 inimese võrra.

Ruudustikku esndavat andmetabelit saame joonistada kasutades ggplot käsku koos funktsiooniga geom_raster().

library('ggplot2')
ggplot(rahvaarv) + aes(x = x, y = y, fill = arv18) + 
  coord_fixed() + 
  geom_raster() + 
  labs(fill = "Rahvaarv") + 
  scale_fill_distiller(trans = 'log', labels = round, 
                       palette = 'Spectral', na.value = 'gray95') + 
  theme_void()
Warning: Transformation introduced infinite values in discrete y-axis
Warning: Raster pixels are placed at uneven horizontal intervals and will be shifted
ℹ Consider using `geom_tile()` instead.

Mõnikord on maakaardid salvestatud pildina, nt .tif faililaiendiga. Sellised kaardid saame R keskkonda sisestada funktsiooniga raster ja seejärel kuvada tm_shape() käsuga.

library('raster')
arv18 <- raster('andmed/rahvaarvraster18.tif')
library('tmap')
tm_shape(arv18) + tm_raster(style = 'quantile')

Teine võimalus on teisendada rasterkaardid andmetabeliks, mis võimaldab teha arvutusi ja kasutada joonistamiseks funktsiooni gglot2() nii nagu eelnevalt näidatud.

arv18 %<>% rasterToPoints %>% as.data.frame
head(arv18)
        x       y rahvaarvraster18
1 5231000 4185000                0
2 5243000 4172000                0
3 5243000 4171000                0
4 5245000 4170000                0
5 5332000 4170000                0
6 5333000 4170000              202

Kuna rasterkaardid on sisuliselt pildid, siis enamasti on ühel rasterkaardil ainult üks kiht (raster band). Seetõttu saame rasterkaardil korraga esitada ainult ühe tunnuse väärtused, milleks antud juhul on rahvaarv aastal 2018.

31.2 Punktid

Punktide kujutamise näitena uurime süütegusid Eestis. Käsitleme ainult vandalismijuhtumeid.

teod <- read.csv('andmed/süüteod.csv')
teod <- teod[grep('vandalism', teod$sündmus), ]
teod$aasta <- format(as.Date(teod$kuupäev), '%Y') %>% as.numeric
teod$nädalapäev <- strftime(teod$kuupäev, '%A')
teod$kahjusumma %<>% as.factor
str(teod)
'data.frame':   7969 obs. of  8 variables:
 $ lon       : num  536750 622250 540250 550250 542750 ...
 $ lat       : num  6581250 6405750 6584250 6589250 6588750 ...
 $ kuupäev   : chr  "2022-11-19" "2022-11-19" "2022-11-18" "2022-11-14" ...
 $ nädalapäev: chr  "Saturday" "Saturday" "Friday" "Monday" ...
 $ sündmus   : chr  "vandalism" "vandalism" "vandalism" "vandalism" ...
 $ koht      : chr  "avalik_koht,tanav_valjak" "avalik_koht" "avalik_koht,tanav_valjak" "avalik_koht,uhissoiduk" ...
 $ kahjusumma: Factor w/ 4 levels "0-499","500-4999",..: NA 1 1 1 NA 1 1 1 1 2 ...
 $ aasta     : num  2022 2022 2022 2022 2022 ...

Näeme, et andmetabeli esimestes veergudes on koordinaadid. Saame kujutada vaatlused nende koordinaatide alusel hajuvusjoonisel, mille tulemuseks ongi maakaart süütegude asukohtadega.

plot(teod[, 1:2])

Koordinaatidega andmetabeli saame teisendada nö ruumiliseks andmetabeliks, määrates koordinaate sisaldavad veerud ja koordinaatsüsteemi.

library('sf')
Linking to GEOS 3.12.0, GDAL 3.7.1, PROJ 9.2.1; sf_use_s2() is TRUE
teodSf <- st_as_sf(teod, coords = c('lon', 'lat'), crs = st_crs(3301))
teodSf
Simple feature collection with 7969 features and 6 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 396499.5 ymin: 6387500 xmax: 738749.5 ymax: 6613500
Projected CRS: Estonian Coordinate System of 1997
First 10 features:
       kuupäev nädalapäev                           sündmus
21  2022-11-19   Saturday                         vandalism
25  2022-11-19   Saturday                         vandalism
36  2022-11-18     Friday                         vandalism
63  2022-11-14     Monday                         vandalism
71  2022-11-13     Sunday                         vandalism
112 2022-11-10   Thursday vandalism,avaliku_korra_rikkumine
113 2022-11-10   Thursday vandalism,avaliku_korra_rikkumine
114 2022-11-10   Thursday                         vandalism
121 2022-11-09  Wednesday                         vandalism
128 2022-11-08    Tuesday                         vandalism
                        koht kahjusumma aasta                 geometry
21  avalik_koht,tanav_valjak       <NA>  2022 POINT (536749.5 6581250)
25               avalik_koht      0-499  2022 POINT (622249.5 6405750)
36  avalik_koht,tanav_valjak      0-499  2022 POINT (540249.5 6584250)
63    avalik_koht,uhissoiduk      0-499  2022 POINT (550249.5 6589250)
71       avalik_koht,kauplus       <NA>  2022 POINT (542749.5 6588750)
112 avalik_koht,tanav_valjak      0-499  2022 POINT (546749.5 6591750)
113 avalik_koht,tanav_valjak      0-499  2022 POINT (546749.5 6591750)
114 avalik_koht,tanav_valjak      0-499  2022 POINT (541749.5 6589250)
121 avalik_koht,tanav_valjak      0-499  2022 POINT (597499.5 6606500)
128  avalik_koht,bussipeatus   500-4999  2022 POINT (550249.5 6590250)

Selliste objektide joonistamiseks saame kasutada ggplot() käsku funktsiooniga geom_sf().

library('ggplot2')
ggplot(teodSf) + 
  geom_sf(aes(color = kahjusumma), alpha = .2) + 
  facet_wrap(~aasta) + 
  theme_void()

Teine võimalus on kasutada käsku tm_shape() ja sellega seotud funktsioone.

library('tmap')
tm_shape(teodSf) + 
  tm_dots(col = 'kahjusumma', size = .5, alpha = .2) + 
  tm_facets(by = 'aasta')

31.3 Punktide analüüs

Punktide paiknemise alusel saame teha ka mitmesuguseid arvutusi. Selleks saame kasutada funktsioone laiendusest spatstat. Esmalt peame esmalt määrama kujundi, mille sees punktid teoreetiliselt olla võivad. See on nn aken. Sisestame Shapefile vormingus Eesti omavalitsuste piiride andmed, ühendame omavaitsused ja lihtsustame kaarti. Seejärel saame teisendada andmetabeli punktmustri (point pattern) objektiks, mida saab kasutada arvutustes.

library('sf')
ov <- st_read('andmed/omavalitsus')
Reading layer `omavalitsus_20221101' from data source 
  `/home/jrl/projects/andmeanalyys/andmed/omavalitsus' using driver `ESRI Shapefile'
Simple feature collection with 79 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 369032.1 ymin: 6377141 xmax: 739152.8 ymax: 6634019
Projected CRS: Estonian Coordinate System of 1997
aken <- st_union(ov, is.coverage = TRUE)
library('spatstat')
aken %<>% as.ppp
teodPt <- as.ppp(teod, W = aken)
plot(teodPt, main = NULL, use.marks = FALSE, pch = 20)

Kuna paljud punktid kattuvad, siis lihtsalt nende kuvamine ei anna tegelikku arusaama sellest, kui palju punkte mingil alal asub. Selle näitamiseks saame jagada kaardi mingite vahedega ruutudeks ja loendada punktide arvud nendel ruutudel (siinkohal pigem ristkülikutel).

ruudud <- quadratcount(teodPt, 5, 5)
plot(ruudud)
plot(teodPt, add = TRUE)
Plotting the first column of marks
Warning in default.charmap(ntypes, chars): Too many types to display every type
as a different character
Plotting the first column of marks
Warning in default.charmap(ntypes, chars): Too many types to display every type
as a different character
Warning in plot.ppp(teodPt, add = TRUE): 114 illegal points also plotted

Näeme, et ülekaalukalt kõige enam juhtumeid toimus kaardiruudus, kus asus Tallinn.

Teine viis punktide paiknemist ilmekamalt näidata on arvutada ja kuvada punktide tihedus ruumis.

tihedus <- density(teodPt)
plot(tihedus, main = NULL, box = FALSE, ribbon = FALSE)

persp(tihedus, main = NULL, box = FALSE, axes = FALSE, theta = -25, phi = 45)

Mitmesuguseid arvutusi punktide jaotumise kohta saame teha iga punkti lähima naabri kauguse alusel.

lähinaaber <- nndist(teodPt)
summary(lähinaaber)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0     0.0     0.0   152.6     0.0 23021.7 

Näeme, et keskmiselt on vandalismijuhtumid toimunud 151 meetri kaugusel lähimast teisest sellisest juhtumist. Lähimast juhtumist kõige suurem kaugus oli 23 km.

Lähima naabri kaugust saame uurida ka andmetabelis olevate tunnuste lõikes.

aggregate(lähinaaber, list(teodPt$marks$nädalapäev), mean)
    Group.1         x
1    Friday 173.83051
2    Monday 145.67459
3  Saturday 150.35675
4    Sunday 202.68934
5  Thursday 145.27492
6   Tuesday  86.37345
7 Wednesday 153.01107

Näeme, et keskmselt kõige kaugemal lähimast juhtumist esines vandalism pühapäeviti.

31.4 Kujundid

Kujundite näitena uurime omavalitsuste piire Eestis1. Selleks laadime alla Shapefile vormingus andmed ja sisestame vastavas kaustas olevad failid R keskkonda.

  • 1 Eesti maakondade, omavalitsuste ja asustusüksuste piirid on kättesaadavad Maa-amet Geoportaalis.

  • library('sf')
    list.files('andmed/omavalitsus')
    [1] "omavalitsus_20221101.dbf" "omavalitsus_20221101.prj"
    [3] "omavalitsus_20221101.shp" "omavalitsus_20221101.shx"
    ov <- st_read('andmed/omavalitsus')
    Reading layer `omavalitsus_20221101' from data source 
      `/home/jrl/projects/andmeanalyys/andmed/omavalitsus' using driver `ESRI Shapefile'
    Simple feature collection with 79 features and 5 fields
    Geometry type: MULTIPOLYGON
    Dimension:     XY
    Bounding box:  xmin: 369032.1 ymin: 6377141 xmax: 739152.8 ymax: 6634019
    Projected CRS: Estonian Coordinate System of 1997
    ov
    Simple feature collection with 79 features and 5 fields
    Geometry type: MULTIPOLYGON
    Dimension:     XY
    Bounding box:  xmin: 369032.1 ymin: 6377141 xmax: 739152.8 ymax: 6634019
    Projected CRS: Estonian Coordinate System of 1997
    First 10 features:
               ONIMI OKOOD            MNIMI MKOOD TYYP
    1     Ruhnu vald  0689    Saare maakond  0074    1
    2      Muhu vald  0478    Saare maakond  0074    1
    3    Viimsi vald  0890    Harju maakond  0037    1
    4  Saaremaa vald  0714    Saare maakond  0074    1
    5   Hiiumaa vald  0205     Hiiu maakond  0039    1
    6     Kihnu vald  0303    Pärnu maakond  0068    1
    7    Vormsi vald  0907    Lääne maakond  0056    1
    8  Viljandi linn  0897 Viljandi maakond  0084    4
    9        Tallinn  0784    Harju maakond  0037    4
    10    Jõhvi vald  0251 Ida-Viru maakond  0045    1
                             geometry
    1  MULTIPOLYGON (((455182.4 64...
    2  MULTIPOLYGON (((463065.2 64...
    3  MULTIPOLYGON (((555043.2 66...
    4  MULTIPOLYGON (((457728.1 64...
    5  MULTIPOLYGON (((441870.5 65...
    6  MULTIPOLYGON (((499129.7 64...
    7  MULTIPOLYGON (((458323.2 65...
    8  MULTIPOLYGON (((591276.3 64...
    9  MULTIPOLYGON (((546579.5 65...
    10 MULTIPOLYGON (((686165.8 65...

    Näeme, et tulemuseks on andmetabel, mille iga rida esindab ühte omavalitsust. Igale real asuval kujundil on piire tähistavad punktid, millele annab tähenduse koordinaatsüsteem.

    Kui soovime kujutada ainult kujundite piirie, siis võime andmetabelist eraldada geomeetria ja joonistada ainult selle.

    plot(st_geometry(ov))

    Mida keerulisemad on kujundid, seda kauem võtab aega nende joonistamine. Väiksemõõtmeliste jooniste korral ei ole kujundite suur täpsus tähtis, mistõttu võime neid lihtsustada. Selleks saame kasutada funktsiooni st_simplify, mille argumendi dTolerance erinevaid väärtusi proovides saame kujundeid lihtsustada nii, et need liiga lihtsaks ei muutuks.

    st_simplify(ov, dTolerance = 5000) %>% st_geometry %>% plot

    ov <- st_simplify(ov, dTolerance = 500)

    Et kujutada mingit nähtust omavalitsuse piirides, saame lisada vastava tunnuse andmetabelisse. Selle näiteks sisestame rahvaarvu Statistikaameti tabelist RLV701.

    rahvaarv <- read.csv('andmed/rahvaarv.csv')
    tail(rahvaarv)
                                               koht rahvaarv
    180                 Antsla linn asustusüksusena     1249
    181 Antsla vald, va Antsla linn asustusüksusena     2973
    182                                  Rõuge vald     4877
    183                                Setomaa vald     2849
    184                                   Võru linn    11865
    185                                   Võru vald    10367

    Andmetabelite ühendamiseks saame kasutada funktsiooni merge(). Kui ühendamise aluseks olevate tunnuste nimed tabelites erinevad, siis peame vastavad nimetused määratlema.

    ov <- merge(ov, rahvaarv, by.x = 'ONIMI', by.y = 'koht', all.x = TRUE)
    ov
    Simple feature collection with 79 features and 6 fields
    Geometry type: GEOMETRY
    Dimension:     XY
    Bounding box:  xmin: 369556.3 ymin: 6377146 xmax: 738987.7 ymax: 6616089
    Projected CRS: Estonian Coordinate System of 1997
    First 10 features:
                  ONIMI OKOOD              MNIMI MKOOD TYYP rahvaarv
    1    Alutaguse vald  0130   Ida-Viru maakond  0045    1     4167
    2        Anija vald  0141      Harju maakond  0037    1     6262
    3       Antsla vald  0142       Võru maakond  0087    1     4222
    4         Elva vald  0171      Tartu maakond  0079    1    14707
    5  Häädemeeste vald  0214      Pärnu maakond  0068    1     4616
    6     Haapsalu linn  0184      Lääne maakond  0056    4    13132
    7      Haljala vald  0191 Lääne-Viru maakond  0060    1     4090
    8        Harku vald  0198      Harju maakond  0037    1    16380
    9      Hiiumaa vald  0205       Hiiu maakond  0039    1     8497
    10       Järva vald  0255      Järva maakond  0052    1     8632
                             geometry
    1  MULTIPOLYGON (((716763.6 65...
    2  POLYGON ((566437.1 6578876,...
    3  POLYGON ((640691.4 6417407,...
    4  POLYGON ((624749.4 6473469,...
    5  POLYGON ((520984.7 6414970,...
    6  MULTIPOLYGON (((464366.3 65...
    7  POLYGON ((603455.3 6604360,...
    8  MULTIPOLYGON (((532139.7 65...
    9  MULTIPOLYGON (((451826.4 65...
    10 POLYGON ((582706 6553611, 5...

    Kujunditega saame paljusid funktsioone rakendades teha kõikvõimalikke tehteid. Saame arvutada näiteks omavalitsuste pindalad ruutkilomeetrites ja selle alusel inimeste arvu ruutkilomeetril. Kuna vaikimisi on antud koordinaatsüsteem meetrites, siis peame ruutmeetrid teisednama ruutkilomeetriteks.

    ov$pindala <- as.vector(st_area(ov)) / 1e6
    ov$tihedus <- ov$rahvaarv / ov$pindala

    Lisatud tunnust saame kujutada tm_shape käsu abil.

    library('tmap')
    tm_shape(ov) + tm_polygons(col = 'tihedus', style = 'quantile')

    Saame korraga kujutada ka erineval kujul andmeid. Selleks peavad kahe andmetabeli koordinaatsüsteemid on olema samad. Seejärel saame lisada objektid mõlemast andmetabelist korraga tm_shape käsu järele.

    tm_shape(ov) + tm_polygons(col = 'tihedus', style = 'quantile') + 
      tm_shape(teodSf) + tm_dots(alpha = .5)

    32 Ruumiline autokorrelatsioon

    Kujundite korral saame uurida ruumilist autokorrelatsiooni naabrite vahel. Selleks on esmalt vaja leida iga kujundi naabrid.

    library('spdep')
    Loading required package: spData
    To access larger datasets in this package, install the spDataLarge
    package with: `install.packages('spDataLarge',
    repos='https://nowosad.github.io/drat/', type='source')`
    naabrid <- poly2nb(ov)
    plot(st_geometry(ov))
    plot(naabrid, ov %>% st_centroid %>% st_coordinates, add = TRUE, col = 'red')
    Warning: st_centroid assumes attributes are constant over geometries

    Kõige sagedasem ruumilise autokorrelatsiooni mõõdik on Morani I (Moran’s I), mille saame arvutada ka nö kohalikult, iga kujundi kohta eraldi. Arvutame, mil määral on omavalitsuste rahvaarv sarnane naaberomvalitsuste omaga.

    kaalud <- nb2listw(naabrid, style = 'W', zero.policy = TRUE)
    morani <- localmoran(ov$rahvaarv, listw = kaalud, zero.policy = TRUE)
    ov$morani <- morani[, 'Ii']
    tm_shape(ov) + tm_polygons(col = 'morani')
    Variable(s) "morani" contains positive and negative values, so midpoint is set to 0. Set midpoint = NA to show the full spectrum of the color palette.

    Näeme, et kui Tallinnal on võrreldes naaberomavalitsustega sarnane rahvaarv, siis Tartul erinev.

    Lisaks saame võrrelda rahvaarvu omavalitsustes ka selle mediaanväärtusega.

    ov$mediaanid <- attributes(morani)$quadr$median
    tm_shape(ov) + tm_polygons(col = 'mediaanid', palette = 'div')

    Antud juhul näitab legendis esimene väärtus omavalitsuse enda rahvaarvu võrreldes mediaaniga ja teine väärtus naaberomavalitsuste rahvaarvu võrreldes mediaaniga. Nt väärtus High-Low näitab, et antud omavalitsuses on küll mediaanist kõrgem rahvaarv, aga selle naabrite rahvaarv on mediaanist madalam.

    32.1 Liikuvad kaardid

    Üsna hõlpsasti saame koostada ka liikuvaid kaarte, millelt saame lugeda iga objekti kohta olevat teavet. Kasutades selleks laiendust tmap, peame esmalt käsuga tmap_mode('view') teada andma, et soovime liikuvat kaarti. Seejärel kuvatakse kõik tm_shape käsuga joonistatud kaardid liikuvatena, kuni määrame käsuga tmap_mode('plot'), et soovime jälle kuvada kaarte piltidena. Liikuvatel kaartidel saab kuvada mh objekte, mis on sisestatud funktsiooniga st_read() või teisendatud funktsiooniga st_as_sf().

    Kuna süütegude asukohad on teada tegelikult ruutkilomeetriste kaardiruutude kaupa, siis liigutame koordinaate 1000 m võrra juhuslikus suunas (st_jitter), et samal kaardiruudul asuvad punktid ei kattuks.

    tmap_mode('view')
    tmap mode set to interactive viewing
    teodSf %<>% st_jitter(amount = 1000)
    tm_shape(teodSf) + tm_dots(alpha = .5)

    Liikuvad kaardid saame salvestada veebilehena HTML vormingus ja nii neid ka jagada.