Сомнения в преобразовании сферических координат - PullRequest
1 голос
/ 25 августа 2010

Я пытаюсь преобразовать сферические координаты (а именно, широту и долготу от устройства GPS) в декартовы координаты. Я следую за этим простым преобразованием , полученным из уравнений преобразования полярных координат.

Затем я вычисляю расстояние между двумя точками, применяя евклидово расстояние, но значение, которое я нахожу, не всегда совпадает с расстоянием, которое я могу вычислить с использованием формулы haversine . В частности, я замечаю, что при заданных разных долготах, но одинаковых широтах приводятся одинаковые расстояния, рассчитанные двумя алгоритмами, тогда как при одинаковой долготе и изменении широты используются разные значения.

Вот код 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?). ОБНОВЛЕНИЕ Нет необходимости пересекать доски, так как кто-то правильно указал, что это преобразование не имеет смысла для вычисления точного расстояния между двумя точками (расстояние между двумя полюсами равно нулю). Поэтому я переформулирую это следующим образом: почему в небольших дельтах (0,0001, что соответствует 10 или более метрам) широт расстояние кажется настолько отличным от формулы haversine (20-25%)?

ОБНОВЛЕНИЕ 2: Как отметил Оли Чарльзуорт, неучтение z axis делает это преобразование проекцией, которая не учитывает разницу между севером и югом. Это также является причиной разницы в дельтах, на которые я указывал. На самом деле, в правильном преобразовании z связано с широтой, и если вы рассмотрите это, то вычислите евклидово расстояние между двумя точками (теперь в трехмерном пространстве), и широта, и долгота приведут к хорошему приближению для небольших дельт . Например, для градуса широты ошибка составляет ~ 1,41 метра.

1 Ответ

1 голос
/ 25 августа 2010

С это , нет проекции 2D карты, где сохраняется расстояниеРасчет расстояния от 2D проекции точек бесполезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...