преобразовать матрицу в растр в R

У меня есть матрица данных с пространственными координатами и одна переменная. Пространственное разрешение 1000 метров.

> str(dat1)
> List of 3
> $ x: num [1:710] 302340 303340 304340 305340 306340 ...
> $ y: num [1:1241] 5431470 5432470 5433470 5434470 5435470 ...
> $ z: num [1:710, 1:1241] 225 225 225 225 225 ...

Я хочу преобразовать его в растровый формат.

> dat1$x[1:10]
> [1] 302339.6 303339.6 304339.6 305339.6 306339.6 307339.6 308339.6 309339.6 310339.6 311339.6
> dat1$y[1:10]
>  [1] 5431470 5432470 5433470 5434470 5435470 5436470 5437470 5438470 5439470 5440470

Для этого я использовал следующий код. Но разрешение, которое я получаю, не совпадает с тем, что у меня есть. Есть ли лучший способ получить такое же разрешение с моими реальными данными?

> r <-raster(
             dat1$z,
             xmn=range(dat1$x)[1], xmx=range(dat1$x)[2],
             ymn=range(dat1$y)[1], ymx=range(dat1$y)[2], 
             crs=CRS("+proj=utm +zone=11 +datum=NAD83")
            )
> r

class       : RasterLayer 
dimensions  : 710, 1241, 881110  (nrow, ncol, ncell)
resolution  : 571.3135, 1746.479  (x, y)
extent      : 302339.6, 1011340, 5431470, 6671470  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=11 +datum=NAD83 
data source : in memory
names       : layer 
values      : 13.65059, 248.6229  (min, max)

person Jian Zhang    schedule 25.01.2013    source источник
comment
Людям будет намного проще отлаживать эти вещи, если вы сделаете небольшие примеры и дадите нам код для их создания.   -  person Spacedman    schedule 25.01.2013


Ответы (2)


Попробуйте прочитать справку по растру. При создании растра из матрицы смысл строк и столбцов не такой, как вы думаете. Вы скармливали ему матрицу 1241x710, но брали максимальные и минимальные значения из неправильных векторов.

Попробуйте следующее:

> # small version of your test set
> dat1=list()
> dat1$x=seq(302339.6,by=1000,len=71)
> dat1$y=seq(5431470,by=1000,len=124)
> dat1$z=matrix(runif(71*124),71,124)
> str(dat1)
List of 3
 $ x: num [1:71] 302340 303340 304340 305340 306340 ...
 $ y: num [1:124] 5431470 5432470 5433470 5434470 5435470 ...
 $ z: num [1:71, 1:124] 0.765 0.79 0.185 0.461 0.421 ...
> image(dat1,asp=1)

Красивые квадратные пиксели. Теперь создайте свой растр:

r <-raster(
             dat1$z,
             xmn=range(dat1$x)[1], xmx=range(dat1$x)[2],
             ymn=range(dat1$y)[1], ymx=range(dat1$y)[2], 
             crs=CRS("+proj=utm +zone=11 +datum=NAD83")
            )
plot(r)

Абсолютно НЕ квадратные пиксели. А если присмотреться, матрица повернута на 90 градусов относительно сюжета изображения. Или переставил что ли.

Решение: просто создайте растр из списка x, y, z:

 > r=raster(dat1);plot(r)

Квадратные пиксели, как и график изображения, и разрешение теперь соответствуют вашим ожиданиям:

> r
class       : RasterLayer 
dimensions  : 124, 71, 8804  (nrow, ncol, ncell)
resolution  : 1000, 1000  (x, y)
extent      : 301839.6, 372839.6, 5430970, 5554970  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : in memory
names       : layer 
values      : 7.738103e-05, 0.9995497  (min, max)
person Spacedman    schedule 25.01.2013
comment
Поскольку я потратил на это всего 4 часа, я добавлю к этому ответу. Что Spacedman имеет в виду, когда говорит, что смысл строк и столбцов не такой, как вы думаете, он имеет в виду, что растровый слой организован по строкам, то есть слева-справа, сверху-снизу, а матрица организована по столбцам, то есть сверху- снизу, слева направо. поэтому в этом случае dat1 [15] даст другой результат, чем r [15]. Лично я не думаю, что это достаточно четко прописано в руководстве по растрам. - person Dominik; 15.09.2014
comment
Вы также можете транспонировать матрицу (m): m <- t(m); raster(m[nrow(m):1,]). Источник: gis.stackexchange.com/questions/60387/ - person Mikko; 13.11.2019

Я думаю, вы можете неправильно понять, что означает разрешение в данном контексте. Это просто размер, деленный на количество ячеек в строках и столбцах. Например, в вашем случае разрешение рассчитывалось так:

(1011340 - 302339.6) /1241
# 571.3138

(6671470  - 5431470) / 710
# 1746.479

Итак, на самом деле это означает, что у вас есть 1241 квадрат в каждой строке, и поскольку каждая строка идет от 1011340 до 302339.6 единиц (я думаю, что в этом случае метры), каждый прямоугольник имеет 571 квадрат в поперечнике. Точно так же каждый прямоугольник равен 1746 сверху вниз.

Если вы ожидаете, что каждая точка растра будет квадратом со сторонами, равными 1000 метров, то не должен ли диапазон быть 1241*1000 (вместо (1011340 - 302339.6))?

person nograpes    schedule 25.01.2013
comment
Разрешение следует рассчитывать следующим образом: '›(1011340-302339.6) / 710 [1] 998,5921› (6671470 - 5431470) / 1241 [1] 999.1942 - person Jian Zhang; 25.01.2013