1

2つのGPS位置、たとえば51.507222、-0.1275と48.856667、2.350833がある場合、2つの間の距離を計算するためにどの式を使用できますか?半正矢関数についてはよく耳にしますが、それに関する情報や、Cへの適用方法がわかりません。

私は次のコードを書きましたが、それは非常に不正確です。誰もが理由を知っていますか?私はそれを理解することはできません。問題は関数自体にありますが、それが何であるかはわかりません。

float calcDistance(float A, float B, float C, float D) 
{
    float dLat;
    float dLon;
    dLat = (C - A);
    dLon = (D - B);
    dLat /= 57.29577951;
    dLon /= 57.29577951; 
    float v_a;
    float v_c;
    float distance;

    v_a = sin(dLat/2) * sin(dLat/2) + cos(A) * cos(C) * sin(dLon/2) * sin(dLon/2);
    v_c = 2 * atan2(sqrt(v_a),sqrt(1-v_a));
    distance = r * v_c;
    return distance;
}
4

4 に答える 4

4

あなたのコードは絶対に正しいです。

パラメータAの名前をB、、、CおよびDに変更します。 lat1lon1lat2lon2

距離をキロメートルで返します。おおよそ地球の半径であるr6371として定義する必要があります。

于 2011-05-04T11:36:37.907 に答える
2

あなたが探しているのは大円距離です。

于 2011-04-29T23:56:19.320 に答える
1

このページにはJavascriptのブロックがあり、Cで簡単に適応できると確信しています。

var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;
于 2011-04-30T00:08:04.833 に答える
1

メイビーは遅すぎますが、これが不正確な計算の理由です:-> AとC(lat1とlat2)も度からラジアンに変換する必要があります

dLat /= 57.295779513082325;
dLon /= 57.295779513082325;
lat1 /= 57.295779513082325;
lat2 /= 57.295779513082325;

よろしく、オミエ

于 2017-01-16T22:19:56.280 に答える