我想解决的总体任务:使用移位函数,我想计算前3个点(滞后(的平均方位geosphere::bearing(p1, p2,a=6378137, f=1/298.257223563)
,并将其与后3个点的方位(超前(进行比较。
这意味着
- 计算所有3点之间的方位(滞后(
mean(bearing(point1,point2),bearing(point1,point3),bearing(point2,point3))
以及在接下来的3点之间(领先(。
mean(bearing(point4,point5),bearing(point4,point6)bearing(point5,point6))
- 计算这些轴承的平均值
- 如果前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 = 1
和counter_2 %in% c(2,3)
,counter = 2
和counter_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)))