2013-07-09 2 views
1

Я разрабатываю приложение iOS, в котором я хочу найти все местоположения в пределах некоторого радиуса.Получить места в радиусе

Есть ли какой-либо способ в объективе-c, который позволит мне указать фиксированный радиус и местоположение, и это скажет мне, какие местоположения находятся в пределах этого радиуса?

Я сделал некоторые исследования и я получил этот код,

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
    [geocoder reverseGeocodeLocation:locationManager.location 
        completionHandler:^(NSArray *placemarks, NSError *error) 
        { 
         NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!"); 

         if (error) 
         { 
          NSLog(@"Geocode failed with error: %@", error); 
          return; 
         } 


         CLLocationDistance radius = 30; 
         CLLocation* target = [[CLLocation alloc] initWithLatitude:51.5028 longitude:0.0031]; 

         NSArray *locationsWithinRadius = [placemarks objectsAtIndexes: 
                 [placemarks indexesOfObjectsPassingTest: 
                  ^BOOL(id obj, NSUInteger idx, BOOL *stop) { 

                   return [(CLLocation*)obj distanceFromLocation:target] < radius; 

                  }]]; 

         NSLog(@"locationsWithinRadius=%@",locationsWithinRadius); 


        }]; 

но он получает сбой и показывает ошибку:

Нагрузочного приложение из-за неперехваченное исключение «NSInvalidArgumentException», причина: «- [CLPlacemark distanceFromLocation:]:

Я иду по правильному пути? это способ, чтобы найти все местоположения из моих указанных мест?

Заранее спасибо.

EDIT:

NSArray *testLocations = @[[[CLLocation alloc] initWithLatitude:19.0759 longitude:72.8776]]; 

        CLLocationDistance maxRadius = 3000; // in meters 
        CLLocation *targetLocation = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude]; //Current location coordinate.. 

        NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(CLLocation *testLocation, NSDictionary *bindings) { 
         return ([testLocation distanceFromLocation:targetLocation] <= maxRadius); 
        }]; 

        NSArray *closeLocations = [testLocations filteredArrayUsingPredicate:predicate]; 

        NSLog(@"closeLocations=%@",closeLocations); 

Когда я протоколирую closeLocations массива он показывает нулевое (пустое) значение. Координата, которую я предоставил в testLocations, находится рядом с моим текущим местоположением.

+0

У вас есть список мест (координаты), и вы хотите, чтобы выяснить, какие находятся в пределах заданного расстояния от другой координаты? Для этого вам не нужно геокодировать. Каковы ваши исходные данные? – Wain

+0

У меня есть широта и долгота всех мест в моей БД. Я хочу найти, какие lat и long близки к моей текущей «широте» и «долготе». – Krunal

+0

что случилось в моем коде? что бы это было в моем массиве меток меток? – Krunal

ответ

4

Что вы пытаетесь сделать в своем коде - это геокодирование, это процесс перевода координат по адресам и не то, что вы хотите сделать. Вместо этого вам нужно больше базовых координат. Вы можете использовать метод distanceFromLocation: в своем коде выше и просто перебирать свои координаты, преобразовывая их в объекты CLLocation (если их еще нет), а затем проверяя расстояние до вашей центральной точки.

Вместо того, чтобы использовать indexesOfObjectsPassingTest, я бы использовал filteredArrayUsingPredicate и предикат, созданный с помощью predicateWithBlock, чтобы выполнить проверку расстояния (если вы действительно не хотите, чтобы по каким-то причинам были индексы).


NSArray *testLocations = @[ [[CLLocation alloc] initWithLatitude:11.2233 longitude:13.2244], ... ]; 

CLLocationDistance maxRadius = 30; // in meters 
CLLocation *targetLocation = [[CLLocation alloc] initWithLatitude:51.5028 longitude:0.0031]; 

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(CLLocation *testLocation, NSDictionary *bindings) { 
    return ([testLocation distanceFromLocation:targetLocation] <= maxRadius); 
}]; 

NSArray *closeLocations = [testLocations filteredArrayUsingPredicate:predicate]; 
+0

отличная exaplanation ... :) можете ли вы показать мне фрагмент кода для этого же? – Krunal

+0

В первой строке 'testLocations' будет массив моей широты и долготы из моей БД? – Krunal

+0

Да, но убедитесь, что это экземпляры 'CLLocation'. Поэтому для генерации массива вам может понадобиться использовать 'initWithLatitude: longitude:'. – Wain