Рассчитать расстояние между координатами и перечислить близлежащие места в указанном порядке - PullRequest
1 голос
/ 08 августа 2011

У меня есть массив местоположений

NSArray *locations = [[NSArray alloc]initWithObjects:loc1, loc2, loc3, loc4, loc5, loc6, loc7, loc8, loc9, nil];

Я перебираю массив и сохраняю различные расстояния от моего текущего местоположения до loc1, loc2 и т. Д. В другом массиве и сортирую их от ближайшего к дальнему,Это работает как шарм.

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

Есть предложения?

РЕДАКТИРОВАТЬ:

Принимая во внимание ваш совет, я подумал, что яможет сделать что-то вроде этого:

У меня есть массив со всеми сохраненными расстояниями, давайте назовем массив a.

NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithObjects:locations forKeys:a];
NSArray *sortedArray = [a sortedArrayUsingSelector:@selector(compare:)];

for(int i = 0; i <[sortedArray count]; i++){
    CLLocation *loc = [dic valueForKey:[sortedArray objectAtIndex:i]];

    NSLog(@"Lat: %f , Lng: %f" , loc.coordinate.latitude , loc.coordinate.longitude);
}

Таким образом, я получу широту и долготу для разных расстояний, которые я могу проверить по моим локально сохраненным координатам.Однако из-за этого возникает ошибка:

- [Длина NSCFNumber]: нераспознанный селектор отправлен в экземпляр 0x1891f0 * Завершение работы приложения из-за неосуществленного исключения «NSInvalidArgumentException», причина: '-[NSCFNumber length]: нераспознанный селектор отправлен на экземпляр 0x1891f0 '

И он указывает мне на строку

CLLocation *loc = [dic valueForKey:[sortedArray objectAtIndex:i]];

Поток 1: Программа получила сигнал: "SIGABRT".

Есть идеи, как это исправить?

Ответы [ 3 ]

0 голосов
/ 08 августа 2011

Вы также можете теоретически сохранить имена в качестве ключей NSDictionary, с CLLocation s в качестве значений, а затем использовать метод keysSortedByValueUsingComparator: для определения расстояния, используя блок, который действует на CLLocations и Ваше ссылочное местоположение.

Это больше не требуют явного владельца информации, но вы подвержены наберешь много процессорного времени, сколько вам нужно будет рассчитать расстояние от опорного местоположения и TWO CLLocation s для каждого запуска NSComparator блок.

0 голосов
/ 08 августа 2011

Сначала внедрите этих делегатов - (при условии, что вы включили coreLocation framework и зарегистрировались для обновления местоположения.

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
   fromLocation:(CLLocation *)oldLocation
{
    // Handle location updates
} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    // Handle error
}

Расстояние между двумя CLLocation точками можно рассчитать, вызвав метод distanceFromLocation: конечного местоположения и передав его через начальное местоположение в качестве аргумента. Например, следующий код вычисляет расстояние между точками, указанными в newLocation и oldLocation:

CLLocationDistance distance = [newLocation distanceFromLocation:oldLocation];

0 голосов
/ 08 августа 2011

Я бы создал объект держателя информации, который содержит все данные для ваших разных местоположений (имя, местоположение, последнее вычисленное расстояние и т. Д.), Поместил бы все эти объекты в NSMutableArray, а затем отсортировал его, используя sortUsingSelector:или sortUsingComparator: методы для NSMutableArray.

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

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