如何计算两个位置之间的距离

如何计算两个位置之间的距离

本文介绍了如何计算两个位置之间的距离和时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一些数据的样本

  Tag.ID TimeStep.coa        Latitude.coa Longitude.coa
   <chr>  <dttm>                     <dbl>         <dbl>
 1 1657   2017-08-17 12:00:00         72.4         -81.1
 2 1657   2017-08-17 18:00:00         72.3         -81.1
 3 1658   2017-08-14 18:00:00         72.3         -81.2
 4 1658   2017-08-15 00:00:00         72.3         -81.3
 5 1659   2017-08-14 18:00:00         72.3         -81.1
 6 1659   2017-08-15 00:00:00         72.3         -81.2
 7 1660   2017-08-20 18:00:00         72.3         -81.1
 8 1660   2017-08-21 00:00:00         72.3         -81.2
 9 1660   2017-08-21 06:00:00         72.3         -81.2
10 1660   2017-08-21 12:00:00         72.3         -81.3
11 1661   2017-08-28 12:00:00         72.4         -81.1
12 1661   2017-08-28 18:00:00         72.3         -81.1
13 1661   2017-08-29 06:00:00         72.3         -81.2
14 1661   2017-08-29 12:00:00         72.3         -81.2
15 1661   2017-08-30 06:00:00         72.3         -81.2
16 1661   2017-08-30 18:00:00         72.3         -81.2
17 1661   2017-08-31 00:00:00         72.3         -81.2
18 1661   2017-08-31 06:00:00         72.3         -81.2
19 1661   2017-08-31 12:00:00         72.3         -81.2
20 1661   2017-08-31 18:00:00         72.4         -81.1

我正在寻找一种获取每个ID行驶距离的方法.我将在VTrack包中使用ComputeDistance函数(尽管可以使用其他函数).该函数如下所示:

I'm looking for a method to obtain distances travelled for each ID. I will be using the ComputeDistance function within VTrack package (could use a different function though). The function looks like this:

ComputeDistance( Lat1, Lat2, Lon1, Lon2)

这将计算纬度/经度坐标之间的直线距离.我最终想要一个具有四列Tag.ID,Timestep1,Timestep2和distance的数据框.这是一个示例:

This calculates a straight line distance between lat/lon coordinates.I eventually want a dataframe with four columns Tag.ID, Timestep1, Timestep2, and distance. Here's an example:

Tag.ID   Timestep1            Timestep2               Distance
1657     2017-08-17 12:00:00  2017-08-17 18:00:00     ComputeDistance(72.4,72.3,-81.1,-81.1)
1658     2017-08-14 18:00:00  2017-08-15 00:00:00   ComputeDistance(72.3,72.3,-81.2,-81.3)
1659     2017-08-14 18:00:00  2017-08-15 00:00:00  ComputeDistance(72.3,72.3,-81.1,-81.2)
1660    2017-08-20 18:00:00   2017-08-21 00:00:00  ComputeDistance(72.3,72.3,-81.1,-81.2)
1660   2017-08-21 00:00:00   2017-08-21 06:00:00  ComputeDistance(72.3,72.3,=81.1,-81.2

依此类推

这是我使用的代码(感谢AntoniosK).COASpeeds2与上面的示例df完全相同:

This is the code I used (thanks AntoniosK). COASpeeds2 is exactly the same as the sample df above:

test <- COASpeeds2 %>%
  group_by(Tag.ID) %>%
  mutate(Timestep1 = TimeStep.coa,
         Timestep2 = lead(TimeStep.coa),
         Distance = ComputeDistance(Latitude.coa, lead(Latitude.coa),
                                    Longitude.coa, lead(Longitude.coa))) %>%

  ungroup() %>%
  na.omit() %>%
  select(Tag.ID, Timestep1, Timestep2, Distance)

这是我得到的df.

   Tag.ID Timestep1           Timestep2           Distance
   <fct>  <dttm>              <dttm>                 <dbl>
 1 1657   2017-08-17 12:00:00 2017-08-17 18:00:00    2.76
 2 1657   2017-08-17 18:00:00 2017-08-14 18:00:00    1.40
 3 1658   2017-08-14 18:00:00 2017-08-15 00:00:00    6.51
 4 1658   2017-08-15 00:00:00 2017-08-14 18:00:00   10.5
 5 1659   2017-08-14 18:00:00 2017-08-15 00:00:00    7.51
 6 1659   2017-08-15 00:00:00 2017-08-20 18:00:00    7.55
 7 1660   2017-08-20 18:00:00 2017-08-21 00:00:00    3.69
 8 1660   2017-08-21 00:00:00 2017-08-21 06:00:00    4.32
 9 1660   2017-08-21 06:00:00 2017-08-21 12:00:00    3.26
10 1660   2017-08-21 12:00:00 2017-08-28 12:00:00   10.5
11 1661   2017-08-28 12:00:00 2017-08-28 18:00:00    1.60
12 1661   2017-08-28 18:00:00 2017-08-29 06:00:00    1.94
13 1661   2017-08-29 06:00:00 2017-08-29 12:00:00    5.22
14 1661   2017-08-29 12:00:00 2017-08-30 06:00:00    0.759
15 1661   2017-08-30 06:00:00 2017-08-30 18:00:00    1.94
16 1661   2017-08-30 18:00:00 2017-08-31 00:00:00    0.342
17 1661   2017-08-31 00:00:00 2017-08-31 06:00:00    0.281
18 1661   2017-08-31 06:00:00 2017-08-31 12:00:00    4.21
19 1661   2017-08-31 12:00:00 2017-08-31 18:00:00    8.77

推荐答案

library(tidyverse)
library(VTrack)

# example data
dt = read.table(text = "
Tag.ID TimeStep.coa        Latitude.coa Longitude.coa
 1 1657   2017-08-17_12:00:00         72.4         -81.1
 2 1657   2017-08-17_18:00:00         72.3         -81.1
 3 1658   2017-08-14_18:00:00         72.3         -81.2
 4 1658   2017-08-15_00:00:00         72.3         -81.3
 5 1659   2017-08-14_18:00:00         72.3         -81.1
 6 1659   2017-08-15_00:00:00         72.3         -81.2
 7 1660   2017-08-20_18:00:00         72.3         -81.1
 8 1660   2017-08-21_00:00:00         72.3         -81.2
 9 1660   2017-08-21_06:00:00         72.3         -81.2
10 1660   2017-08-21_12:00:00         72.3         -81.3
", header=T)

dt %>%
  group_by(Tag.ID) %>%
  mutate(Timestep1 = TimeStep.coa,
         Timestep2 = lead(TimeStep.coa),
         Distance = ComputeDistance(Latitude.coa, lead(Latitude.coa),
                                    Longitude.coa, lead(Longitude.coa))) %>%
  ungroup() %>%
  na.omit() %>%
  select(Tag.ID, Timestep1, Timestep2, Distance)

因此,您得到以下信息:

As a result you get this:

# # A tibble: 6 x 4
#     Tag.ID Timestep1           Timestep2             Distance
#     <int> <fct>               <fct>                    <dbl>
# 1   1657 2017-08-17_12:00:00 2017-08-17_18:00:00 11.1
# 2   1658 2017-08-14_18:00:00 2017-08-15_00:00:00  3.38
# 3   1659 2017-08-14_18:00:00 2017-08-15_00:00:00  3.38
# 4   1660 2017-08-20_18:00:00 2017-08-21_00:00:00  3.38
# 5   1660 2017-08-21_00:00:00 2017-08-21_06:00:00  0.0000949
# 6   1660 2017-08-21_06:00:00 2017-08-21_12:00:00  3.38

这篇关于如何计算两个位置之间的距离和时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 22:36