2010-08-24 6 views
1

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

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

Вот код C Я использую: (? И, возможно, спросите это на Mathoverflow досках)

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; 
} 

я делаю что-то неправильно или есть некоторые математические за ней я не вижу. UPDATE Нет необходимости перекрещивать доски, поскольку кто-то правильно указал это преобразование, не имеет смысла для вычисления точного расстояния между двумя точками (расстояние между двумя полюсами равно нулю). Поэтому я переформулирую это как: почему при малых дельтах (0,0001, что соответствует 10 мт больше или меньше) широт расстояние кажется настолько отличным от формулы haversine (20-25%)?

UPDATE 2: Как Oli Чарльзуорт отметил, не принимая во внимание z axis делает это преобразование выступ, который не возражает против разницы в направлении север-юг. Это также является причиной разницы в дельтах, которые я указывал. Фактически, в правильном преобразовании z связано с широтой, и если вы его рассматриваете, то вычислите эвклидовое расстояние между двумя точками (в трехмерном пространстве сейчас), и широта, и долгота приведут к хорошему приближению для малых deltas. Пример для градуса широты: ошибка составляет 1,41 м.

+3

«Затем я вычисляю расстояние между двумя точками, применяя эвклидовое расстояние, но значение, которое я нахожу, не всегда совпадает с расстоянием, которое я могу рассчитать, используя формулу гаверсина». Эвклидовое расстояние - это расстояние по прямой линии b/w от точек, а «формула гаверсина» вычисляет расстояние вдоль большого круга на сфере. Почему они должны давать одинаковый результат? – Jonathan

+0

Я вычисляю расстояние между прогнозируемой точкой в ​​декартовой системе – rano

+0

@rano: это не то же самое, что расстояние по поверхности Земли. –

ответ

1

От this нет проекции 2D-карты, где расстояние сохраняется. Вычисление расстояния от 2D-проекции точек бесполезно.

+1

Я думаю, вы ошибаетесь, есть некоторые прогнозы, как указано на этой странице, которые сохраняют некоторые расстояния. «... эквидистантная проекция, такая как азимутальная эквидистантная проекция. Существуют также проекции (Maurer, Close), где сохраняются истинные расстояния от двух точек» http://en.wikipedia.org/wiki/Azimuthal_equidistant_projection – rano

+0

@rano: Да, поэтому независимо от проекции расстояние между двумя * произвольными * точками не будет сохранено. –

+0

как было сказано выше, я знаю это, я спрашиваю, почему долгота, похоже, сохраняет его с помощью такого классического преобразования – rano

Смежные вопросы