GISProjekt R

SF, a inne biblioteki GIS

Wiecie już jak korzystać z nowej biblioteki sf. Jest to nowa biblioteka i jej obiekty nie współpracują np. z biblioteką raster. Pokażmy to na przykładzie. Wczytujemy np. czworobok zapisany w pliku SHP, którym będziemy chcieli wyciąć fragment rastra:

library(sf)
shp <- st_read("d:/czworobok.shp")
> shp
Simple feature collection with 1 feature and 1 field
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 663753.4 ymin: 499031.9 xmax: 667507.3 ymax: 501790.8
epsg (SRID):    NA
proj4string:    +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs
 id                       geometry
1 NA POLYGON ((663866.3 501747.8...

Wczytaliśmy prosty poligon. Do działania na rastrach konieczna jest biblioteka raster. Wczytujemy bibliotekę oraz obraz pokrywający się z wczytanym wcześniej poligonem. W naszym przypadku będą to dane wysokościowe dla jednego z województw:

library(raster)
r <- raster("d:/grid.tif")
> r
class       : RasterLayer
dimensions  : 2747, 2638, 7246586  (nrow, ncol, ncell)
resolution  : 100, 100 (x, y)
extent      : 517650, 781450, 352550, 627250  (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : d:\grid.tif
names       : grid
values      : 51.64, 407.16  (min, max)

Spróbujmy wyciąć fragment rastera r funkcją crop z biblioteki raster przy wykorzystaniu warstwy shp:

> fragment <- crop(r,shp)

Otrzymujemy błąd, ponieważ funkcja crop nie obsługuje obiektów klasy sf:

Error in methods::validObject(y) : invalid class “Extent” object: TRUE

Jak sobie z tym poradzić? Konwertując obiekt sf do znanego i wykorzystywanego przez nas sp. A jak? Zamieniając klasę sf na SpatialPolygonsDataFrame używając funkcji as rzutującej jeden obiekt w drugi:

shp_sp <- as(shp,"Spatial")
> shp_sp
class       : SpatialPolygonsDataFrame
features    : 1
extent      : 663753.4, 667507.3, 499031.9, 501790.8  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs
variables   : 1
names       : id
value       : Inf

Sprawdzamy czy teraz działa wycinanie:

fragment <- crop(r,shp_sp)
> fragment
class       : RasterLayer
dimensions  : 27, 38, 1026  (nrow, ncol, ncell)
resolution  : 100, 100 (x, y)
extent      : 663750, 667550, 499050, 501750  (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : in memory
names       : grid
values      : 105.57, 118.73  (min, max)

Biblioteka sf jest jeszcze “młoda” i jej klasy obiektów nie zostały zaimplementowane w innych przestrzennych bibliotekach R. Z czasem na pewno się to zmieni, ale na razie musimy konwertować jej obiekty na inne bardziej standardowe.