【发布时间】: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