Usando R para extrair dados do WorldClim? [fechadas]

9

Eu tenho um conjunto de dados com 1000 latitudes e longitudes diferentes. Desejo extrair a temperatura média anual e a precipitação anual para cada uma dessas coordenadas. Esses dados podem ser facilmente obtidos no WorldClim e processados ​​usando o DIVA-GIS.

Existe alguma maneira de fazer isso no R?

Quero que minha saída final seja um quadro de dados com a temperatura e precipitação anuais para cada coordenada. Eu sou novo no GIS em R, então busco um pedaço de código básico junto com as bibliotecas necessárias para esta saída.

Cinza
fonte

Respostas:

16

Você pode usar o rasterpacote para fazer o download dos dados do WorldClim, ver ?getdatasobre resolução, variáveis ​​e coordenadas.

Como exemplo:

library(raster)
library(sp)

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

Bio 1 e Bio12 são a temperatura média anual e a precipitação anual:

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

Crio pontos aleatórios como exemplo; no seu caso, use coordenadas para criar um SpatialPointobjeto.

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

Finalmente, use extract. Com cbind.data.framee coordinatesvocê obterá o desejo data.frame.

values <- extract(r,points)

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

Eu usei pontos aleatórios, então consegui muitos NA. É de se esperar.

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)

insira a descrição da imagem aqui

Não esqueça que os dados do WorldClim têm um fator de escala de 10, assim Temp = -37como -3,7 ºC.


Com o exemplo de coordenadas:

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
fonte
Isso foi realmente útil!
Ash
Então, eu tenho pointsque é um quadro de dados de lats e longos do meu conjunto de dados. Então eu corro exatamente do jeito que você fez. No entanto, quando eu corro valueseu recebo um erro: not compatible with requested type. Notei também que seus pointsapenas marcas a extensão da amostra, mas não produz um vetor com coordenadas lat-longas
Ash
Sim, decimais em graus. Como o CRS do WorldClim é WGS 84 lat / lon (EPSG 4326). Você pode importar coordenadas em um CRS diferente e convertê-lo com spTransform. Se você tiver coordenadas no DDMMSS, transforme-as em DD.MMM. Segundo, você escreveu sobre coordenadas diferentes, então eu interpreto como pontos, você pode usar polígonos com o mesmo esquema. Se você possui uma camada com essas informações, use-as shapefilepara carregá-las.
Aldo_tapia
Eu não entendo o seu segundo ponto. Talvez eu não expliquei claramente. Marquei
Ash
Ah ok. spsamplerequer um objeto espacial para definir limites de amostra. As entradas são grades, polígonos ou linhas. O que fiz foi usar a caixa de fronteira do WorlClim para definir a extensão da amostra. Fiz isso para dar um exemplo reproduzível na minha resposta. No seu caso, você não precisa usar spsample, você já tem coordenadas para fazer a amostra.
Aldo_tapia