定义路径的宽度并计算区域

时间:2017-09-27 23:05:14

标签: r path spatial

我使用视频跟踪软件跟踪动物在竞技场中移动时的情况。数据是动物在时间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)

enter image description here

我没有像这样的空间数据经验,但我认为&#39;我可以光栅化这条路吗?不幸的是,lwd命令不是绝对的,所以如果我的平面扩展,线宽就不会随之扩展。

我更愿意使用R而不是GIS软件。

我怀疑有一个更优雅的解决方案?

2 个答案:

答案 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)

enter image description here

# Create a buffer zone
ls_buffer <- st_buffer(ls, dist = 1)

# View ls_buffer
plot(ls_buffer)

enter image description here

# 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)

enter image description here

# Create a buffer zone
ls_buffer <- st_buffer(ls, dist = 0.1)

# View ls_buffer
plot(ls_buffer)

enter image description here

# 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的一次通话中。