#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 быстрый процессор.