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)
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