Как создать пространственную сетку из растра?


9

Мне нужна Пространственная Сетка как мастер-сетка для разнообразных тематических карт. Как создать пространственную сетку из растра, отбрасывающего все пиксели NA?


6
Бросай нам кое-какие отходы здесь. Небольшой код для создания растра и что вы ожидаете от него?
Spacedman

Ответы:


14

Вы можете получить все не-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 не имеет смысла.


спасибо приятель, я тоже не уверен, что хотеть. Я пытаюсь разработать рабочий процесс для создания идентичных растровых карт (с точки зрения разрешения, координат, crs, ...) из различных пространственных точечных данных. Растеризация не возможна из-за пространственного рассеяния точек. Нужно использовать iwd или аналогичный. Вы правы, сетка прямолинейна - мне нужен как основной шаблон, вероятно, SpatialPointsDataFrame. который может быть привязан к сетке. S.
Janbob Squarebrains

Вы, вероятно, захотите мастер-растр (ха!), А затем создадите все последующие сетки одновременно с ним.
Радар

2
Согласовано. Если все в сетке, растр почти всегда является ответом. Или это, или пробирайтесь через приблизительно 20 страниц Прикладного анализа пространственных данных в R, чтобы выяснить, как сделать SpatialPixels. Вообще-то, сегодня я дал этот выбор аспиранту. Он выбрал ... мудро!
Spacedman

20

Чтобы преобразовать 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)

7

Ваши два требования, кажется, о разных вещах:

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, но до сих пор не ясно, что именно вы имеете в виду в вопросе.

  • (Возможно, поскольку вы можете хранить разреженные ячейки, просто сохраняя их индекс, а не явные координаты, и изначально «слегка нерегулярные» координаты ячеек можно просто сохранить в виде атрибутов, если вы действительно хотите их. Ни sp, ни растр вообще не имеют дело с нерегулярными растрами, даже не простой прямолинейный случай - это согласуется с большинством инструментов ГИС, но, к сожалению, он довольно распространен в таких форматах, как NetCDF, и обрабатывается старой доброй функцией R: graphics :: image (хотя и не при использовании последней опции rasterImage) .)

Спасибо за очень поучительные заявления, которые мне нужно переварить. Надеюсь, что это позволит мне решить мою проблему или опубликовать более точный вопрос!
Janbob Squarebrains

Также @Spacedman: я более точно определил свой фон вопросов здесь на форуме.
Janbob Squarebrains
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.