2010-02-01 4 views
24

У меня есть база данных Core Data с широтно-долготными свойствами. Есть ли способ использовать метод Core Location getDistanceFrom:, чтобы найти пять ближайших мест до CLLocation, полученных из GPS? Нужно ли загружать все объекты с помощью Core Data и анализировать их, используя getDistanceFrom: на каждом из них или есть более простой способ?Основные данные и местоположение ядра

ответ

28

Вы должны будете перебирать их один за другим; насколько я знаю, нет другого способа сделать это.

Однако вы можете сделать это более эффективным, используя ограничительную рамку, когда вы получите элементы из основных данных - это уменьшит количество возвращаемых объектов.

т.е. что-то вроде

float latMax = wantedLat + 1; 
float latMin = wantedLat - 1; 
float lngMax = wantedLng + 1; 
float lngMin = wantedLng - 1; 
NSPredicate *predicate = [NSPredicate 
    predicateWithFormat:@"lat > %f and lat < %f and lng > %f and lng < %f", 
    latMin, latMax, lngMin, lngMax]; 

Хотя, в зависимости от того, сколько у вас данных и насколько близко это интервал, вы хотите использовать другой номер, чем 1!

Сэм

PS Кроме того, я не принял во внимание тот факт, что долгота обертками!

+0

Похоже, полезный код, спасибо. –

+0

Спасибо за это - я использовал что-то подобное в своем приложении. Но мне кажется, что оба набора < and > - это неправильный путь! – iPhoneDollaraire

+0

Вы правы - oops! – deanWombourne

2

Вы не можете использовать CoreData для поиска ближайшего объекта, но можете сузить запрос с помощью ограничивающего прямоугольника. Чтобы найти ближайший объект, вы можете использовать просто разницу в lat/long, которая значительно быстрее, чем вычисление фактических расстояний.

У меня был подобный вопрос:

CoreData: Find minimum of calculated property

+0

Спасибо за ссылку. –

2

Следующий пример - это то, что вы ищете. Он использует функцию SQLite для вычисления расстояния в предложении ORDER BY (формула Хаверсина). Проблема заключается в том, что этот пример не использует Core-Data, а SQLite API напрямую.

http://www.thismuchiknow.co.uk/?p=71

Смежные вопросы