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.