Usando R per estrarre dati da WorldClim? [chiuso]


9

Ho un set di dati con 1000 diverse latitudini-longitudini. Desidero estrarre la temperatura media annuale e le precipitazioni annuali per ciascuna di queste coordinate. Questi dati possono essere facilmente ottenuti da WorldClim ed elaborati utilizzando DIVA-GIS.

Esiste un modo per farlo su R?

Voglio che il mio output finale sia un frame di dati con la temperatura e le precipitazioni annuali per ciascuna coordinata. Sono nuovo al GIS in R, quindi cerco un pezzo di codice di base insieme alle librerie richieste per questo output.

Risposte:


17

È possibile utilizzare il rasterpacchetto per scaricare i dati WorldClim, vedere ?getdataper conoscere risoluzione, variabili e coordinate.

Per esempio:

library(raster)
library(sp)

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

Bio 1 e Bio12 sono la temperatura annuale media e la precipitazione annuale:

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

Creo punti casuali come esempio, nel tuo caso uso le coordinate per creare un SpatialPointoggetto.

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

Infine, usa extract. Con cbind.data.framee coordinatesotterrai il desiderio data.frame.

values <- extract(r,points)

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

Ho usato punti casuali, quindi ne ho ottenuti molti NA. È prevedibile.

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)

inserisci qui la descrizione dell'immagine

Non dimenticare che i dati di WorldClim hanno un fattore di scala di 10, quindi Temp = -37è -3,7 ºC.


Con esempio di coordinate:

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

È stato davvero utile!
Ash

Quindi, ho pointsquale è un dataframe di lat e long del mio set di dati. Quindi corro esattamente come hai fatto tu. Tuttavia, quando eseguo valuesottengo un errore: not compatible with requested type. Ho anche notato che hai pointsappena segnato l'estensione del campione, ma non produce un vettore con coordinate lat-long
Ash

Sì, gradi decimali. Perché CRS di WorldClim è WGS 84 lat / lon (EPSG 4326). Puoi importare le coordinate in un CRS diverso e convertirlo con spTransform. Se hai coordinate in DDMMSS, trasformale in DD.MMM. In secondo luogo, hai scritto su coordinate diverse, quindi lo interpreto come punti, puoi usare poligoni invece con lo stesso schema. Se si dispone di un livello con queste informazioni, utilizzare shapefileper caricarlo.
aldo_tapia,

Non capisco il tuo secondo punto. Forse, non ho spiegato chiaramente. Ho segnato l'errore qui: eval.in/733232
Ash

Ah ok. spsamplerichiede un oggetto spaziale per impostare i confini del campione. Gli input sono griglie, poligoni o linee. Quello che ho fatto è stato usare la finestra di selezione WorlClim per impostare l'estensione del campione. L'ho fatto per fare un esempio riproducibile nella mia risposta. Nel tuo caso, non è necessario utilizzare spsample, hai già coordinate per campionare.
aldo_tapia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.