基于空间网格内调查位置的空间位置的池信息
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 函数 aggregate
或 tapply
(或其他方法)
计算摘要
# 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
我需要 运行 在占用框架内使用相机陷阱数据进行栖息地使用分析。我有几个摄像头位置(调查点),在 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 函数 aggregate
或 tapply
(或其他方法)
# 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