Spatial data extraction around buffered points in R
[This article was first published on Ecology in silico, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Quantifying spatial data (e.g. land cover) around points can be done in a variety of ways, some of which require considerable amounts of patience, clicking around, and/or cash for a license. Here’s a bit of code that I cobbled together to quickly extract land cover data from the National Land Cover Database for buffered regions around points (e.g. small ponds, point-count locations, etc.), in this case, U.S. capitals.
Here, extract_cover() is a function to do the extraction (with the help of the raster package), and extraction.R makes a parallel call to the function using the doMC package:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # Function to extract the data in R instead of Arc
# inputs: year, buffer size (in meters), point data file,
# cover data directory, and output file directory
# output: csv file with site id, cover type, and % in buffer
extract_cover <- function(year, buffer,
point_d = "sites.csv",
data_dir="NLCD_data",
write_dir="extracted"){
require(raster)
require(rgdal)
require(stringr)
# load cover data
filename <- paste(data_dir, "/nlcd_",
year,
"_landcover_2011_edition_2014_03_31.img",
sep="")
NLCD <- raster(filename)
# load site data
sites <- read.csv(point_d, header=T)
coords <- sites[, c("longitude", "latitude")]
#convert lat/lon to appropriate projection
names(coords) <- c("x", "y")
coordinates(coords) <- ~x + y
proj4string(coords) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
crs_args <- NLCD@crs@projargs
sites_transformed <- spTransform(coords, CRS(crs_args))
#extract land cover data for each point, given buffer size
Landcover <- extract(NLCD, sites_transformed, buffer=buffer)
# summarize each site's data by proportion of each cover type
summ <- lapply(Landcover, function(x){
prop.table(table(x))
}
)
# generate land cover number to name conversions
num.codes <- unique(unlist(Landcover))
cover.names <- NLCD@data@attributes[[1]]$Land.Cover.Class[num.codes + 1]
levels(cover.names)[1] <- NA # first level is ""
conversions <- data.frame(num.codes, cover.names)
conversions <- na.omit(conversions)
conversions <- conversions[order(conversions$num.codes),]
# convert to data frame
mydf <- data.frame(id = rep(sites$id, lapply(summ, length)),
cover = names(unlist(summ)),
percent = unlist(summ)
)
# create cover name column
mydf$cover2 <- mydf$cover
levels(mydf$cover2) <- conversions$cover.names
# write output
out_name <- paste(write_dir, "/",
year, "_cover_", buffer,
"_m_buffer.csv", sep="")
write.csv(mydf, out_name)
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Script to actually extract the data at various buffer distances
# parallelized for speed (one core per year)
library(doMC)
years <- c(2001, 2006, 2011)
nyears <- length(years)
registerDoMC(nyears)
# input vector of distances (in meters)
buffer_distances <- c(1000)
foreach (i=1:nyears) %dopar% {
for (j in buffer_distances){
extract_cover(year = years[i], buffer=j)
}
}
|
Resources
- Large .img file processing in R (GIS) on Stack Overflow by Israel Del Toro
- Population and Location of U.S. State Capitals csv file
- NLCD website
To leave a comment for the author, please follow the link and comment on their blog: Ecology in silico.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.