Принцип работы В ресурсах apk лежит zip-архив с данными по точкам. При установке приложения он распаковывается и данные переносятся в базу данных (используется быстрая вставка данных пакетами через откомпилированную sql команду)
Когда сделал загрузку, вспомнил про более оптимальный способ: в ресурсы кладется уже готовый файл базы данных sqlite в виде архива и просто распаковвывается куда надо Но не стал переделывать, так как такой вариант быстрее, но не показательней с точки зрения кода
Реализован алгоритм кластеризации на основе SQL запроса по точкам. Берется область карты, разбивается на сегменты 10 х 10 и каждый сегмент обсчитывается SQL запросом select count(*), avg(latitude), avg(longitude)
Все запросы по сегментам объединяются в один SQL запрос через UNION и выполняются за один раз select count(), avg(latitude), avg(longitude) union all select count(), avg(latitude), avg(longitude) union all …. В целом это позволяет достаточно быстро получать кластеры и по существенно большему объему точек
Для сравнения сделал еще поддержку стандартного clusterManager от гугла. А потом сделал симбиоз, на большом масштабе, когда точек слишком много используется моя кластеризация на основе SQL, а на более мелких масштабах кластеризация гугла. Хотел еще сделать свой алгоритм как рендерер, но увы, не успеваю. Итак уже очень много времени потратил на задачу.
Пока отлажи 4D00 вал, столкнулся с неприятным багом в google maps. Если очищать маркеры карты при работе через кластеры, то приложение может падать. Причем это похоже не решаемо, так как вызов map.clear() не учитывается в кластере гугла и он пытается прописывать иконки не существующим маркерам (удаленным) Можно решить, если сделать свою кластеризацию как стандартный рендерер и тогда проблема одновременного отображения маркеров и кластеров уйдет.
В корне проекта лежит собранная WifiMapTest.apk, но можно собрать и самому, только надо будет поменять ключик в манифесте