Google Maps Android API v2 очень медленный, добавляя много маркеров
Я обновляю существующее приложение для Android, чтобы использовать новый API Android Google Maps v2. У меня около 2500 маркеров, которые я хочу добавить на карту. С более старой версией API я обнаружил, что отзывчивость карт является ужасающей, когда есть 2500 маркеров, поэтому мне пришлось ее обойти, добавив только маркеры, которые находятся в текущей видимой области карты.
Я надеялся, что 2500 новых маркеров будут быстрее с новым API, но он все еще ужасен даже на Nexus 4, и я не вижу возможности для кластеризации.
Итак, мой вопрос: как я могу определить, содержится ли определенная точка lat/lng в видимой области карты?
Я просмотрел VisibleRegion в документации, но до сих пор мне не повезло. Любая помощь приветствуется.
* Боковое примечание: 2500 маркеров на iOS MKMapView (карты Google или карты Apple) очень плавные и отзывчивые даже с iPhone 3gs. Я до сих пор не могу понять, почему это так медленно на Android, даже с самым последним и самым большим оборудованием.
Ответы
Ответ 1
Хорошо, попробовав еще пару вещей, я выяснил, как определить, находится ли данная точка в видимой области, и это довольно просто:
//Note: this.mMap is an instance of GoogleMap
LatLngBounds bounds = this.mMap.getProjection().getVisibleRegion().latLngBounds;
LatLng markerPoint = new LatLng(item.getLatitude(), item.getLongitude());
if(bounds.contains(markerPoint))
{
this.mMap.addMarker(new MarkerOptions(...));
}
* Обратите внимание, что получение проекции GoogleMap является дорогостоящей операцией, поэтому, если вы зацикливаете длинный список элементов для создания маркеров и добавляете их на карту, как я, только захватите проекцию один раз, прежде чем цикл.
Обновление
Я решил написать сообщение в блоге с подробным описанием того, как показывать маркеры, которые находятся в видимой области карты, и скрыть маркеры, поскольку они перемещены с экрана. Это не идеальное решение, но если вы показываете тысячи маркеров и знаете, что вашим пользователям не нужно видеть их всех одновременно (если они не увеличивают масштаб), это довольно хорошая работа.
Скрытие и отображение на экране Маркеры с API Google Android V2
Ответ 2
Для решения кластеризации на Android вы можете попробовать использовать расширения Android Maps:
https://github.com/mg6maciej/android-maps-extensions