Как извлечь значения из растров при расположении точек в R?

13

Мой вопрос касается извлечения значений из растров в месте расположения точек. С функцией извлечения это очень легко, и функция дает мне информационный фрейм со значениями всех переменных в точках. Я хочу иметь в этом фрейме координаты каждой точки. Как я могу это сделать? Можно ли сказать R, что при извлечении значений из растра также добавляются столбцы точки местоположения.

Это моя процедура:

presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")

lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)

variables_presencia<-extract(variables, presencias)

результаты примерно такие:

> bio1  bio12  bio18  bio2  bio4 
> 90    875    165    95    4886
> 115   1085   158    83    4075
> 135   1153   153    67    3402
> 85    1026   137    99    5203
> 96    667    128    108   5823
> 98    531    109    113   6305
> 132   450    63     123   6598
> 132   569    104    106   5963
> 95    814    196    98    5571
> 146   474    39     114   6603

Но я хочу еще два столбца с данными координат (но это могут быть и другие столбцы из моей таблицы местоположений, извлекающих csv).

Большое спасибо.

JMCosta
источник
Извините, формат результатов, показанных ранее, не является правильным.
JMCosta
Должно быть пять столбцов (bio1, bio12 .... bio4)
JMCosta
Разве значения не должны соответствовать вашим координатам presencias?
Роман Луштрик
Значения переменных взяты из точек присутствия. Но я хочу, чтобы координаты точек в таблице тоже. но я не знаю, как это сделать.
JMCosta
Как насчет чего-то вроде cbind(coordinates(presencias), variables_presencia)? Затем вы можете конвертировать в SPDF с помощью coordinates(result) <- ~ X + Yи снова использовать множество методов, разработанных для пространственных объектов.
Роман Луштрик

Ответы:

20

Предполагая это presenciasи variablesразделяя ту же самую проекцию, это должно быть легкой задачей. Я рекомендую вам добавить эти строки кода после вашего read.table()оператора, чтобы преобразовать presenciasdataframe в объект SpatialPointsDataFrame (просто уточните имена столбцов, содержащих координаты x и y, если они отличаются от моего примера).

coordinates(presencias) <- c("x", "y")

Чтобы привести воспроизводимый пример, я попытаюсь раскрыть сферу моего ответа немного подробнее. Прежде всего, скачайте и распакуйте этот шейп- файл ESRI в более или менее важных местах в Германии. Они будут служить точечными данными позже. Вам также понадобятся пакеты dismo, rgdalи rasterдля этого короткого примера убедитесь, что эти библиотеки (и все их зависимости) установлены на вашем локальном жестком диске.

Начнем с загрузки необходимых пакетов.

library(dismo)
library(rgdal)
library(raster)

Далее вы должны сгенерировать образец RasterLayer. В нашем случае мы будем использовать gmap()функцию из dismoпакета, чтобы получить физическую карту Германии.

germany.mrc <- gmap("Germany")

Теперь вы можете импортировать свой шейп-файл точек readOGRиз rgdalпакета R. Обязательно настройте имя источника данных (dsn = ...). Весь проект проекции устарел в вашем конкретном случае. Однако это необходимо сделать в нашем примере, чтобы успешно наложить наши точечные данные на растровый слой Германии.

# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))

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

set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]

Теперь, когда подготовка завершена, мы можем просто начать извлекать значения тех конкретных пикселей, в которых находятся наши десять случайно выбранных точек.

data <- data.frame(coordinates(germany.places.mrc.sample),
                   germany.places.mrc.sample$name, 
                   extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")

Чтобы объединить координаты точки с извлеченными значениями пикселей, нам просто нужно установить фрейм данных, содержащий координаты нашего SpatialPointsDataFrame. Это оно!

data
           x       y          name value
1  1073490.3 6513446 Veitsteinbach   208
2  1269100.8 6156690   Assenhausen   231
3  1336757.5 6246284    Frauenwahl   195
4   828579.9 6634122      Altenhof   189
5  1571418.1 6662558         Wohla   151
6  1192299.4 6864087     Flechtorf   170
7   976270.0 6362050    Hilsenhain   208
8  1117416.4 6092146      Nestbaum   175
9  1274192.0 6344490 Wappeltshofen   236
10  878488.2 6839843        Leeden   208
fdetsch
источник
1

Конечно, вы можете просто сделать:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(предполагается, что ваши координаты находятся в двух столбцах, называемых «х» и «у»)

Джек Харрисон
источник
Я думал таким образом, но у меня были следующие сомнения: датафрейм, полученный в результате извлечения, имеет тот же порядок, что и присутствие. (первая строка таблицы данных - это первая строка таблицы присутствия)
JMCosta
И еще: если для каких-либо точек (3 или 4) не было переменных данных, номер строки не будет одинаковым, и порядок наверняка не будет одинаковым.
JMCosta
@JMCosta: вы не правы в этом. Значения NA будут возвращены для этих точек.
Роберт Хейманс