web-dev-qa-db-fra.com

Google Maps Android API v2 très lent lors de l'ajout de nombreux marqueurs

Je mets à jour une application Android Android pour utiliser la nouvelle API Google Maps Android API v2. J'ai environ 2500 marqueurs à ajouter à la carte. Avec dans l'ancienne version de l'API, la réactivité des cartes était horrible lorsqu'il y avait 2500 marqueurs, j'ai donc dû contourner cela en ajoutant uniquement des marqueurs qui se trouvent dans la région visible actuelle de la carte.

J'espérais que 2500 marqueurs seraient plus rapides avec la nouvelle API, mais c'est toujours horrible, même sur un Nexus 4, et je ne vois aucune option pour faire du clustering.

Donc ma question: comment puis-je déterminer si un certain point lat/lng est contenu dans la région visible de la carte?

J'ai regardé VisibleRegion dans la documentation, mais je n'ai pas eu de chance jusqu'à présent. Toute aide est grandement appréciée.

* Remarque: 2500 marqueurs sur un MKMapView iOS (Google Maps ou Apple maps) est très fluide et réactif même avec un iPhone 3gs. Je ne comprends toujours pas pourquoi c'est si lent sur Android, même avec le matériel le plus récent et le plus performant.

31
DiscDev

D'accord, après avoir essayé quelques autres choses, j'ai compris comment déterminer si un point donné est dans la région visible, et c'est assez simple:

//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(...));    
}

* Notez que l'obtention de la projection de GoogleMap est une opération coûteuse, donc si vous parcourez une longue liste d'éléments pour créer des marqueurs et les ajoutez à la carte comme je le suis, ne saisissez la projection qu'une seule fois avant de boucler.

Mise à jour

J'ai décidé de rédiger un article de blog détaillant comment afficher les marqueurs qui se trouvent dans la zone visible de la carte et masquer les marqueurs lorsqu'ils sont déplacés de l'écran. Ce n'est pas une solution parfaite, mais si vous affichez des milliers de marqueurs et savez que vos utilisateurs n'ont pas besoin de tous les voir en même temps (sauf s'ils font un zoom arrière), c'est une très bonne solution.

Masquage et affichage des marqueurs à l'écran avec Google Maps Android API V2

52
DiscDev

Pour une solution de clustering sur Android vous voudrez peut-être essayer Android Extensions de cartes: https://github.com/mg6maciej/Android-maps) -extensions

13
MaciejGórski