使用ChronoUnit从GPS点计算平均速度

时间:2019-03-15 19:10:11

标签: java csv gps

我想从两个点对象计算平均速度。点对象包含时间戳记LongitudeLatitudeelevation

我知道我需要计算轨道上第一点和最后一点在两次测量之间经过的时间。我希望为此使用ChronoUnit类型-具体来说,之间的方法,我相信可以在ChronoUnit.SECONDS上调用它,以秒为单位来测量时间间隔。

到目前为止我所拥有的(基本上是一个存根,以便运行UnitTests):

  // Average speed method
    public double averageSpeed() {
        double avgSpeed = 0;
        if (track.size () < 4) {
            throw new GPSException ("Not enough points to compute");
        } else {
            return avgSpeed;
        }
    }

从.csv文件读取点,可以在此处查看示例:

Time,Longitude,Latitude,Elevation
2016-02-17T09:34:53Z,-1.536369,53.796796,35.0
2016-02-17T09:35:14Z,-1.536506,53.796819,35.1
2016-02-17T09:35:21Z,-1.536657,53.796798,35.2
2016-02-17T09:35:28Z,-1.536817,53.796783,35.3
2016-02-17T09:35:31Z,-1.536892,53.796711,35.4
2016-02-17T09:35:34Z,-1.536967,53.796623,35.5

我的问题是我想知道如何使用ChronoUnit类型来计算和返回averageSpeed()-特别是between方法以秒为单位来测量时间间隔。

3 个答案:

答案 0 :(得分:0)

也许将每一行加载到此类的实例中,并使用distanceFrom()和secondsUntil()方法来帮助您计算速度。

sum()

答案 1 :(得分:0)

您可能知道,平均速度是行进距离除以时间。

要计算总距离,您需要计算成对点之间的距离并求和。

时间更容易,因为它是一维的。您只需要从第一点到最后一点之间的时间。例如:

    Instant firstTime = Instant.parse("2016-02-17T09:34:53Z");
    Instant lastTime = Instant.parse("2016-02-17T09:35:34Z");
    long totalTime = ChronoUnit.SECONDS.between(firstTime, lastTime);
    System.out.println("Total time: " + totalTime + " seconds");
  

总时间:41秒

答案 2 :(得分:0)

感谢帮助人员。它帮助我提出了自己的完美解决方案:

 // Average speed method calling totalDistance() to compute
  public double averageSpeed() {
    double tDistance = totalDistance();

    if (track.size() == 0) {
      throw new GPSException("Track is empty.");
    }
    if (track.size() == 1) {
      throw new GPSException("Track only contains a single point.");
    }
    ZonedDateTime t1 = track.get(0).getTime();
    ZonedDateTime t2 = track.get(track.size() - 1).getTime();

    double time = ChronoUnit.SECONDS.between(t1, t2);
    double avgSpeed = tDistance / time;
    return avgSpeed;
  }
}