我使用视频跟踪软件跟踪动物在竞技场中移动时的情况。数据是动物在时间Z的位置(帧数)的X,Y坐标(以像素为单位)。示例数据框如下所示:
x <- c(1,2,3,4,4,4,4,3,2,1)
y <- c(1,2,3,4,3,2,1,2,3,4)
z <- 1:length(x)
df <- data.frame(x, y, z)
我对动物的行为很感兴趣,并且想要计算一个&#34;竞技场区域的度量标准。&#34;我不确定最好的方法,但我最初的想法是从点创建一个逐步的路径,然后定义缓冲区宽度到创建多边形的路径,最后,计算多边形下面的平面区域。在视觉上,我可以想象:
plot(x, y, type = "o", lwd = 20)
我没有像这样的空间数据经验,但我认为&#39;我可以光栅化这条路吗?不幸的是,lwd
命令不是绝对的,所以如果我的平面扩展,线宽就不会随之扩展。
我更愿意使用R而不是GIS软件。
我怀疑有一个更优雅的解决方案?
答案 0 :(得分:2)
我不是研究动物之路的专家,但我认为这是个好主意。
我们可以使用sf
包,它是分析R中空间数据的下一代类和方法标准。
为了说明它是如何工作的,让我们从一个简单的例子开始。我们将从c(0, 1)
到c(1, 1)
画一条线。然后我们将创建一个距离等于1的缓冲区。最后,我们将计算缓冲区的面积。
library(sf)
# Create a simple feature object based on df
ps <- as.matrix(rbind(c(0, 1), c(1, 1)))
ls <- st_linestring(ps)
# View the line
plot(ls)
# Create a buffer zone
ls_buffer <- st_buffer(ls, dist = 1)
# View ls_buffer
plot(ls_buffer)
# Calculate the area
st_area(ls_buffer)
[1] 5.140157
线条和缓冲区看起来不错。我们还可以使用st_area
函数计算面积。缓冲区的形状类似于宽度等于1且高度等于2的矩形,加上半径等于1的圆。我们可以使用以下代码计算区域。结果类似于我们从st_area
函数得到的结果。
2 * 1 + 1 * 1 * pi
[1] 5.141593
现在,您可以轻松修改上述代码。我将缓冲距离设置为0.1,但您需要确定合理的缓冲距离。
# Create example data frame
x <- c(1,2,3,4,4,4,4,3,2,1)
y <- c(1,2,3,4,3,2,1,2,3,4)
z <- 1:length(x)
df <- data.frame(x, y, z)
# Create a simple feature object based on df
ps <- as.matrix(df[, c("x", "y")])
ls <- st_linestring(ps)
# View the line
plot(ls)
# Create a buffer zone
ls_buffer <- st_buffer(ls, dist = 0.1)
# View ls_buffer
plot(ls_buffer)
# Calculate the area
st_area(ls_buffer)
[1] 2.263725
sf
包是相当新的,所以我还在学习它,可能还有很多我还不知道的功能。如果您想了解更多信息,请访问CRAN(https://cran.r-project.org/web/packages/sf/index.html)上的此软件包网站并访问这些小插图。
答案 1 :(得分:1)
这种方法涉及R中的GIS技术,但我认为它相当简单,并遵循您所设计的三个步骤。
library(sp)
library(rgeos)
library(dplyr)
#Convert points to path (SpatialLines object)
SOlines <- Line(coordinates(df[,1:2])) %>% list() %>% Lines(ID="test") %>% list() %>% SpatialLines()
#Buffer the path into a polygon
area <- rgeos::gBuffer(SOlines,width = .1, byid = T)
#Calculate the area within the Polygon
rgeos::gArea(area,byid=T)
test
2.262897
sf
包(如ycw的答案)有一种更简单的方法来创建行路径。我对这个软件包还不是很熟悉,但我现在仍然保持这个答案,因为使用SpatialLines方法的一个好处是你可以在一个对象中存储多个行(ID),然后计算所有区域在gArea
的一次通话中。