我有动物gps数据,每天有几个位置,并且在没有记录动物位置的情况下有几天的常规间隙。另外,我有16天的卫星数据。我现在想提取与特定点对应的像素值和特定时间。
这意味着如果记录动物的位置,例如拍摄卫星图像前2天,我想提取该图像的像素值(后面的图像),而不是记录动物位置记录前14天拍摄的图像。我总是想从根据时间更接近的图像中提取。
我创建了一些测试数据,希望能够说明问题:
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)
第一个光栅名称中的数字字符串表示图像是在2012年的第一天拍摄的,第二张图像是在今年的第17天拍摄的。
例如,测试数据中的第7个位置现在应从第二个光栅文件中提取,因为它根据时间更接近。
总而言之,我有87个光栅文件和600个观察。我真的不确定如何编程。我想我可以使用substr()
从栅格名称中检索日期信息。但除此之外......
我感谢我能得到的每一个提示,以及在这种情况下可能有用的功能。
答案 0 :(得分:3)
从最后一行开始
### 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
[1] 1 1 1 1 1 1 2 2 2 2
> v
[1] 582 578 303 201 201 200 461 329 445 211
>