Как растеризовать SpatialPolygons в R?

10

Я пытаюсь извлечь значения батиметрии для интересующей меня области из растрового слоя мировой батиметрии, используя функцию 'rasterize' в пакете {sp}.

* Редактирование: Я нашел функцию извлечения, которая, кажется, больше, чем я ищу.

Это то, что я сделал до сих пор:

> class(subarea0) #This is my area of interest (Eastern Canadian Arctic Sea)
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

> extent(subarea0)
class       : Extent 
xmin        : -82.21997 
xmax        : -57.21667 
ymin        : 60.2 
ymax        : 78.16666

library(marelac)
data("Bathymetry")#World bathymetric data in library (marelac)
names(Bathymetry);class(Bathymetry);str(Bathymetry)
[1] "x" "y" "z"
[1] "list"
List of 3
 $ x: num [1:359] -180 -179 -178 -177 -176 ...
 $ y: num [1:180] -89.5 -88.5 -87.5 -86.5 -85.5 ...
 $ z: num [1:359, 1:180] 2853 2873 2873 2873 2873 ...

  raster_bath<-raster(Bathymetry)#Transformed into a raster layer
    extent(raster_bath) <- extent(subarea0)#Transform the extend of my raster to the extend of my SpatialPolygons

>ras_sub0<-rasterize(subarea0,raster_bath)#rasterize my SpatialPolygons (*Edits: not the function that I need here, but I am still interested to learn what results mean)
Found 2 region(s) and 10 polygon(s)
> plot(ras_sub0)
> plot(subarea0, add=TRUE)

введите описание изображения здесь

> ras_sub0
class       : RasterLayer 
dimensions  : 180, 359, 64620  (nrow, ncol, ncell)
resolution  : 0.06964709, 0.0998148  (x, y)
extent      : -82.21997, -57.21667, 60.2, 78.16666  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 
values      : in memory
min value   : 1 
max value   : 2 
layer name  : layer 

Я не понимаю результат. Почему я получаю 2 цвета для каждого из моих полигонов? Что они имеют в виду?

Как в конечном итоге получить батиметрический контур глубины? Это как-то связано с моим разрешением или изменением размеров?

* Редактирует: хорошо, теперь я сделал следующее:

v <- extract(raster_bath, subarea0)#Extract data from my Raster Layer for the locations of my SpatialPolygons

v - это список, и я не уверен, как / в какой форме связать эту информацию с моим пространственным многоугольником ...

Спасибо!

Година
источник
Когда вы говорите «получить контур глубины батиметрии», вы имеете в виду, что хотите также создавать контуры?
Симбамангу

Ответы:

6

Ваша строка ras_sub0<-rasterize(subarea0,raster_bath)просто берет порядковый номер полигонов и присваивает его значениям растра.

Если вы хотите просто пересечение вашего многоугольника и растра:

subarea0_bathy <- intersect(raster_bath, subarea0)

Обновление : как отмечает @GodinA, похоже, что intersect () иногда не возвращает растр, который имеет полный экстент многоугольника! Чтобы обойти это, вы можете пересечь с немного большим растром, чем ваш оригинал:

r2 <- raster() # create a generic raster
extent(r2) <- extent(subarea0) + 1 # add 1 degree of extent (0.5 each side)
r3 <- intersect(raster_bath, r2) 
Simbamangu
источник
Спасибо @Simbamangu, я попробовал команду «пересечь», однако когда я строю график подрайона 0 и моего пространственного полигона (подрайон 0), они не полностью перекрываются, почему? Чтобы ответить на ваш предыдущий вопрос, да, я хотел бы в конечном итоге также иметь мой контур батиметрии. Какие-либо предложения?
GodinA
Да, посмотрел на вывод данных батиметрии и полигона Танзании, и я вижу тот же эффект. Смотрите мое обновление выше. Для контуров это так же просто, как cont <- contour(r3)тогда. lines(cont)Разве R не велик?
Симбамангу
Отлично, да R может быть фантастическим! Спасибо @Simbamangu, это работает! Тем не менее, я хотел бы только построить свои пространственные полигоны с моим контуром глубины. Может быть, создать SpatialPolygonsDataframe? Используя пересечение, я получаю информацию для всего квадрата, охватывающего мои пространственные полигоны. Мне нужно как-то объединить мои пространственные полигоны с моим контуром глубины, но я не уверен, как это сделать. Вот почему я подумал, что функция «извлечение» была хорошим началом, но в итоге я получил список глубины, который я не уверен, как я могу связать с моими пространственными полигонами ... Есть идеи? Еще раз спасибо!
GodinA
Чем вы хотите закончить? Контуры (пространственные линии), которые перекрываются с вашим подрайоном0? Возможно, вы захотите начать новый вопрос, поскольку теперь он выходит за рамки оригинала.
Симбамангу
Да, я хотел бы получить только свой подрайон0 с контуром глубины для этой области определения: gis.stackexchange.com/questions/25112/…
GodinA
1

Вот еще одно решение, использующее базовую функцию подмножества в raster.

# create a raster with the dimensions that you are interested in.
r <- raster(extent(subarea0)+1) # +1 to increase the area
res(r) <- 0.1 # you can change the resolution here. 0.1 can be about 10x10 km if you are close to the equator.
crs(r) <- projection(subarea0) # transfer the coordinate system to the raster

# Now you can add data to the cells in your raster to mark the ones that fall within your polygon.
r[subarea0,] <- 1 # this an easy way to subset a raster using a SpatialPolygons object

# check your raster
plot(r)
ssanch
источник