10

それも不正確ですか?私はApfloatの任意精度で全体を再実装しましたが、最初に知っておくべき違いはありませんでした!!

public static double bearing(LatLng latLng1, LatLng latLng2) {
 double deltaLong = toRadians(latLng2.longitude - latLng1.longitude);

 double lat1 = toRadians(latLng1.latitude);
 double lat2 = toRadians(latLng2.latitude);

 double y = sin(deltaLong) * cos(lat2);
 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLong);
 double result = toDegrees(atan2(y, x));
 return (result + 360.0) % 360.0;
}

@Test
 public void testBearing() {

  LatLng first = new LatLng(36.0, 174.0);
  LatLng second = new LatLng(36.0, 175.0);
  assertEquals(270.0, LatLng.bearing(second, first), 0.005);
  assertEquals(90.0, LatLng.bearing(first, second), 0.005);
 }

テストの最初のアサーションは次のようになります。

java.lang.AssertionError: 予期:<270.0> でしたが:<270.29389750911355> でした

0.29 はかなり先に見えますか? これは私が実装することを選択した式ですか?

4

3 に答える 3

16

あなたがやったように見えることを正しくやったなら、A から B への最短ルートに沿って B から A の方位を把握したことになります。 A と B の間の大円であり、A と B の間の緯線の弧ではありません。

Mathematica の測地関数は、テスト位置の方位を89.7061およびとして与えます270.294

つまり、(a) 計算は正しいが、(b) ナビゲーション スキルを磨く必要があるように見えます。

于 2010-02-09T22:35:23.510 に答える
1

java.lang.AssertionError: 予期:<270.0> でしたが:<270.29389750911355> でした

この 0.29 の絶対誤差は、0.1% の相対誤差を表します。これがいかに「遠い」か。

浮動小数点数は有効数字 7 桁になります。double は 16 に適しています。三角関数または度からラジアンへの変換である可能性があります。

この情報源が信じられるなら、公式は正しいように見えます。

そのページに開始値と最終値を入力すると、報告される結果は 089°42'22 インチになります。あなたの結果を 360 度から差し引いて度、分、秒に変換すると、あなたの結果は彼らの結果と同じになります。どちらも正しいか、どちらも間違っています。

于 2010-02-09T22:24:14.890 に答える
1

これは数値の問題が原因であると確信していますか? あなたが何を計算しようとしているのか正確にはわかりませんが、球の角度を扱うとき、ユークリッド幾何学で期待されるものからわずかにずれることを認めなければなりません。

于 2010-02-09T22:27:46.307 に答える