Сравнение двух экземпляров CLLocationDistance для поиска меньшего - PullRequest
0 голосов
/ 23 мая 2011

Привет У меня есть массив mapAnnotations в моем приложении. Каждый объект аннотации имеет адрес и координату. Я использую свой менеджер местоположения, чтобы узнать текущее местоположение пользователя, которое является объектом CLLocationDistance. Затем я пытаюсь перебрать массив mapAnnotations и сравнить местоположение пользователя с координатами местоположения каждой аннотации, чтобы найти ту, которая закрывается для пользователя. Вот код:

-(void)locationManager:(CLLocationManager*)_manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation
{
    self.userLocation = newLocation;
    NSLog(@"Usser location is: %@", self.userLocation);
    NSLog(@"USer location latitude = %.4f", self.userLocation.coordinate.latitude );
    NSLog(@"USer location longitude = %.4f", self.userLocation.coordinate.longitude);
    if (self.userLocation)
    {
        [self.locMgr stopUpdatingLocation];
    }
    [self calculateShortestDistanceBetweenUserAndBiz:self.userLocation];
}

//==============================================================================
-(void)calculateShortestDistanceBetweenUserAndBiz:(CLLocation *)_userLocation
{
    NSLog(@"Entering %s", __FUNCTION__);
    for(LocationMapAnnotation *tempAnnot in self.mapAnnotations)
    {
        CLLocation *tempLocation = [[CLLocation alloc] initWithLatitude:tempAnnot.coordinate.latitude longitude:tempAnnot.coordinate.longitude];
        NSLog(@"tempLocation created %@ ", tempLocation);
        CLLocationDistance tempDistance = [_userLocation distanceFromLocation: tempLocation];
        NSLog(@"tempDistance  was calculated at %d", tempDistance);
        if(!self.shortestDistance) 
        {
            self.shortestDistance = tempDistance;
            NSLog(@"Assigned value %d to shortestDistance", self.shortestDistance);
            continue;
        }
        if(self.shortestDistance >= tempDistance)
        {
        NSLog(@"Replacing shortest distance value from %d to %d", self.shortestDistance, tempDistance);
            self.shortestDistance = tempDistance;
        }
    }
}

Метод работает нормально, и вот вывод консоли:

Created a new locationmodel

Usser location is: <+43.47878384, -80.53074371> +/- 1629.00m (speed -1.00 mps / course -1.00) @ 11-05-22 8:58:10 PM Eastern Daylight Time

USer location latitude = 43.4788

USer location longitude = -80.5307

Entering -[locationModel calculateShortestDistanceBetweenUserAndBiz:]

tempLocation created <+43.69445000, -79.75080000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at 629486151

Assigned value 629486151 to shortestDistance

tempLocation created <+43.62192000, -79.52238000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at 209234637
tempLocation created <+43.59233000, -79.54258000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at -1442027836
tempLocation created <+43.57980000, -79.61713000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at -680604989

tempLocation created <+43.55260000, -79.58553000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at -1882725832
tempLocation created <+43.58191000, -79.71417000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at 947780311

Replacing shortest distance value from 629486151 to 1089496493

tempLocation created <+43.65530000, -79.41298000> +/- 0.00m (speed -1.00 mps / course -1.00) 

tempDistance  was calculated at 1561068529

tempLocation created <+43.64854000, -79.38776000> +/- 0.00m (speed -1.00 mps / course -1.00) 
tempDistance  was calculated at 466814513

tempLocation created <+43.47690000, -80.52500000> +/- 0.00m (speed -1.00 mps / course -1.00) 
tempDistance  was calculated at -1816387020
Replacing shortest distance value from 947780311 to 1089489801
Received memory warning. Level=1

Мой вопрос сейчас, когда функция работает, я пытаюсь понять, что означают значения? Например, значения, присвоенные кратчайшему расстоянию и временному расстоянию, являются огромными числами, но что они представляют? Откуда я знаю, что функция работает нормально. Я не понимаю Я хочу иметь возможность использовать это значение кратчайшего расстояния, чтобы установить мой MKMapview здесь, я не буду заменять строку ниже значением, которое соответствует кратчайшему расстоянию от cetercoord, которое является местоположением пользователя

MKCoordinateRegion preRegion = MKCoordinateRegionMakeWithDistance(centerCoord, 15000, 15000); 

Пожалуйста, помогите.

1 Ответ

3 голосов
/ 23 мая 2011

CLLocationDistance имеет тип double, поэтому вам нужно использовать %f вместо %d (для целых).Вероятно, именно поэтому вы видите очень большие бессмысленные числа.

Предполагая, что shortestDistance также объявлено как CLLocationDistance, сделайте то же самое при регистрации этого.

CLLocationDistanceв метрах, что также является ожиданием MKCoordinateRegionMakeWithDistance для последних двух параметров, так что строка может быть:

MKCoordinateRegion preRegion = MKCoordinateRegionMakeWithDistance
    (centerCoord, shortestDistance, shortestDistance); 

Еще одна не связанная вещь:

У вас есть утечка памяти: вам нужно освободитьtempLocation после звонка на distanceFromLocation.

...