【问题标题】:Calculating Daily Scaled Travel Distance for UTM Animal Movement Data in R计算 R 中 UTM 动物运动数据的每日缩放旅行距离
【发布时间】:2020-08-05 12:46:19
【问题描述】:

我正在尝试计算我的数据集中每个人每天行进的距离。我收集了 UTM 格式的跟踪数据,每个人每天都被跟踪一次。我已经通过以下方式对数据进行了子集化,因为我一直在使用它进行其他分析:

iguana.data <- read.csv(file='iguanas1-22.csv')
iguana.data
names(iguana.data)
summary(iguana.data)

#my data is in this format before subsetting
animal            datetime      x       y        species country UTMzone
1    IG001 2019-03-19 14:45:00 291671 1977162 Cyclura collei Jamaica     18N
2    IG001 2019-03-20 14:10:00 291670 1977157 Cyclura collei Jamaica     18N
3    IG001 2019-03-21 11:23:00 291670 1977157 Cyclura collei Jamaica     18N
4    IG001 2019-03-22 12:04:00 291670 1977157 Cyclura collei Jamaica     18N
5    IG001 2019-03-23 12:54:00 291671 1977162 Cyclura collei Jamaica     18N

animal.clean <- iguana.data %>%
  dplyr::select(animal, x, y, datetime)

head(animal.clean)
tail(animal.clean,10)

>
animal      x       y            datetime
1  IG001 291671 1977162 2019-03-19 14:45:00
2  IG001 291670 1977157 2019-03-20 14:10:00
3  IG001 291670 1977157 2019-03-21 11:23:00
4  IG001 291670 1977157 2019-03-22 12:04:00
5  IG001 291671 1977162 2019-03-23 12:54:00
6  IG001 291671 1977162 2019-03-24 12:40:00

animal      x       y            datetime
1602 IG0022 291693 1977345 2019-07-05 10:01:00
1603 IG0022 291693 1977345 2019-07-06 09:45:00
1604 IG0022 291693 1977345 2019-07-07 10:17:00
1605 IG0022 291693 1977345 2019-07-08 08:21:00
1606 IG0022 291693 1977345 2019-07-09 08:03:00
1607 IG0022 291693 1977345 2019-07-10 10:34:00
1608 IG0022 291693 1977345 2019-07-11 11:00:00
1609 IG0022 291693 1977345 2019-07-12 10:32:00
1610 IG0022 291693 1977345 2019-07-13 09:21:00
1611 IG0022 291693 1977345 2019-07-14 09:45:00

animal.clean$datetime <- as.POSIXct(animal.clean$datetime,
                                    format = "%Y-%m-%d %H:%M:%S", 
                                    tz = "America/Jamaica")

测量 R 中每个人的所有定位点之间的每日按比例旅行距离的最直接方法是什么?所有点的顺序都正确,但由于是无线电遥测数据,因此缺少一些日期,因此无法跟踪每一天。我发现了解决这个主题的类似问题,但没有一个专门处理我的数据格式类型。

非常感谢有关执行此操作的代码的建议,因为我对 R 相当陌生。

【问题讨论】:

  • 你可能想看看 rgeos 包和 gDistance 函数来计算给定点之间的距离。
  • 谢谢,你能给我一些关于如何在我的代码中实现它的建议吗?我尝试使用 gDistance 功能,但它不适合我。
  • 再想一想,sfrgeos 更好;请参阅下面的答案。

标签: r datetime dplyr distance utm


【解决方案1】:

我使用包 {amt} 中的函数 step_lengths 获得了相同的结果。在这里,您必须首先使用函数 make_track 创建一个轨道。之后,您可以使用 step_lengths 函数。就我而言,结果是相等的。

【讨论】:

    【解决方案2】:

    这是一个使用sf 包的可重现示例的解决方案。请务必查看示例数据集 (?meuse) 并注意我按泛滥频率类 (ffreq) 对点属性进行了分组。你可能会对动物 ID 做类似的事情。

    #load sf package
    library(sf)
    data('meuse', package = "sp")
    
    #mconvert to a spatial object
    ms <- st_as_sf(
      meuse, 
      coords = c('x', 'y'),
      crs = "+init=epsg:28992"
    )
    
    class(ms)
    
    #plot the data by flood frequency class
    plot(ms["ffreq"])
    
    #calculate pairwise distance 
    ms %>%
      group_by(ffreq) %>%
      mutate(
        lead = geometry[row_number() + 1],
        dist = st_distance(geometry, lead, by_element = T),
      )
    

    查看属性表中的 dist 属性,了解连续点之间的距离(在连续行中)。

    【讨论】:

    • 效果很好,非常感谢蒂姆。正如您所建议的,我按动物 ID 对点属性进行了分组,并且效果很好。我假设 dist 属性中的值默认以米为单位?
    • 很高兴它成功了。我相信距离单位应该与投影的单位相同。为了安全起见,我会对数据子集进行测试并在 GIS 中进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多