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'm a newbie at GIS in R, so I seek a basic code chunk along with the required libraries for this output.
You can use
raster package to download WorldClim data, see
?getdata to know about resolution, variables and coordinates.
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
points <- spsample(as(r@extent, 'SpatialPolygons'),n=100, type="random")
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[]) plot(points,add=T)
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
protected by Community♦ Oct 24 '17 at 12:05
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?