0

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

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

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

我想做的事:

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

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

我能找到的最接近的线程是:https ://gis.stackexchange.com/questions/48416/aggregating-points-to-grid-using-r和Counting species occur 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.6254m2 网格单元,并且在列中是调查的开始和结束日期,汇集在一起​​的摄像机总数(如果有),在另一列中是汇集在每个网格单元中的摄像机的 ID。这意味着我不仅需要合并摄像机并记录它们所在的网格单元,而且如果摄像机合并在一起,则每个网格的开始和结束日期也必​​须更新。最后,将每个网格单元编号连接到“记录表”文件中的每个摄像机 ID (station_code)。

如果有人可以帮助我构建代码来做到这一点,我将非常感激!

4

1 回答 1

1

我们只需要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], length) colnames(n)[2] <- "nobs" out <- merge(out, n)

# 摄像机数量 ncam <- 聚合(tab$station_code, tab[, "cell", drop=FALSE], function(i)length(unique(i))) colnames(ncam)[2] <- "n_stations" out <- 合并(出,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
于 2019-09-03T01:18:58.297 回答