¿Usando R para extraer datos de WorldClim? [cerrado]

9

Tengo un conjunto de datos con 1000 latitudes y longitudes diferentes. Deseo extraer la temperatura anual promedio y la precipitación anual para cada una de estas coordenadas. Estos datos se pueden obtener fácilmente de WorldClim y procesar con DIVA-GIS.

¿Hay alguna forma de hacer esto en R?

Quiero que mi salida final sea un marco de datos con la temperatura anual y la precipitación para cada coordenada. Soy nuevo en GIS en R, por lo que busco un fragmento de código básico junto con las bibliotecas necesarias para esta salida.

Ceniza
fuente

Respuestas:

17

Puede usar el rasterpaquete para descargar datos de WorldClim, consulte ?getdatapara saber sobre resolución, variables y coordenadas.

Como ejemplo:

library(raster)
library(sp)

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

Bio 1 y Bio12 son la temperatura media anual y la precipitación anual:

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

Creo puntos aleatorios como ejemplo, en su caso use coordenadas para crear un SpatialPointobjeto.

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

Finalmente, use extract. Con cbind.data.framey coordinatesobtendrá el deseo data.frame.

values <- extract(r,points)

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

Usé puntos aleatorios, así que obtuve muchos NA. Es de esperarse.

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)

ingrese la descripción de la imagen aquí

No olvide que los datos de WorldClim tienen un factor de escala de 10, por lo que Temp = -37es -3.7 ºC.


Con coordenadas ejemplo:

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
fuente
Eso fue realmente útil!
Ash
Entonces, tengo pointscuál es un marco de datos de lats y longs de mi conjunto de datos. Entonces corro exactamente como lo hiciste. Sin embargo, cuando corro valuesme da un error: not compatible with requested type. También he notado que sus pointssólo marcas de la medida de la muestra, pero no produce un vector con las coordenadas de latitud desde hace mucho tiempo
Ash
Sí, decimales de grado. Porque CRS de WorldClim es WGS 84 lat / lon (EPSG 4326). Puede importar coordenadas en un CRS diferente y convertirlo con spTransform. Si tiene coordenadas en DDMMSS, transfórmelas en DD.MMM. En segundo lugar, escribiste sobre diferentes coordenadas, así que lo interpreto como puntos, puedes usar polígonos en su lugar con el mismo esquema. Si tiene una capa con esta información, úsela shapefilepara cargarla.
aldo_tapia
No entiendo tu segundo punto. Quizás, no lo expliqué claramente. He marcado el error aquí: eval.in/733232
Ash
Ah ok spsamplerequiere un objeto espacial para establecer límites de muestra. Las entradas son cuadrículas, polígonos o líneas. Lo que hice fue usar el cuadro de límite WorlClim para establecer la extensión de la muestra. Lo hice para hacer un ejemplo reproducible en mi respuesta. En su caso, no necesita usar spsample, ya tiene coordenadas para muestrear.
aldo_tapia