Ограничить количество отображаемых аннотаций - PullRequest
1 голос
/ 10 февраля 2012

Привет, у меня хорошо работает приложение, оно загружает аннотации к нескольким различным картам из разных списков.

Моя проблема в том, что на одном из моих списков примерно 5000 аннотаций, а для просмотра карты требуется около 20 секунд.показать аннотации.

Можно ли как-нибудь ограничить количество загружаемых аннотаций, скажем, радиусом в 20 км от текущего местоположения?

Сократит ли это время загрузки?

Я не хочу переделывать все с нуля и настраивать базу данных, поскольку я в основном готов, так что plist - это то, что у меня есть.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

5000 баллов - не очень много, у меня есть базы данных с 100 000 баллов, и это все еще значительно быстрее (я не использую MapKit).Если это занимает 20 секунд, то он должен выполнять какой-то сетевой трафик для каждого маркера?

Содержит ли ваш список значений широту / долготу каждого маркера?Если это так, то вы можете создать объект CLLocation для каждого маркера на карте и объект CLLocation для центра карты, а затем использовать [mapCentre distanceFromLocation:markerLocation] для расчета расстояния (в метрах) от центра домаркер.

Отбросьте все, что не указано на карте, и вам будет хорошо.

Если вы хотите разбить ваш список на более мелкие файлы, я бы разделил их наих местоположение.Например, любой маркер, широта / долгота которого начинается с 125,1 / -19,1, будет в одном файле.

Мой опыт работы с Австралией состоит в том, что такие города, как Мельбурн, имеют массу вещей в очень маленькой области, в то время какОстальная часть страны почти пуста.Поэтому трудно разбить вещи на более мелкие куски.

Кроме того, запустите ваше приложение с помощью функции «Профиль времени» в Инструментах, чтобы узнать, что на самом деле занимает так много времени.Это пункт меню Product -> Profile в Xcode.Вы можете найти множество учебных пособий, как использовать его в Интернете.

1 голос
/ 11 февраля 2012

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

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

Например, вы можете разбить один лист на 16 областей следующим образом (это не обязательно должно быть квадратное число):

         North

        A B C D
 West   E F G H   East
        I J K L
        M N O P

         South

Plist "A" будет содержать данные аннотации, скажем, для лат от 50 до 51 и от 100 до 110.
Plist "B" будет содержать данные аннотации для Lat 50 до 51 и Lon от 110 до 120.
Plist "E" будет содержать данные аннотации для лат 49 до 50 и от 100 до 110.
И т.д.

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

Структура индексного списка может выглядеть следующим образом:

PlistName  NWCoordinate  SECoordinate  Neighbors
A          51,100        50,110        B, E, F
F          50,110        49,120        A, B, C, E, G, I, J, K

Индексный список будет прочитан один раз в начале приложения.

Затем, как только приложение получит текущее местоположение (или когда оно достаточно существенно изменится), приложение сделает следующее:

  • Удалить существующие аннотации с карты.
  • Используйте индекс, чтобы выяснить, из каких списков нужно загрузить новые аннотации. Предположим, что текущее местоположение 49.25, 112.3. Используя индекс, приложение загружает F plist и его соседей в некоторый массив (не напрямую на карту по одному).
  • Добавьте аннотации в массиве за один снимок, используя addAnnotations.
...