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.
Ruumi kirjeldamisel määrame igale punktile ruumis mingi väärtuse lähtudes objekti paiknemisest. Sellised andmed esitatakse rasterkaardil.
Objektide kirjeldamisel kujutame objekte ruumis ilma neid ruumi alusel lihtsustamata. Objektid on sel juhul esitatud punktidena või nendest koosnevate kujunditena vektorkaardil.
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:
pideval skaalal esitatakse arvtunnused, nt maapinna kõrgus, rahvaarv;
diskreetsel skaalal saab esitada nimitunnuseid, nt maakasutusviis.
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:
punkti (point) kujutamiseks piisabki ühest punktist,
joon (line) esitatakse punktide jadana,
kujund (polygon) määratakse selle piire esindavate punktide alusel.
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.
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.
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.
Teine võimalus on teisendada rasterkaardid andmetabeliks, mis võimaldab teha arvutusi ja kasutada joonistamiseks funktsiooni gglot2() nii nagu eelnevalt näidatud.
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.
'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
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.pppteodPt <-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).
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.
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.
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.
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.
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.
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.
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.