根据坐标,距离和角度计算坐标

时间:2017-06-07 17:58:23

标签: java math latitude-longitude

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

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

的启发

1 个答案:

答案 0 :(得分:0)

纬度看起来像一个舍入误差,但经度偏差为1.37e-4,这是相当大的。你在哪里得到了正确的结果和地球的大小?如果6371e3被1e3关闭,则会出现1.6e-4的错误。它更可能是一个不精确的常数,而不是大于1e-4的舍入误差。