Як виготовити просторову сітку з растру?


9

Мені потрібна просторова сітка як головна сітка для різноманітних тематичних карт. Як створити просторову сітку з растру, відкинувши всі пікселі NA?


6
Киньте нам тут деякі записки. Маленький код, щоб зробити растр, і що ви від нього очікуєте?
Спайдермен

Відповіді:


14

Ви можете отримати всі раціональні координати комірок у растрі за допомогою:

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, ...) з різних даних про просторові точки. rasterize не є можливим через просторове розсіювання точок. Потрібно використовувати iwd або подібне. Ви маєте рацію, сітка прямокутна - мені, мабуть, потрібен головний шаблон - це SpatialPointsDataFrame. які можуть бути сітчастими. S.
Janbob Squarebrains

Ви, ймовірно, захочете головний растр (га!), А потім створити всі наступні сітки, що паралельно йому.
Радар

2
Домовились. Якщо все є сіткою, растер майже завжди є відповіддю. Або це, або пробігаючи приблизно 20 сторінок застосованого просторового аналізу даних в R, щоб з'ясувати, як робити SpatialPixels. Я сьогодні цей вибір дав аспіранту. Він вибрав ... мудро!
Спайдермен

20

Для перетворення 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)

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

Пов’язавши це все разом, ми можемо перейти від растрових до сп:

GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])

(Зверніть увагу, як потрібно змінити розміри). Ще один простіший спосіб - примусити до SpatialGrid і використовувати sp getGridTopology, хоча це дорожче, оскільки координати в кінцевому підсумку генеруються:

getGridTopology(as(r1, "SpatialGrid"))

Ці три частини растрової "топології" не всі необхідні, оскільки деякі є зайвими, але в іншому випадку немає способу захопити їх як один об'єкт - за винятком того, що створений вище растр "порожній", і це може зробити робота, яку GridTopology виконує для sp. Я не впевнений у деталях того, наскільки він "порожній", але він точно не зберігає слот "дані" і менший, ніж це було б зі значеннями в ньому. Як правило, растровий пакет робить все можливе, щоб мінімізувати використання пам’яті, і тому з ним вам не потрібно буде турбуватися про те, що ви дійсно «рідкі».

Це може допомогти пояснити трохи більше, я знаю, що я перекладаю відповідь Spacedman, але все ще не ясно, що саме ви маєте на увазі під питанням.

  • (Можливо, оскільки ви можете зберігати розріджені комірки, просто зберігаючи їх індекс, а не явні координати, і спочатку "злегка нерегулярні" координати комірок просто можна зберігати як атрибути, якщо ви дійсно хотіли їх. Ні sp, ні растр взагалі не мають справу з неправильними растрами, навіть не простий прямолінійний випадок - це відповідає більшості інструментів ГІС, але прикро, оскільки він досить поширений у таких форматах, як NetCDF, і він обробляється за допомогою старовинної гарної графіки :: функції зображення (хоч і не, якщо використовується нещодавній параметр rasterImage) .)

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

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