我想在给定原点,距离和角度的情况下计算新点的坐标。
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 :(得分:0)
纬度看起来像一个舍入误差,但经度偏差为1.37e-4,这是相当大的。你在哪里得到了正确的结果和地球的大小?如果6371e3被1e3关闭,则会出现1.6e-4的错误。它更可能是一个不精确的常数,而不是大于1e-4的舍入误差。