【问题标题】:Calculate coordinates from coordinates, distance and an angle从坐标、距离和角度计算坐标
【发布时间】:2017-06-07 17:58:22
【问题描述】:

我想在给定原点、距离和角度的情况下计算新点的坐标。

Position calculateDestinationPoint(Position position, double distanceInMeter, double angle) {
    double startLatitude = Math.toRadians(position.getLatitude());
    double startLongitude = Math.toRadians(position.getLongitude());
    double bearing = Math.toRadians(angle);
    double earthRadius = 6371e3;

    double angularDistance = distanceInMeter / earthRadius;

    double destinationLatitudeRadians = Math.asin(Math.sin(startLatitude) * Math.cos(angularDistance) +
            Math.cos(startLatitude) * Math.sin(angularDistance) * Math.cos(bearing));

    double destinationLongitudeRadians = startLongitude + Math.atan2(Math.sin(bearing) * Math.sin(angularDistance) * Math.cos(startLatitude),
            Math.cos(angularDistance) - Math.sin(startLatitude) * Math.sin(destinationLatitudeRadians));

    return new Position(Math.toDegrees(destinationLatitudeRadians), (Math.toDegrees(destinationLongitudeRadians) + 540) % 360 - 180);
}

不幸的是,该方法的测试没有通过

    @Test
public void test100km90Degree() throws Exception {
    Position position = new PointCalculator().calculateDestinationPoint(new Position(0.0, 0.0), 100_000, 90);
    Assert.assertEquals(new Position(0.0, 0.89944444), position);
}

日志

java.lang.AssertionError: 
Expected :Position(latitude=0.0, longitude=0.89944444)
Actual   :Position(latitude=5.506530518221826E-17, longitude=0.8993216059187716)

我不确定逻辑是否正确或我遗漏了什么。

PS:我的灵感来自this github repo

【问题讨论】:

  • 不要用等号比较双精度数,由于四舍五入,它们会略有不同,例如 0.89944444 ≈ 0.89932160
  • 看起来您遇到了舍入错误。

标签: java math latitude-longitude


【解决方案1】:

纬度看起来像一个四舍五入的误差,但经度相差 1.37e-4,相当大。你从哪里得到正确的结果和地球的大小?如果 6371e3 被 1e3 关闭,那么您会得到 1.6e-4 的错误。它更可能是一个不精确的常数,而不是双精度数大于 1e-4 的舍入误差。

【讨论】:

  • 您对经度的舍入误差是正确的。但是当我直接向东(90°)移动时,纬度仍然应该是 0.0?我得到了结果表this site。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多