Много выводов в одном месте MKMapView - PullRequest
2 голосов
/ 04 февраля 2011

У меня есть сценарий, когда многие люди живут в одном доме и, таким образом, отображаются на одну и ту же долготу и широту.Я хочу иметь одну аннотацию для каждого человека.Какие варианты у меня должны иметь много аннотаций / пинов в одном месте?Как другие решили подобные проблемы?

Приветствия

Nik

Ответы [ 2 ]

10 голосов
/ 04 февраля 2011

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

Я использовал простой (он же наивный) алгоритм, при котором, когда я добавляю новую аннотацию, я проверяю, находится ли она на расстоянии d от существующей аннотации. Если это так, я создаю новую сводную аннотацию, помещаю под нее существующую аннотацию и новую аннотацию. Затем я удаляю существующую аннотацию и вместо этого добавляю совокупную аннотацию. Агрегированная аннотация имеет координату, которая является средним значением ее членов.

Этот конкретный алгоритм прост в реализации, но имеет довольно ужасную сложность, поскольку он проверяет каждую существующую аннотацию для каждой добавленной аннотации. Оптимизация будет заключаться в использовании kd tree для сокращения пространства поиска.

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

Кроме того, в MKAnnotationView выноски rightCalloutAccessoryView можно перейти к табличному представлению, в котором перечислены члены сводной аннотации, чтобы пользователь мог выбрать конкретный элемент для проверки.

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

1 голос
/ 22 апреля 2014

https://stackoverflow.com/a/15438440/2482283

Вам не обязательно использовать стороннюю платформу, потому что начиная с iOS 4.2, MKMapView имеет метод, называемый - (NSSet *) annotationsInMapRect: (MKMapRect) mapRect, который вы можете использовать длясделайте свою кластеризацию.

Посмотрите видео сеанса WWDC11 «Географическая визуализация информации с помощью MapKit».Примерно на полпути это объясняет, как это сделать.Но я обобщу концепцию для вас:

  • Элемент списка
  • Использовать две карты (вторая карта никогда не добавляется в иерархию представлений)
  • Вторая карта содержитвсе аннотации (опять же, они никогда не рисуются)
  • Разделите область карты на сетку квадратов
  • Используйте метод -annotationsInMapRect для получения данных аннотации из невидимой карты
  • Видимая карта создает своюаннотации по этим данным с невидимой карты
...