Мені потрібна просторова сітка як головна сітка для різноманітних тематичних карт. Як створити просторову сітку з растру, відкинувши всі пікселі 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 в об’єкт просторового * (Grid або Pixels) ви можете використовувати функцію примусу "як"
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
Пов’язавши це все разом, ми можемо перейти від растрових до сп:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Зверніть увагу, як потрібно змінити розміри). Ще один простіший спосіб - примусити до SpatialGrid і використовувати sp getGridTopology, хоча це дорожче, оскільки координати в кінцевому підсумку генеруються:
getGridTopology(as(r1, "SpatialGrid"))
Ці три частини растрової "топології" не всі необхідні, оскільки деякі є зайвими, але в іншому випадку немає способу захопити їх як один об'єкт - за винятком того, що створений вище растр "порожній", і це може зробити робота, яку GridTopology виконує для sp. Я не впевнений у деталях того, наскільки він "порожній", але він точно не зберігає слот "дані" і менший, ніж це було б зі значеннями в ньому. Як правило, растровий пакет робить все можливе, щоб мінімізувати використання пам’яті, і тому з ним вам не потрібно буде турбуватися про те, що ви дійсно «рідкі».
Це може допомогти пояснити трохи більше, я знаю, що я перекладаю відповідь Spacedman, але все ще не ясно, що саме ви маєте на увазі під питанням.