Мне нужна Пространственная Сетка как мастер-сетка для разнообразных тематических карт. Как создать пространственную сетку из растра, отбрасывающего все пиксели NA?
Мне нужна Пространственная Сетка как мастер-сетка для разнообразных тематических карт. Как создать пространственную сетку из растра, отбрасывающего все пиксели NA?
Ответы:
Вы можете получить все не-NA координаты ячеек в растре с помощью:
r = raster(matrix(runif(20),5,4))
r[r>.5]=NA
coordinates(r)[!is.na(values(r)),]
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
это клетки, которые не являются NA. Вы можете, вероятно, передать их SpatialPixels
SpatialPixels(SpatialPoints(coordinates(r)[!is.na(values(r)),]))
Object of class SpatialPixels
Grid topology:
cellcentre.offset cellsize cells.dim
x 0.125 0.25 4
y 0.100 0.20 4
SpatialPoints:
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
Coordinate Reference System (CRS) arguments: NA
Хотя лично все на сетке я бы сохранил как растр.
Я до сих пор не совсем уверен, что именно вы хотите - SpatialGrid
объекты задают полные прямоугольные сетки, поэтому один без пикселей NA не имеет смысла.
Чтобы преобразовать RasterLayer в объект Spatial * (Grid или Pixels), вы можете использовать функцию приведения «as»
library(raster)
r <- raster(matrix(runif(20),5,4))
r[r>.5] <- NA
g <- as(r, 'SpatialGridDataFrame')
p <- as(r, 'SpatialPixels')
plot(r)
points(p)
Ваши два требования, кажется, о разных вещах:
1) Какой-то надежный шаблон растровой сетки.
2) Разреженная сетка, которая явно не хранит отсутствующие ячейки.
sp :: GridTopology предоставляет первый, это просто описание сетки, основанное на координате нижней левой ячейки (cellcentre.offset), интервале между ячейками (cellize) и размерах сетки (cell.dim).
Класс sp :: SpatialPixelsDataFrame позволяет хранить разреженные сетки, но сам по себе он хранит гораздо больше, чем «шаблон» - он также хранит каждую координату в явном виде. Это связано с тем, что он выполняет две работы: одна позволяет сохранить исходные координаты, которые берутся из сетки и, возможно, слегка нерегулярны, а вторая позволяет хранить только те ячейки, которые имеют допустимые значения. (Возможно * эти две цели должны были быть разделены, но это другая история).
Я не думаю, что растровый пакет имеет явный аналог GridTopology, но вы можете достать компоненты, чтобы «свернуть свои»:
library(raster)
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
## "cellsize"
res(r1)
## [1] 0.4761905 1.6666667
## extreme cell corners (just a different convention to sp's cellcentre)
extent(r1)
class : Extent
xmin : 0
xmax : 10
ymin : -90
ymax : 90
## we can also use bbox to get the same thing
bbox(r1)
min max
s1 0 10
s2 -90 90
## grid dimensions (including number of attributes/layers as 3rd "dim")
dim(r1)
## [1] 108 21 1
Связав все это вместе, мы можем перейти от растра к sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Обратите внимание, как размеры должны быть обращены). Другой более простой способ - привести к SpatialGrid и использовать sp getGridTopology, хотя это более дорого, так как в конечном итоге создаются координаты:
getGridTopology(as(r1, "SpatialGrid"))
Эти три части «топологии» растра не являются необходимыми, поскольку некоторые из них являются избыточными, но в противном случае нет способа захватить их все как один объект - за исключением того, что созданный выше растр является «пустым», и поэтому он может выполнять работа, которую GridTopology делает для sp. Я не уверен в деталях того, насколько он «пустой», но он явно не хранит слот «data» явно и меньше, чем он был бы со значениями в нем. Растровый пакет, в общем, делает все возможное, чтобы свести к минимуму использование памяти, поэтому вам не нужно беспокоиться о том, что он действительно "разрежен".
Это может помочь объяснить немного больше, я знаю, что пересекаюсь с ответом Spacedman, но до сих пор не ясно, что именно вы имеете в виду в вопросе.