I'm trying to figure out the USDA CropScape crop value at a GPS location for the calendar year of the location, the previous calendar year, and the following calendar year (e.g., if the date of the GPS location was 10/1/2016, I'd want to extract the crop value in that location for 2015, 2016, and 2017).
Here's the code I used to prepare my GPS and CropScape data:
library(rgdal)
library(raster)
library(sf)
library(sp)
library(rgeos)
library(adehabitatHR)
library(lubridate)
head(data)
proj <- 32612
data <- st_as_sf(data, coords=c("easting","northing"), dim="XY", crs=proj)
cropScape_2014 <- raster("./data/_raw/cropScape/cropScape_2014.tif")
cropScape_2015 <- raster("./data/_raw/cropScape/cropScape_2015.tif")
cropScape_2016 <- raster("./data/_raw/cropScape/cropScape_2016.tif")
cropScape_2017 <- raster("./data/_raw/cropScape/cropScape_2017.tif")
cropScape_2018 <- raster("./data/_raw/cropScape/cropScape_2018.tif")
cropScape_2019 <- raster("./data/_raw/cropScape/cropScape_2019.tif")
cropScape_2020 <- raster("./data/_raw/cropScape/cropScape_2020.tif")
cropScape_2021 <- raster("./data/_raw/cropScape/cropScape_2021.tif")
cropScape <- stack(cropScape_2014, cropScape_2015, cropScape_2016,
cropScape_2017, cropScape_2018, cropScape_2019,
cropScape_2020, cropScape_2021)
data <- as(data, "Spatial")
popMCP <- mcp(data, percent = 100)
popMCPbuf <- raster::buffer(popMCP, 1000)
cropScape2 <- mask(cropScape, popMCPbuf)
cropScape_cropped <- crop(cropScape2, popMCPbuf)
tz(data$date)
data$calYr <- as.numeric(strftime(data$date, format = "%Y", tz = "MST7MDT"))
dput(data[sample(nrow(data), size = 10),])
dput(head(cropScape_cropped))
Here's a small subset of my GPS data that I took at this point:
new("SpatialPointsDataFrame", data = structure(list(id = c("GT74",
"GT48", "GT52", "GT82", "GT74", "GT52", "GT82", "GT9", "GT45",
"GT43"), date = structure(c(1607320849, 1544097667, 1588500050,
1554854505, 1618632063, 1549476050, 1577080837, 1449784850, 1542376850,
1548309669), class = c("POSIXct", "POSIXt"), tzone = "MST7MDT"),
id_bioYr = c("GT74_2020", "GT48_2018", "GT52_2019", "GT82_2018",
"GT74_2020", "GT52_2018", "GT82_2019", "GT9_2015", "GT45_2018",
"GT43_2018"), state = c(1L, 1L, 3L, 2L, 1L, 1L, 2L, 2L, 2L,
1L), used = c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0), landcover = c("agricultural",
"agricultural", "agricultural", "agricultural", "agricultural",
"shadow", "water", "xericGrass", "agricultural", "agricultural"
), calYr = c(2020, 2018, 2020, 2019, 2021, 2019, 2019, 2015,
2018, 2019)), row.names = c(471519L, 253950L, 310790L, 49469L,
479572L, 293620L, 573180L, 627720L, 238551L, 151426L), class = "data.frame"),
coords.nrs = numeric(0), coords = structure(c(483309.821132995,
480304.323982496, 479889.104783906, 469493, 458709.035703965,
475920.645473197, 470714.848866241, 474984.326637862, 473390.631355455,
479941.915819768, 4866298.15517148, 4867412.65105531, 4865629.72751859,
4865043, 4864209.38410713, 4863155.30805073, 4865581.17021548,
4865450.06432659, 4865829.2649267, 4861889.90054007), .Dim = c(10L,
2L), .Dimnames = list(NULL, c("coords.x1", "coords.x2"))),
bbox = structure(c(458709.035703965, 4861889.90054007, 483309.821132995,
4867412.65105531), .Dim = c(2L, 2L), .Dimnames = list(c("coords.x1",
"coords.x2"), c("min", "max"))), proj4string = new("CRS",
projargs = "+proj=utm +zone=12 +datum=WGS84 +units=m +no_defs"))
and the crop data (not sure if this is helpful/what people would need?):
structure(c(NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_), .Dim = c(20L, 8L), .Dimnames = list(NULL, c("cropScape_2014",
"cropScape_2015", "cropScape_2016", "cropScape_2017", "cropScape_2018",
"cropScape_2019", "cropScape_2020", "cropScape_2021")))
I've been trying to write a loop that would extract my three values into new columns in data, but I don't really know how to get started.
Ideally, at the end of the loop, there would be 3 new columns added to data ("crop_calYr-1", "crop_calYr", "crop_calYr+1") and they'd be populated from the correct layers of "cropScape_cropped." I do know that I'll have to add "NA" to "crop_calYr+1" when the GPS location is from 2021.