R;滚动窗口:计算前3个点的方位,并将其与数据帧中以下3个值的方位进行比较



我想解决的总体任务:使用移位函数,我想计算前3个点(滞后(的平均方位geosphere::bearing(p1, p2,a=6378137, f=1/298.257223563),并将其与后3个点的方位(超前(进行比较。

这意味着

  1. 计算所有3点之间的方位(滞后(
mean(bearing(point1,point2),bearing(point1,point3),bearing(point2,point3))

以及在接下来的3点之间(领先(。

mean(bearing(point4,point5),bearing(point4,point6)bearing(point5,point6))
  1. 计算这些轴承的平均值
  2. 如果前3个(滞后(点的平均方位与后3个(领先(点的(基础腹肌(dif((不同,则丢弃(领先(3个点

最好的方法是什么?它不一定是一个移位函数,但我认为它可能很合适。我只是不想写循环。以下是一个示例路径:

path<-structure(list(counter = 1:24, lon = c(11.83000844, 11.82986091, 
11.82975536, 11.82968137, 11.82966589, 11.83364579, 11.83346388, 
11.83479848, 11.83630055, 11.84026754, 11.84215965, 11.84530872, 
11.85369492, 11.85449806, 11.85479096, 11.85888555, 11.85908087, 
11.86262424, 11.86715538, 11.86814045, 11.86844252, 11.87138302, 
11.87579809, 11.87736704), lat = c(48.10980039, 48.10954023, 
48.10927434, 48.10891122, 48.10873965, 48.09824039, 48.09526792, 
48.0940306, 48.09328273, 48.09161348, 48.09097173, 48.08975325, 
48.08619985, 48.08594538, 48.08576984, 48.08370241, 48.08237208, 
48.08128785, 48.08204915, 48.08193609, 48.08186387, 48.08102563, 
48.07902278, 48.07827614)), row.names = c(NA, -24L), class = c("data.table", 
"data.frame"))

谢谢。

我不相信这对解决另一个问题有帮助(R:检测"主"路径并删除或过滤GPS跟踪,可能使用内核?(,但这是一种找到以下两点平均值的方法。

首先,你expand_grid得到所有的对,然后你向下过滤到你感兴趣的对。然后你创建一个新的数据帧,进一步过滤,这样每个计数器都有三个方位,在这一点上你可以取平均值。

第一:我想让每对lat/lon都与其他每对lat/lon相匹配。为此,我使用expand_grid,并希望用它本身扩展我们的数据。从表面上看,这是失败的,因为expand_grid的每个参数都需要唯一的名称。因此,我在呼叫之前setNames

那么:我们只需要这些点对的一个子集。特别地,我们想要计数器_2小于计数器+2的任何情况(例如,您想要counter = 1counter_2 %in% c(2,3)counter = 2counter_2 %in% c(3,4)…(

然后,您需要使用rowwise遍历数据集,并计算每一行的bearing。我们将此数据帧称为data_tmp

然后,我们进行映射和过滤,以获得counter的每个值所需的行。

library(tidyverse)
data_tmp <- path %>% 
as_tibble() %>% 
(function(X)expand_grid(X, 
X %>% setNames(c("counter_2", "lon_2", "lat_2")))) %>% 
filter(counter_2 <= counter + 2 & counter_2 > counter) %>%
rowwise() %>%
mutate(bearing = geosphere::bearing(c(lon, lat), c(lon_2,lat_2))) %>%
ungroup()
three_grouped <- tibble(counter = 1:max(path$counter)) %>%
mutate(dataz = map(.x = counter, ~ data_tmp %>% 
slice(which(data_tmp$counter_2 %in% 
data_tmp$counter_2[data_tmp$counter == .x] &
data_tmp$counter <= .x + 1 &
data_tmp$counter >= .x)))) 
three_grouped %>%
mutate(average_bearing = map_dbl(dataz, ~ mean(.x$bearing)))