元の点、距離、角度を与えられた新しい点の座標を計算したい。座標、距離、角度から座標を計算する
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:私は、緯度が丸め誤差のように見えるが、経度はかなり大きいである、1.37e-4によってオフであるthis github repo
二重と等価を比較しないでください。丸めのため、少し違います。0.89944444≈0.89932160 – emed
丸め誤差のようです。 – Radiodef