Objective C: как составить список местоположений с ближайшей геолокацией

#objective-c #ios #geolocation #geocoding

#objective-c #iOS #геолокация #геокодирование

Вопрос:

Я составил список местоположений с информацией о широте и долготе. Могу ли я проверить, какой наилучший подход к фильтрации и заполнению списка «ближайших» геолокаций в таблице и mapview на основе моего текущего местоположения? (или пункт назначения, введенный пользователем). Также возможно ли указать, какой радиус меня интересует? например, выберите только все ближайшие книжные магазины в пределах 5 км от моего местоположения и т. Д

Ценю ваш совет по этому поводу

Zhen Hoe

Ответ №1:

Возможно, я чего-то не понимаю, но почему бы вам просто не добавить свои местоположения в MapView и не центрировать карту по текущему местоположению пользователя или где бы он ни захотел? MapKit выполнит все вычисления за вас и покажет только те, которые расположены ближе к центру. Пользователь может устанавливать свой собственный радиус, увеличивая и уменьшая масштаб. MapKit высоко оптимизирован именно для этой цели, именно так вы можете увидеть «дождь булавок» в режиме реального времени.

Обновление: Вы также можете пойти другим путем: как только у вас появятся примечания на карте, вы можете запросить карту для тех примечаний, которые находятся в видимой области с помощью:

 - (NSSet *)annotationsInMapRect:(MKMapRect)mapRect
  

Из документов:

Этот метод предлагает быстрый способ извлечения объектов аннотации в определенной части карты. Этот метод намного быстрее, чем выполнять линейный поиск объектов в свойстве annotations самостоятельно.

Комментарии:

1. @Mike, это похоже на то, что мне нужно :). Могу ли я уточнить у вас, как я могу это запустить? Я могу добавить все примечания к MapView при запуске (около 1000 ), как мне показать не все 1000, а только те, которые находятся рядом с местоположением пользователя? Сейчас я использую core data для хранения всех координат мест, которые я хочу показать. Спасибо!

2. Вы можете указать область отображения карты с помощью setRegion: с центром по местоположению пользователя, и на карте будут отображаться только те, которые находятся в видимой области. Установите диапазон для регулировки эффективного уровня масштабирования.

3. @Mike, спасибо! Могу ли я просто подтвердить, как я должен реализовать метод? Я сделал что-то вроде этого NSSet *nearby = [self annotationsInMapRect:self.MapView.frame]; Но это приводит к сбою программы. Что я здесь делаю не так?

4. Вы передаете self.MapView.frame, который является CGRect (который использует CGFloat внутри), и вам нужно передать MKMapRect (который использует double внутри). Найдите MKMapRect в документах.

5. P.S. Всякий раз, когда вы говорите «произошел сбой», вы также должны предоставить информацию о том, как и где произошел сбой; существует бесконечное количество способов, которыми все может произойти сбой.

Ответ №2:

Вы можете счесть - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location это очень полезным http://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/occ/instm/CLLocation/distanceFromLocation:

Ответ №3:

Формула haversine часто используется в навигации для вычисления расстояний между координатами. Это довольно приличный ресурс для вычисления расстояний, и даже есть пример кода для haversine (хотя он на Javascript).

Если ваш список местоположений относительно невелик (даже сотни), вы, вероятно, можете просто перебрать весь список и вычислить расстояние между каждым местом относительно текущего местоположения.

Комментарии:

1. И если список довольно большой, несколько тысяч, вы можете выполнить итерацию по ним с помощью dispatch_async и сообщить делегату, когда он будет завершен. 🙂

2. @Radek, да, мой список потенциально будет довольно огромным (1000 ), будет ли это слишком медленно, даже если я выполняю многопоточность?

3. Нет, у iPhone быстрый процессор.