Основные данные и расположение ядра - PullRequest
24 голосов
/ 01 февраля 2010

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

Ответы [ 3 ]

29 голосов
/ 01 февраля 2010

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

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

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

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!

Sam

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

2 голосов
/ 01 февраля 2010

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

У меня был похожий вопрос:

CoreData: найти минимум вычисляемого свойства

1 голос
/ 14 октября 2010

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

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

...