Использование R для извлечения данных из WorldClim? [закрыто]

9

У меня есть набор данных с 1000 разных широт-долгот. Я хочу извлечь среднегодовую температуру и годовое количество осадков для каждой из этих координат. Эти данные могут быть легко получены из WorldClim и обработаны с использованием DIVA-GIS.

Есть ли способ сделать это на R?

Я хочу, чтобы мой конечный результат был кадром данных с годовой температурой и осадками для каждой координаты. Я новичок в ГИС в R, поэтому я ищу основной кусок кода вместе с необходимыми библиотеками для этого вывода.

ясень
источник

Ответы:

17

Вы можете использовать rasterпакет для загрузки данных WorldClim, ?getdataузнать о разрешении, переменных и координатах.

Как пример:

library(raster)
library(sp)

r <- getData("worldclim",var="bio",res=10)

Био 1 и Био12 - это среднегодовая температура и годовой уровень осадков:

r <- r[[c(1,12)]]
names(r) <- c("Temp","Prec")

Я создаю случайные точки в качестве примера, в вашем случае используйте координаты для создания SpatialPointобъекта.

points <- spsample(as(r@extent, 'SpatialPolygons'),n=100, type="random")    

Наконец, используйте extract. С cbind.data.frameи coordinatesвы получите желание data.frame.

values <- extract(r,points)

df <- cbind.data.frame(coordinates(points),values)

Я использовал случайные очки, поэтому я получил много NA. Этого следовало ожидать.

head(df)
           x          y Temp Prec
1  112.95985  52.092650  -37  388
2  163.54612  85.281643   NA   NA
3   30.95257   5.932434  270  950
4   64.66979  40.912583  150  150
5 -169.40479 -58.889104   NA   NA
6   51.46045  54.813600   36  549

plot(r[[1]])
plot(points,add=T)

введите описание изображения здесь

Не забывайте, что данные WorldClim имеют масштабный коэффициент 10, то Temp = -37есть -3,7 ºC.


Пример с координатами:

library(raster)
library(sp)

r <- getData("worldclim",var="bio",res=10)

r <- r[[c(1,12)]]
names(r) <- c("Temp","Prec")

lats <- c(9.093028 , 9.396111, 9.161417)
lons <- c(-11.7235, -11.72975, -11.709417) 

coords <- data.frame(x=lons,y=lats)

points <- SpatialPoints(coords, proj4string = r@crs)

values <- extract(r,points)

df <- cbind.data.frame(coordinates(points),values)

df
          x        y Temp Prec
1 -11.72350 9.093028  257 2752
2 -11.72975 9.396111  257 2377
3 -11.70942 9.161417  257 2752
aldo_tapia
источник
Это было действительно полезно!
Эш
Итак, у меня есть pointsнабор данных, состоящий из латов и длин моего набора данных. Тогда я бегу точно так же, как ты. Однако, когда я бегу , valuesя получаю сообщение об ошибке: not compatible with requested type. Я также заметил, что вы pointsпросто отмечаете экстент выборки, но не
Ash
Да, десятичные градусы. Потому что CRS WorldClim составляет WGS 84 лата / лон (EPSG 4326). Вы можете импортировать координаты в другой CRS и конвертировать его с помощью spTransform. Если у вас есть координаты в DDMMSS, преобразуйте их в DD.MMM. Во-вторых, вы написали о разных координатах, поэтому я интерпретирую их как точки, вместо этого вы можете использовать полигоны с той же схемой. Если у вас есть слой с этой информацией, используйте его shapefileдля загрузки.
aldo_tapia
Я не понимаю ваше второе замечание. Возможно, я не объяснил четко. Я отметил ошибку здесь: eval.in/733232
Пепел
Ах хорошо. spsampleтребует пространственного объекта для установки границ выборки. Входные данные - это сетки, многоугольники или линии. Что я сделал, так это использовал граничный блок WorlClim для установки экстента образца. Я сделал это, чтобы сделать воспроизводимый пример в моем ответе. В вашем случае вам не нужно использовать spsample, у вас уже есть координаты для выборки.
aldo_tapia