17

つまり、次の関数があります。これは、オンラインで見つかった式を応用したもので、2つの緯度/経度座標を取り、それらの間の距離をマイル単位で求めます(球体地球に沿って)。

public static double distance (double lat1, double lon1, double lat2, double lon2) {
        double theta = toRadians(lon1-lon2);
        lat1 = toRadians(lat1);
        lon1 = toRadians(lon1);
        lat2 = toRadians(lat2);
        lon2 = toRadians(lon2);

        double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
        dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;

        return dist;
    }

私が知る限り、これは問題なく機能します。

私が必要としているのは、地球のジオメトリのまったく同じモデルを使用して、単一の緯度/経度ペア[A]、方位、および距離を取り、次のような新しい緯度/経度ペア[B]を出力する2番目の関数です。ポイント[A]から開始し、指定された方向で指定された距離を移動した場合、ポイント[B]で終了します。

これは私の幾何学のスキルが私を完全に残したという事実が完全に作用するところです:)

どんな助けでも大歓迎です!

ありがとう、-ダン

4

1 に答える 1

15

私はこれらのタイプのフォーミュラのほとんどをTheAviationFormularyから入手しています。

彼が与える式は次のとおりです。

半径と距離を指定した緯度/経度

次の場合、点{lat、lon}は、点1から半径方向のtc上の距離dです。

 lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
 ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
 ENDIF 

このアルゴリズムは、dlon <pi / 2となる距離、つまり、経度で地球の円周の4分の1未満に広がる距離に制限されます。完全に一般的ですが、より長い距離が許可される場合は、より複雑なアルゴリズムが必要です。

    lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
     dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat))
     lon=mod( lon1-dlon +pi,2*pi )-pi

彼は「tc」を使用して真のコース(北から時計回りにラジアン)を表し、彼が与える距離は地球の表面に沿った弧のラジアンであることに注意してください。これは、フォーミュラリーの最初のセクションで説明されています(海里から前後に変換するフォーミュラとともに)。また、そのページの「実装上の注意」と「実施例」も確認してください。

于 2008-12-18T16:03:57.010 に答える