5

2 つの GPS ポイント間の距離をスムーズに計算する方法を探しているので、次のような結果が得られます。ここで、私の位置は (0,0) で、他の位置は私の位置からメートル単位で (x, y) の距離を示しています。

私の考えは、harsine 式を使用してポイント間の距離を計算することでした。(これは私の斜辺を返します)

それに加えて、この 2 点間の方位を計算しています。これが私のアルファです。

この 2 つの値を使用して、基本的な三角関数を使用して問題を解決したいと考えました。

だから私は計算しようとしました: catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse.

たぶん私は何か間違ったことをしているかもしれませんが、私の結果は現時点では役に立たない.

だから私の質問は: 2 つの GPS ポイント間の x 方向と y 方向の距離を計算するにはどうすればよいですか?

次の手順でアルファを計算しています。

public static double bearingTo(GPSBean point1, GPSBean point2) {
    double lat1 = Math.toRadians(point1.latitude);
    double lat2 = Math.toRadians(point2.latitude);
    double lon1 = Math.toRadians(point1.longitude);
    double lon2 = Math.toRadians(point2.longitude);

    double deltaLong = lon2 - lon1;

    double y = Math.sin(deltaLong) * Math.cos(lat2);
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
            * Math.cos(lat2) * Math.cos(deltaLong);
    double bearing = Math.atan2(y, x);

    return (Math.toDegrees(bearing) + 360) % 360;
}
4

3 に答える 3

6

NYC とボストンのおおよその座標を基準点として使用し、 http: //www.movable-type.co.uk/scripts/latlong.html にある Haversine 式を実装して、コードを実装しました見せる):

long1 = -71.02; lat1 = 42.33;
long2 = -73.94; lat2 = 40.66;

lat1 *=pi/180;
lat2 *=pi/180;
long1*=pi/180;
long2*=pi/180;

dlong = (long2 - long1);
dlat  = (lat2 - lat1);

// Haversine formula:
R = 6371;
a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2)
c = 2 * atan2( sqrt(a), sqrt(1-a) );
d = R * c;

このコードを実行d = 306すると、上記のサイトの回答と一致する が得られます。

方位については、サイトが提供したものに近い 52 度を取得します。

コードの残りの部分を見ないと、答えが異なる理由を知るのは困難です。

注: 2 つの点が接近している場合、あらゆる種類の近似を行うことができますが、このコードは引き続き機能するはずです。式はsin経度と緯度の差 (sin の差ではなく)を使用しているため、数値的に安定しています。 )。

補遺:

x、y (あなたの質問) のコードを使用して、距離の賢明な値を取得します-120 m 以内の「適切な」回答に同意します (一方は直線近似であり、もう一方は直線に従うため、これは悪くありません)。地球の曲率)。したがって、タイプミスを修正したので、コードは基本的に問題ないと思います。

于 2013-04-08T23:08:13.833 に答える