Sunday, 29 January 2017

climate - Using R to extract data from WorldClim?



I have a data set with 1000 different latitudes-longitudes. I wish to extract average annual temperature and annual precipitation for each of these coordinates. These data can easily be obtained from WorldClim and processed using DIVA-GIS.


Is there anyway to do this on R?


I want my final output to be a dataframe with the annual temperature and precipitation for each coordinate. I am new at GIS in R, so I seek a basic code chunk along with the required libraries for this output.



Answer



You can use raster package to download WorldClim data, see ?getdata to know about resolution, variables and coordinates.


As example:


library(raster)

library(sp)

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

Bio 1 and Bio12 are mean anual temperature and anual precipitation:


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

I create random points as example, in your case use coordinates to create a SpatialPoint object.


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


Finally, use extract. With cbind.data.frame and coordinates you will get the desire data.frame.


values <- extract(r,points)

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

I used random points, so I got a lot of NA. It is to be expected.


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)

enter image description here



Don't forget that WorldClim data has a scale factor of 10, so Temp = -37 is -3.7 ÂșC.




With coordinates example:


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

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...