基于空间网格内调查位置的空间位置的池信息

Pool information based on the spatial location of survey locations within a spatial grid

我需要 运行 在占用框架内使用相机陷阱数据进行栖息地使用分析。我有几个摄像头位置(调查点),在 13 年的时间里进行了反复调查。对于占用率分析,我需要一个样本网格和每个网格单元的 detection/non 检测信息(i.e.detection 历史记录)。我将在 camtrapR 中创建这个检测历史文件,但我需要汇集我的数据,所以我有一个文件,其中包含的信息不是像现在这样每个相机陷阱站,而是每个网格单元。

问题是对于某些网格单元,我有不止一个摄像头,我需要将位于同一网格单元内的所有摄像头集中在一起 IF 它们属于同一年研究,同时跟踪 id 和为每个网格汇集在一起​​的摄像机总数(因为网格中的更多摄像机可能会导致对物种的更高检测)。

我目前拥有的: 1) 文件“camtrap_ca”,行中有摄像机站 ID,列中有 xy 坐标、开始和结束调查日期。 2) 文件“记录表”,每一行都有研究物种存在的每条记录,在列中,每个存在记录的相关日期、位置和相机 ID。 3) 网格:栅格文件,每个单元格都有一个相关联的连续编号。

我想做的事情:

1) 在我的相机陷阱位置上覆盖一个 926.6254m2 网格单元分辨率的栅格(这是我的 GIS 数据的空间分辨率)。我选择了栅格而不是多边形网格,因为我的研究区域是 523,780 平方公里,并且在 R 中创建这么大的多边形网格太慢了。

2) 在我的“camtrap_ca”文件中汇集/折叠同一年研究中位于同一网格单元格中的所有相机陷阱的信息,仅作为一条记录(行),同时添加一个新字段,用于存储为每个网格单元汇集了多少个摄像机(因为随着每个网格单元中摄像机数量的增加,物种的检测也会增加),以及汇集摄像机的 ID。

我能找到的最接近的主题是:https://gis.stackexchange.com/questions/48416/aggregating-points-to-grid-using-r and Counting species occurrence in a grid但是,它们并不是我所需要的。

A reproducible example of my data is the following: 

相机陷阱位置和操作日期

    camtrap_ca <-read.table(text = "station_code    latitude    longitude   date_start  date_end
    BF09-1  -2955950    1247610 23-09-05    30-09-05
    BF09-10 -2955950    1247610 01-10-05    10-10-05
    BF09-11 -2955950    1247610 23-09-05    16-10-06
    BF09-12 -2958100    1245020 23-09-05    30-09-05
    BF09-13 -2958550    1244090 23-09-05    30-09-05
    BF09-14 -2958130    1244300 23-09-05    30-09-05
    BF09-15 -2958130    1244300 23-09-05    30-09-05
    BF09-16 -2958260    1245340 23-09-05    30-09-05
    BF09-17 -2955950    1247610 11-10-06    16-10-06
    BF09-18 -2963780    1240270 23-09-05    30-09-05
    BF09-19 -2963780    1240270 11-10-06    16-10-06",
                            header = TRUE)

#物种记录、位置、记录日期和年份

    recordtable <- read.table(text = "station_code  latitude    longitude   DateTimeOriginal    year
    BF09-1  -2955950    1247610 24-09-05    2005
    BF09-10 -2955950    1247610 09-10-05    2005
    BF09-11 -2955950    1247610 26-09-05    2005
    BF09-12 -2958100    1245020 29-09-05    2005
    BF09-13 -2958550    1244090 29-09-05    2005
    BF09-14 -2958130    1244300 27-09-05    2005
    BF09-15 -2958130    1244300 28-09-05    2005
    BF09-16 -2958260    1245340 24-09-05    2005
    BF09-17 -2955950    1247610 15-10-06    2006
    BF09-18 -2963780    1240270 24-09-05    2005
    BF09-19 -2963780    1240270 15-10-06    2006
    ", header= TRUE)

栅格用作合并数据的参考网格

r <- raster()
    crs(r) <- "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
    ext.r <- extent(-2963780, -2955950, 1240270, 1247610)
    extent(r) <- ext.r
    res(r) <- 926.6254
    values(r)<-1:64 # Numbering each grid cell consecutively

最终产品: 我有相同的“camtrap_ca”文件,但行代表的不是我现在拥有的每个相机陷阱编号的数据,而是每个 926.6254栅格的 m2 网格单元,在列中是调查的开始和结束日期,汇集在一起​​的摄像机总数(如果有),在另一列中是每个网格单元中汇集的摄像机的 ID。这意味着我不仅需要汇集摄像机并记录它们所在的网格单元,而且如果摄像机汇集在一起​​,还必须更新每个网格的开始和结束日期。最后,将每个网格单元编号连接到 'recordtable' 文件中的每个摄像机 ID (station_code)。

如果有人可以帮助我构建代码来执行此操作,我将不胜感激!

我们只需要recordtable,不需要camtrap_ca

tab <- read.table(text = "station_code  latitude    longitude   DateTimeOriginal    year
    BF09-1  -2955950    1247610 24-09-05    2005
    BF09-10 -2955950    1247610 09-10-05    2005
    BF09-11 -2955950    1247610 26-09-05    2005
    BF09-12 -2958100    1245020 29-09-05    2005
    BF09-13 -2958550    1244090 29-09-05    2005
    BF09-14 -2958130    1244300 27-09-05    2005
    BF09-15 -2958130    1244300 28-09-05    2005
    BF09-16 -2958260    1245340 24-09-05    2005
    BF09-17 -2955950    1247610 15-10-06    2006
    BF09-18 -2963780    1240270 24-09-05    2005
    BF09-19 -2963780    1240270 15-10-06    2006", 
    header=TRUE,  stringsAsFactors=FALSE)   

你有

colnames(tab)[2:3]
#[1] "latitude"  "longitude"

这些名称显然是错误的(单位不是度,而可能是米;如您为栅格指定的 crs)。我们可以这样解决

colnames(tab)[2:3] <- c("x", "y")

不影响计算,但是我担心你的x和y会反了因为纬度一般是"y"而不是"x"。我假设情况并非如此。

给定一个 RasterLayer,您可以获得每个坐标对的单元格编号 --- 这就是您对记录进行分组所需要的。

r <- raster(crs="+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m", ext = extent(-2966000, -2954000, 1240000, 1248000), res = 926.6254)

#To illustrate you could do 
#values(r) <- 1:ncell(r)
#plot(r)
#points(tab[, c("x", "y")]) 

获取单元格编号

tab$cell <- cellFromXY(r, tab[, c("x", "y")])
tab
#   station_code        x       y DateTimeOriginal year cell
#1        BF09-1 -2955950 1247610         24-09-05 2005   11
#2       BF09-10 -2955950 1247610         09-10-05 2005   11
#3       BF09-11 -2955950 1247610         26-09-05 2005   11
#4       BF09-12 -2958100 1245020         29-09-05 2005   48
#5       BF09-13 -2958550 1244090         29-09-05 2005   61
#6       BF09-14 -2958130 1244300         27-09-05 2005   48
#7       BF09-15 -2958130 1244300         28-09-05 2005   48
#8       BF09-16 -2958260 1245340         24-09-05 2005   35
#9       BF09-17 -2955950 1247610         15-10-06 2006   11
#10      BF09-18 -2963780 1240270         24-09-05 2005  107
#11      BF09-19 -2963780 1240270         15-10-06 2006  107

有了这个,您可以使用基本 R 函数 aggregatetapply(或其他方法)

计算摘要
# transform your character dates to Date objects
tab$date <- as.Date(tab$DateTimeOriginal, "%d-%m-%y")
datemin <- aggregate(tab[, "date", drop=FALSE], tab[, "cell", drop=FALSE], min)
colnames(datemin)[2] <- "first_date"
datemax <- aggregate(tab[, "date", drop=FALSE], tab[, "cell", drop=FALSE], min)
colnames(datemax)[2] <- "last_date"
out <- merge(datemin, datemax)

# 观察次数 n <-聚合(tab$cell,tab[,"cell",drop=FALSE],长度) colnames(n)[2] <- "nobs" 输出 <- 合并(输出,n)

#个摄像头 ncam <-聚合(tab$station_code, tab[ "cell", drop=FALSE], function(i)length(unique(i))) colnames(ncam)[2] <- "n_stations" 输出 <- 合并(输出,ncam)

# add the coordinates for the cells
out <- cbind(out, xyFromCell(r, out$cell))
out
#  cell first_date  last_date n n_stations        x       y
#1   11 2005-09-24 2005-09-24 4          4 -2956270 1247537
#2   35 2005-09-24 2005-09-24 1          1 -2958124 1245683
#3   48 2005-09-27 2005-09-27 3          3 -2958124 1244757
#4   61 2005-09-29 2005-09-29 1          1 -2958124 1243830
#5  107 2005-09-24 2005-09-24 2          2 -2963683 1240124