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


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.