рассчитать расстояние между 2 координатами iphone - лучшая практика - PullRequest
0 голосов
/ 16 января 2012

Я заканчиваю приложение, если мне нужно показать пользователю расстояние между ним и примерно 500 координатами.

, используя метод CLLocation для его вычисления, работает хорошо, но это занимает около 1 минуты вiPhone 4, чтобы закончить вычисления для каждого местоположения.

Каков наилучший способ сделать это?Используя span?Любой другой способ быстрее?

Спасибо всем,

rui

Ответы [ 4 ]

5 голосов
/ 16 января 2012

Я думаю, что Сахгал прав, вот код, возможно, он вам поможет.

+(CGFloat)calculateDistanceBetweenSource:(CLLocationCoordinate2D)firstCoords andDestination:(CLLocationCoordinate2D)secondCoords 
{

    // this radius is in KM => if miles are needed it is calculated during setter of Place.distance

    double nRadius = 6371;

    // Get the difference between our two points

    // then convert the difference into radians

    double nDLat = (firstCoords.latitude - secondCoords.latitude)* (M_PI/180);
    double nDLon = (firstCoords.longitude - secondCoords.longitude)* (M_PI/180);

    double nLat1 =  secondCoords.latitude * (M_PI/180);
    double nLat2 =  secondCoords.latitude * (M_PI/180);

    double nA = pow ( sin(nDLat/2), 2 ) + cos(nLat1) * cos(nLat2) * pow ( sin(nDLon/2), 2 );

    double nC = 2 * atan2( sqrt(nA), sqrt( 1 - nA ));

    double nD = nRadius * nC;

    NSLog(@"Distance is %f",nD);

    return nD; // converts to miles or not (if en_) => implicit in method
}
2 голосов
/ 03 февраля 2012

Я видел другие ответы, не знаю, верны ли они, но я думаю, что есть лучшее решение:

(из документации):

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

Вы можете использовать это так:

- (CLLocationDistance) DistanceBetweenCoordinate:(CLLocationCoordinate2D)originCoordinate andCoordinate:(CLLocationCoordinate2D)destinationCoordinate {

        CLLocation *originLocation = [[CLLocation alloc] initWithLatitude:originCoordinate.latitude longitude:originCoordinate.longitude];
        CLLocation *destinationLocation = [[CLLocation alloc] initWithLatitude:destinationCoordinate.latitude longitude:destinationCoordinate.longitude];
        CLLocationDistance distance = [originLocation distanceFromLocation:destinationLocation];
        [originLocation release];
        [destinationLocation release];

        return distance;
    }
1 голос
/ 16 января 2012

Вот код для этого ..

-(NSString *)findDistanceBetweenTwoLatLon
{
    int intEarthRadius = 3963;

    double dblLat1 = DegreesToRadians(firstLatitude);
    double dblLon1 = DegreesToRadians(firstLongitude);

    double dblLat2 = DegreesToRadians(secondLatitude);
    double dblLon2 = DegreesToRadians(secondLongitude);

    float fltLat = dblLat2 - dblLat1;
    float fltLon = dblLon2 - dblLon1;

    double a = sin(fltLat/2) * sin(fltLat/2) + cos(dblLat2) * cos(dblLat2) * sin(fltLon/2) * sin(fltLon/2) ;
    double c = 2 * atan2(sqrt(a), sqrt(1-a));
    double d = intEarthRadius * c;

    double dMeters = d * kOneMileMeters;

    NSString *strDistance = [NSString stringWithFormat:@"%1.2f meters",dMeters];

    return strDistance;
}

Определите все эти макросы ..

и для градусов в радианах

#define DegreesToRadians(degrees) (degrees * M_PI / 180)

где M_PI

#define M_PI   3.14159265358979323846264338327950288 
#define kOneMileMeters 1609.344
0 голосов
/ 16 января 2012

Вы можете попробовать другой подход. Вы можете получить длину широты обеих точек (при условии, что поиск по длине широты не займет столько времени), и есть формулы для расчета расстояния с использованием длины широты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...