1

球面座標(つまり、GPSデバイスからの緯度と経度)をデカルト座標に変換しようとしています。極座標変換方程式から導出されたこの単純な変換に従います。

次に、ユークリッド距離を適用して2点間の距離を計算していますが、検出した値は、半正矢関数を使用して計算できる距離と常に同じであるとは限りません。特に、経度が異なるが緯度が同じであると、2つのアルゴリズムによって計算される距離が同じになるのに対し、経度が同じで緯度を変更すると、値が異なることに気付きました。

これが私が使用しているCコードです:

double ComputeDistance(double lat1,double lon1, double lat2, double lon2)
{

    double dlon, dlat, a, c;
    dlon = lon2- lon1;
    dlat = lat2 - lat1;
    a = pow(sin(dlat/2),2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2),2);
    c = 2 * atan2(sqrt(a), sqrt(1-a));
    return 6378140 * c;  /* 6378140 is the radius of the Earth in meters*/


}
int main (int argc, const char * argv[]) {

    double lat1 = 41.788251028649575;
    double lat2 = 41.788251028649575;
    double long1 = -118.1457209154;
    double long2 = -118.1407209154;//just ~10 meters distant

    lat1 = DEGREES_TO_RADIANS(lat1);
    lat2 = DEGREES_TO_RADIANS(lat2);
    long1 = DEGREES_TO_RADIANS(long1);
    long2 = DEGREES_TO_RADIANS(long2);

    //transform in cartesian coordinates
    double x = 6378140 * cos(lat1) * cos(long1);
    double y = 6378140 * cos(lat1) * sin(long1);

    double x2 = 6378140 * cos(lat2) * cos(long2);
    double y2 = 6378140 * cos(lat2) * sin(long2);


    double dist = sqrt(pow(x2 - x, 2) + pow(y2 - y, 2));
    printf("DIST %lf\n", dist);
    printf("NDIST %lf\n", ComputeDistance(lat1, long1, lat2, long2));

    return 0;
}

私は何か間違ったことをしているのですか、それとも私が見ていないその背後にいくつかの数学があります(そして多分Mathoverflowボードでこれを尋ねますか?)。更新誰かがこの変換を正しく指摘したので、ボードを交差させる必要はありません。2つのポイント間の正確な距離を計算するのに意味がありません(2つの極間の距離はゼロです)。だから私はそれを次のように再定式化しています:緯度の小さなデルタ(0.0001は多かれ少なかれ10メートルに相当します)では、距離は半正矢関数(20-25%)と非常に異なるように見えるのはなぜですか?

更新2: Oli Charlesworthが指摘したように、z axisこの変換を考慮しないと、南北の違いを気にしない予測になります。これは、私が指摘したデルタの違いの原因でもあります。実際、正しい変換では、zは緯度に関連しており、それを考慮すると、2点間のユークリッド距離を計算します(現在は3D空間内)。緯度と経度の両方が、小さなデルタの適切な近似につながります。 。たとえば、緯度の程度の場合、誤差は約1.41メートルです。

4

1 に答える 1

1

これから距離が保持される 2D マップ投影はありません。ポイントの 2D 投影から距離を計算しても意味がありません。

于 2010-08-24T22:34:47.143 に答える