Мне нужно отобразить на карте большое количество точек, с кластеризацией проблем нет, основной вопрос в том, при каком пользовательском действии подгружать новые данные? При первом запуске приложения я подгружаю скажем 10, дальше при каждом отдалении или приближении(изменении уровня на единицу) я подгружаю новые и добавляю их на карту, но мне не очень нравится такой вариант.
Вариантов много, выбор варианта зависит от кол-ва точек, масштаба, быстродействия устройства, степени оптимизации процесса подгрузки... Ваш вопрос сходен с тем, кого лучше брать в жены - блондинку или брюнетку.
Для начала скажите, чем именно вам не нравится тот вариант, который вы сейчас используете.
Не нравится тем что данные постоянно грузятся хотя пользователь вроде бы и не желал получить еще, а просто приблизил карту(перешел за порог уровня зума в 1) Не так важен масштаб, быстродействие, процесс подгрузки как момент его начала. Можно сделать кнопку "получить еще" но мне этот вариант тоже не по душе. Какие есть варианты?
> при каждом отдалении или приближении(изменении уровня на единицу) я подгружаю новые и добавляю их на карту,
Из этого я сделал вывод, что вы подгружаете их потому, что возникла необходимость - либо карта отдалилась настолько, что понадобилось показать точки, которые раньше были за пределами экрана, либо приблизилась настолько, что понадобилось показать точки, которых тоже не было видно, например, потому, что вы кластер "разбили" на составляющие его точки.
А если вы не анализируете изменения ситуации, а просто тупо перезагружаете точки по триггеру зума, то возникает вопрос - а зачем гонять туда-сюда то, что уже и так на карте есть?
Можно использовать такой вариант: вы считываете (из локальной базы?) новый массив точек в соответствии с критериями для данной области карты при данном (изменившемся) зуме, сравниваете его с тем, что уже есть на карте, другими словами "вычитаете" из нового массива старый - если после этой операции в новом массиве что-то осталось - то это действительно новые точки, которые надо показать. Добавляете их (именно добавляете к ранее показанным).
Не знаю, какой картографический движок вы используете, я использую обычно Google Maps SDK и локальную базу sqlite. Могу сказать, что операция считывания из базы четырехсот точек проходит за несколько миллисекунд, операция сравнения массивов - еще меньше, а операция нанесения на карту этого количества точек - в районе 5 секунд, т.е. разница по скорости в несколько порядков. Из чего следует вывод, что нужно постараться минимизировать именно операции нанесения/удаления точек с карты, а вот читать из из базы можно, в принципе, сколько угодно - на скорость и отзывчивость интерфейса это не влияет, к тому же это делается в фоновой ветке, тогда как все операции с картой обязаны выполняться в главной ветке.
mkll: Верно то что я по триггеру зума показываю новые точки что за пределами карты(но уже загружены), которые раньше были не видны и так же при приближении я разбиваю кластер на одиночные точки. Я подгружаю новые с сервера только для того чтобы показать новые, а не потому что в этой области их нет, запрос идет на основании координат пользователя и оффсетом количества точек что уже получены, т.о точки в этой области могут появится, а могут и нет, т.к сервер вернул часть точек что за пределами видимой границы карты. Я использую mapkit и restkit+sqlite, в принципе без труда могу на гугл или яндекс перейти, просто смысла в этом особого не вижу. Никаких подтормаживаний нет, с фоновыми операциями тоже все прекрасно.