Я пытаюсь преобразовать сферические координаты (а именно широту и долготу с устройства 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 м.
«Затем я вычисляю расстояние между двумя точками, применяя эвклидовое расстояние, но значение, которое я нахожу, не всегда совпадает с расстоянием, которое я могу рассчитать, используя формулу гаверсина». Эвклидовое расстояние - это расстояние по прямой линии b/w от точек, а «формула гаверсина» вычисляет расстояние вдоль большого круга на сфере. Почему они должны давать одинаковый результат? – Jonathan
Я вычисляю расстояние между прогнозируемой точкой в декартовой системе – rano
@rano: это не то же самое, что расстояние по поверхности Земли. –