Я пытаюсь преобразовать сферические координаты (а именно, широту и долготу от устройства 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 метра.