Question

I have animal gps data with several locations for each day and regular gaps of several days when no location of the animal was recorded. Additionally, I have satellite data in intervals of 16 days. I would now like to extract the pixel value that corresponds to the specific point and to the specific time.

This means if the location of the animals was recorded e.g. 2 days before a satellite image was taken, I want to extract the pixel value of this image (that comes after) rather than from the images that was taken 14 days before the animal location was recorded. I always want to extract from the image that lies closer according to the time.

I created some test data that hopefully illustrates the problem:

library(sp)
library(raster)

### Create test data
# create first raster
edc2012001_m <- raster(ncol=36, nrow=18)
edc2012001_m[] <- sample(1:ncell(edc2012001_m))

# create second raster
edc2012017_m <- raster(ncol=36, nrow=18)
edc2012017_m[] <- sample(1:ncell(edc2012017_m))

rasters<-stack(edc2012001_m,edc2012017_m)

# Create xy coordinates
time<-c("2012-01-01", "2012-01-01", "2012-01-01", "2012-01-02", "2012-01-02", "2012-01-02", "2012-01-12", "2012-01-12", "2012-01-13", "2012-01-13")
x <- rep(-50,10)
y <- sample(c(-80:80), 10)
data<-data.frame(x,y,time)

# Convert data to spatial points data frame
coordinates(data) <- c("x","y")

### Extract all data from raster stack
extract(rasters, data)

The number string in the name of the first raster indicates that the image was taken on the first day in 2012, the second image was taken on the 17th day of this year.

The 7th location in the test data for example shall now be extracted from the second raster file as it lies closer according to the time.

All in all I have 87 raster files and 600 observations. I am really not sure how to program this. I guess I could use substr() to retrieve the date info from the raster names. But besides that... I am thankful for every hint I can get, also about functions that might be helpful in this context.

Was it helpful?

Solution

Starting from your last line

### Extract all data from raster stack
ex <- extract(rasters, data)

# assuming you have these names or something similar
x <- c("edc2012001_m", "edc2012017_m")
year <- as.integer(substr(x, 4, 7))
# day of year
doy <- as.integer(substr(x, 8, 10))
date <- as.Date(doy, origin=paste(year-1, "-12-31", sep=''))
time <- as.Date(time)

# time difference
dif <- t(apply(matrix(as.integer(time)), 1, function(x) x-as.integer(date)))

# smallest time difference
i <- apply(abs(dif), 1, which.min)

# combine rows and columns to select values
v <- ex[cbind(1:nrow(ex),i)]

I get

> i
 [1] 1 1 1 1 1 1 2 2 2 2
> v
 [1] 582 578 303 201 201 200 461 329 445 211
> 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top