У меня есть база данных Core Data с широтой и долготой. Есть ли способ использовать метод Core Location getDistanceFrom:
, чтобы найти пять ближайших местоположений для CLLocation
, полученных из GPS? Нужно ли загружать все объекты с помощью Core Data и анализировать их, используя getDistanceFrom:
для каждого из них или есть более простой способ?
Основные данные и основное местоположение
Ответ 1
Вам придется проходить через них по очереди; насколько я знаю, нет другого способа сделать это.
Однако вы можете сделать это более эффективным, используя ограничивающий прямоугольник, когда вы получите элементы из основных данных - это уменьшит количество возвращаемых объектов.
то есть. Что-то вроде
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 Кроме того, я не принял во внимание тот факт, что долгота обертывается!
Ответ 2
Вы не можете использовать CoreData для поиска ближайшего объекта, но можете сузить запрос с помощью ограничивающего блока. Чтобы найти ближайший объект, вы можете использовать просто разницу в lat/long, которая значительно быстрее, чем вычисление фактических расстояний.
У меня был аналогичный вопрос:
CoreData: Найдите минимальное значение рассчитанного свойства
Ответ 3
Следующий пример - это то, что вы ищете. Он использует функцию SQLite для вычисления расстояния в предложении ORDER BY (формула Хаверсина). Проблема заключается в том, что этот пример не использует Core-Data, а непосредственно API SQLite.