2011-02-03 4 views
3

Как получить точное расстояние (в метрах) с учетом двух геоточек (две пары широты/долготы)?Расстояние между двумя географическими точками?

Возможные Дубликаты:

Distance Between Two GEO Locations

Calculating the distance of geo locations

Android calculate distance between two locations

How to find distance from the latitude and longitude of two locations?

+1

Я не могу разобрать ваш вопрос. Не могли бы вы добавить некоторые знаки препинания? – mik01aj

ответ

3

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

#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; 
} 
+0

Мир не сферический. Ваше расчёт положения относительно геоида имеет ошибку до 21 км. –

+1

@Graham правильный ... но Manish Jain не будет проверять очки на двух метрах от расстояния !!! В двух метрах мировой предохранитель не меняется! – elp

+0

, но мое расстояние в CLLocation переменной не в CLLocationCoordinate2D –

3

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

  • нигде, что я видел, это Apple, объяснить, что жеода используется для их координат, и это действительно ли это тот же геод для разных расчётов позиции
  • Модель, которую они используют, не учитывает высоту, что довольно дерьмово для разработки расстояний между объектами размером с человека в области размера поля. Это хорошо для подсчета расстояния между Лондоном и Москвой, хотя - ошибка небольшая.
  • , когда устройство не подключено, используя очень-высокие данные о местоположении точности в сочетании с функцией обнаружения движения будет полностью сосать батарею
  • без использования детектора движения, вы можете сказать только тогда, когда устройство находится в within tens of metres.
2

Это «Improvment» к вышеуказанному раствору. Он добавляет информацию о высоте. Кажется, что высота, которую возвращает яблоко, находится в метрах. Не подходит для полета или на орбите или что-то подобное, но будет работать, если кто-то 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 
} 
Смежные вопросы