Расстояние между двумя географическими точками? - PullRequest

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Если вы хотите получить расстояние от двух координат, вы можете использовать этот фрагмент:

#include <math.h>
#define DEG2RAD(degrees) (degrees * 0.01745327)
#define RADIUS_OF_EARTH 6378.1

+ (float) getDistanceFromStartCoords:(CLLocationCoordinate2D)start andEndCoords:(CLLocationCoordinate2D)end 
{
    float dist = acos((cos(DEG2RAD(start.latitude))*
                 cos(DEG2RAD(end.latitude))*
                 cos((-1*DEG2RAD(end.longitude))-
                     (-1*DEG2RAD(start.longitude)))) +
              (sin(DEG2RAD(start.latitude))*
               sin(DEG2RAD(end.latitude)))) * 
            RADIUS_OF_EARTH;

    return dist;
}
3 голосов
/ 03 февраля 2011

На iPhone нет измерения расстояния, которое даст вам разрешение 2 метра.Вы можете использовать метод Core Location -[CLLocation distanceFromLocation: otherLocation], чтобы получить смещение в метрах между двумя местоположениями, но имейте в виду:

  • нигде, что я видел, Apple не объясняет, какой геодиспользуется для определения их координат, и действительно ли это один и тот же геодез для различных расчетов положения
  • модель, которую они используют, не учитывает высоту, что довольно дерьмово для расчета расстояний между объектами человеческого размерав области размером с поле.Впрочем, это хорошо для расчета расстояния между Лондоном и Москвой - ошибка мала.
  • , когда ваше устройство не подключено, использование данных о местоположении с очень высокой точностью в сочетании с обнаружением движения может полностью высосатьбатарея
  • без использования детектора движения, вы можете только определить, где находится устройство в пределах десятков метров .
2 голосов
/ 27 ноября 2012

Это «улучшение» вышеупомянутого решения.Это добавляет информацию о высоте.Кажется, что высота, которую возвращает яблоко, - в метрах.Не подходит для полета или орбиты или тому подобного, но сработает, если кто-то находится на 15 этажах прямо над другим человеком, на соседней горе и т. Д. Не прошел тщательного тестированияПредполагается, что вы не заботитесь о высоте для чего-то более 20 км.Затем он корректирует высоту, когда вы находитесь ближе к другому человеку.Таким образом, для двух человек на расстоянии 20 метров друг от друга, но на 100 метров выше, вы получите расстояние около 102 метров.Прямо в конце я переключаюсь на км для возвращения.Также обнаружена ошибка в исходном коде.

#define DEG2RAD(degrees) (degrees * 0.01745329251)
#define RADIUS_OF_EARTH 6371000.0
// km
+ (double)getDistanceFromStartCoords:(CLLocationCoordinate2D)start altStart:(double)altStart andEndCoords:(CLLocationCoordinate2D)end altEnd:(double)altEnd;
{
    double argument = (cos(DEG2RAD(start.latitude))*
                 cos(DEG2RAD(end.latitude))*
                 cos((-1*DEG2RAD(end.longitude))-
                     (-1*DEG2RAD(start.longitude)))) +
              (sin(DEG2RAD(start.latitude))*
               sin(DEG2RAD(end.latitude)));

    double dist = 0.0;
    if (argument < 1.0 && argument > -1.0) // acos will return nan for very small (0) distance
        dist = acos(argument)*RADIUS_OF_EARTH;
//    else
//        NSLog(@"found bug, %f", acos(argument));


    // Altitude hack.
    // blend in an altitude correction (blend for smoothness)
    // add in altitude difference
    double altDiff = fabs(altStart - altEnd); // altdiff
    double factor = 1.0 - dist/20000.0;
    if (factor < 0.0)
        factor = 0.0;

    dist += sqrt(dist*dist + factor*altDiff*altDiff);

    //NSLog(@"distance found, %f", dist);
    return dist/1000.0; // return km
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...