Vektori i Rasteri u R-u Univerzitet u Novom Sadu April 2018 U ovoj vežbi ćemo videti kako da prikažemo dva osnovna tipa prostornih podataka u R-u, vektore (tačke i poligone) i rastere. Za učitavanje ovih podataka koristićemo rgdal paket. Ovaj paket predstavlja interfejs R softverskog paketa sa GDAL ( Geospatial Anstraction Library ) koju koriste i drugi open-source GIS paketi kao QGIS. U kasnijoj vežni ćemo videti kako R i QGIS mogu da komuniciraju. Ukoliko prvi put koristite ovaj paket, instalirajte ga sa install.packages() funkcijom: #install.packages('rgdal') Učitaćemo shape file za administrativne granice Srbije NUTS2 nivoa sa readogr() funkcijom iz rgdal paketa: library('rgdal') ## Warning: package 'rgdal' was built under R version 3.4.4 ## Loading required package: sp ## rgdal: version: 1.2-18, (SVN revision 718) ## Geospatial Data Abstraction Library extensions to R successfully loaded ## Loaded GDAL runtime: GDAL 2.1.3, released 2017/20/01 ## Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rgdal/gdal ## GDAL binary built with GEOS: FALSE ## Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493] ## Path to PROJ.4 shared files: /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rgdal/pr ## Linking to sp version: 1.2-7 args(readogr) ## function (dsn, layer, verbose = TRUE, p4s = NULL, stringsasfactors = default.stringsasfactors(), ## drop_unsupported_fields = FALSE, pointdropz = FALSE, dropnullgeometries = TRUE, ## usec = TRUE, disambiguatefids = FALSE, addcommentstopolygons = TRUE, ## encoding = NULL, use_iconv = FALSE, swapaxisorder = FALSE, ## require_geomtype = NULL, integer64 = "no.loss", GDAL1_integer64_policy = FALSE) ## NULL help(readogr) shape <- readogr('/users/mpetric/documents/projects/uns_rqgis/01 - Data//SRB_adm/SRB_adm2.shp') ## OGR data source with driver: ESRI Shapefile ## Source: "/Users/mpetric/Documents/PROJECTS/UNS_RQGIS/01 - Data/SRB_adm/SRB_adm2.shp", layer: "SRB_adm ## with 161 features ## It has 11 fields ## Integer64 fields read as strings: ID_0 ID_1 ID_2 class(shape) ## [1] "SpatialPolygonsDataFrame" ## attr(,"package") ## [1] "sp" # shape je objekat sp klase 1
#shape # pregled svih informacija koje se nalaze u ovom objektu head(shape@data, n =4) # sa @ operatorom pristupate razlicitim delovima ovog objekta ## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 ## 0 202 SRB Serbia 1 \305\240umadijski 1 Aran\304\221elovac ## 1 202 SRB Serbia 1 \305\240umadijski 2 Bato\304\215ina ## 2 202 SRB Serbia 1 \305\240umadijski 3 Kni\304\207 ## 3 202 SRB Serbia 1 \305\240umadijski 4 Kragujevac ## TYPE_2 ENGTYPE_2 ## 0 Op\305\241tine Town Municipal ## 1 Op\305\241tine Town Municipal ## 2 Op\305\241tine Town Municipal ## 3 Op\305\241tine Town Municipal ## NL_NAME_2 ## 0 \320\220\321\200\320\260\320\275\321\222\320\265\320\273\320\276\320\262\320\260\321\206 ## 1 \320\221\320\260\321\202\320\276\321\207\320\270\320\275\320\260 ## 2 \320\232\320\275\320\270\321\233 ## 3 \320\232\321\200\320\260\320\263\321\203\321\230\320\265\320\262\320\260\321\206 ## VARNAME_2 ## 0 <NA> ## 1 <NA> ## 2 <NA> ## 3 Alacahisar Prostorni objekti u R-u su sačinjeni od broja podskupova kojima može da se pristupi @ operatorom. Najvažniji podskupovi kod.shp objekata su @data i @polygons. str(shape@data) # struktura i klasa kolona ## 'data.frame': 161 obs. of 11 variables: ## $ ID_0 : Factor w/ 1 level "202": 1 1 1 1 1 1 1 1 1 1... ## $ ISO : Factor w/ 1 level "SRB": 1 1 1 1 1 1 1 1 1 1... ## $ NAME_0 : Factor w/ 1 level "Serbia": 1 1 1 1 1 1 1 1 1 1... ## $ ID_1 : Factor w/ 25 levels "1","10","11",..: 1 1 1 1 1 1 1 12 12 12... ## $ NAME_1 : Factor w/ 25 levels "Borski","Brani\304\215evski",..: 25 25 25 25 25 25 25 1 1 1... ## $ ID_2 : Factor w/ 161 levels "1","10","100",..: 1 74 85 96 107 118 129 140 151 2... ## $ NAME_2 : Factor w/ 160 levels "Ada","Aleksandrovac",..: 6 11 43 49 57 99 125 24 42 65... ## $ TYPE_2 : Factor w/ 1 level "Op\305\241tine": 1 1 1 1 1 1 1 1 1 1... ## $ ENGTYPE_2: Factor w/ 1 level "Town Municipal": 1 1 1 1 1 1 1 1 1 1... ## $ NL_NAME_2: Factor w/ 160 levels "\320\210\320\260\320\263\320\276\320\264\320\270\320\275\320\260" ## $ VARNAME_2: Factor w/ 53 levels "Ad Drinum.","Alacahisar",..: NA NA NA 2 NA NA NA NA 12 NA... Svi prostorni objekti mogu da se plotuju sa jednostavnom plot() funkcijom plot(shape) 2
1. Prikaz prostornih podataka sa ggplot() U ovom poglavlju ćemo pogledatei metod prikazivanja prostornih podataka preko ggplot() funkcije iz ggplot2 paketa. Pored njega razvijena su dva paketa koja se specifično bave grafičkim prikazom prostornih podataka: tmap i raster. U ovoj vežbi će fokus biti na ggplot() funkciji. library("xlsx") # paket za citanje excel podataka ## Loading required package: rjava ## Loading required package: xlsxjars # promenite PATH tako da odgovara polozaju vaseg coordinate.xlsx fajla delt <- read.xlsx2(file = '/Users/mpetric/Documents/PROJECTS/UNS_RQGIS/01 - Data//coordinates.xlsx', sheetindex = 1, colclasses = c('numeric','numeric','numeric','character')) Da bismo sp prostorne podatke prikazali sa ggplot, moramo prvo sačuvamo kao običnu tabelu (data.frame) sa kolonama koje sadrže X i Y koordinate. library("sp") library("gpclib") ## General Polygon Clipper Library for R (version 1.5-5) ## Type 'class? gpc.poly' for help #pclibpermit() # is required by maptools library("maptools") ## Checking rgeos availability: TRUE library("ggplot2") shape@data$id <- rownames(shape@data) admin_points <- fortify(shape, region = "id") admin_points_df <- merge(admin_points, shape@data, by = "id") zatim korisitmo ggplot() funkciju da prikažemo mapu na Plots panelu. ggsp<- ggplot(data = admin_points_df, aes(x=long, y=lat, group = group, fill = NAME_1)) + geom_polygon() + geom_path(color = "white", size = 0.6) + 3
scale_fill_hue(l = 40) + coord_equal() + ggsp 46 45 44 43 19 20 21 22 23 Borski Brani..evski Grad Beograd Jablani..ki Ju..no Banatski Ju..no Ba..ki Kolubarski Ma..vanski Moravi..ki Ni..avski Pirotski Podunavski Pomoravski P..injski Rasinski Ra..ki Severno Banatski Severno Ba..ki Srednje Banatski Sremski Topli..ki Zaje..arski Zapadno Ba..ki Zlatiborski..umadijski Na ovu sliku sada možemo da dodamo naše koordinate sa geom_point() slojem u ggplot() funkciji. Pošto se ovi podaci nalaze u drugom data.frame objektu korisitmo malo drugačiju sintaksu. Koristimo ggplot() funkciju bez definisanih arumenata, ovo daje poruku R-u da smo započeli ggplot() grafik. U geom_polygon() funkciji definišemo tabelu iz koje čitamo koordinate za administrativne jedinice (admin_points_df), a u geom_point() tabelu iz koje čitamo koordinate za relativnu promenu srednje godišnje temperature (delt). ggspadd <- ggplot() + geom_polygon(data = admin_points_df, aes(x = long, y = lat, group = group)) + geom_point(data = delt, aes(x = lon, y = lat, size = delat), col = "white") + ggspadd 4
46 45 0.5 44 0.6 0.7 43 19 20 21 22 23 A. Pregled koda: library('rgdal') args(readogr) help(readogr) shape <- readogr('/users/mpetric/documents/projects/uns_rqgis/01 - Data//SRB_adm/SRB_adm2.shp') class(shape) # shape je objekat sp klase #shape # pregled svih informacija koje se nalaze u ovom objektu head(shape@data, n =4) # sa @ operatorom pristupate razlicitim delovima ovog objekta str(shape@data) # struktura i klasa kolona plot(shape) # graficki prikaz prostornog objekta library("xlsx") # paket za citanje excel podataka # promenite PATH tako da odgovara polozaju vaseg coordinate.xlsx fajla delt <- read.xlsx2(file = '/Users/mpetric/Documents/PROJECTS/UNS_RQGIS/01 - Data//coordinates.xlsx', sheetindex = 1, colclasses = c('numeric','numeric','numeric','character')) library("sp") library("gpclib") library("maptools") library("ggplot2") shape@data$id <- rownames(shape@data) 5
admin_points <- fortify(shape, region = "id") admin_points_df <- merge(admin_points, shape@data, by = "id") # grafički prikaz admin fajla ggsp<- ggplot(data = admin_points_df, aes(x=long, y=lat, group = group, fill = NAME_1)) + geom_polygon() + geom_path(color = "white", size = 0.6) + scale_fill_hue(l = 40) + coord_equal() + ggsp # kombinacija admin fajla sa koordinatama za delt ggspadd <- ggplot() + geom_polygon(data = admin_points_df, aes(x = long, y = lat, group = group)) + geom_point(data = delt, aes(x = lon, y = lat, size = delat), col = "white") + ggspadd 6