2017-06-07 32 views
0

元の点、距離、角度を与えられた新しい点の座標を計算したい。座標、距離、角度から座標を計算する

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

+3

二重と等価を比較しないでください。丸めのため、少し違います。0.89944444≈0.89932160 – emed

+0

丸め誤差のようです。 – Radiodef

答えて

0

に触発されました。あなたはどこで正しい結果と地球の大きさを得ましたか? 6371e3が1e3だけオフになっていると、1.6e-4というエラーが発生します。倍に1e-4を超える丸め誤差よりも不正確な定数になりがちです。

+0

経度の丸め誤差が正しいです。 東に90度移動すると、緯度は0.0になりますか? 私は[this site](http://www.movable-type.co.uk/scripts/latlong.html)という結果フォームを取得しました。 – cklar

関連する問題