2012-12-04 3 views
27

Sto aggiornando un'app Android esistente per utilizzare la nuova API di Google Maps per Android v2. Ho circa 2500 segnalini che voglio aggiungere alla mappa. Con la versione precedente dell'API ho trovato la reattività delle mappe essere orrenda quando ci sono 2500 marker, quindi ho dovuto aggirare il problema aggiungendo solo marcatori che si trovano nella corrente regione visibile della mappa.Google Maps API Android v2 molto lento quando si aggiungono molti marker

Speravo che 2500 marcatori sarebbero stati più veloci con la nuova API, ma è ancora terribile, anche su un Nexus 4, e non vedo alcun tipo di opzione per fare il clustering.

Quindi la mia domanda: come posso determinare se un determinato punto lat/lng è contenuto all'interno della regione visibile della mappa?

Ho visto VisibleRegion nella documentazione, ma finora non ho avuto fortuna. Qualsiasi aiuto è molto apprezzato.

* Nota a margine: 2500 indicatori su un iOS MKMapView (google maps o mappe Apple) sono molto fluidi e reattivi anche con iPhone 3gs. Non riesco ancora a capire perché sia ​​così lento su Android, anche con l'hardware più recente e migliore.

risposta

50

Bene, dopo aver provato un paio di cose che ho capito come determinare se un dato punto è nella regione del visibile, ed è abbastanza semplice:

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

* Si noti che ottenere la proiezione della GoogleMap è un'operazione costosa, quindi se stai scorrendo una lunga lista di elementi per creare Marker e aggiungendoli alla mappa come sono io, prendi la proiezione una volta sola prima di eseguire il loop.

Aggiornamento

ho deciso di scrivere un post sul blog che spiega dettagliatamente come Mostra etichette che si trovano nella regione del visibile della mappa e nascondere marcatori come sono spostati fuori dallo schermo. Non è una soluzione perfetta, ma se mostri migliaia di Marker e sai che i tuoi utenti non hanno bisogno di vederli tutti contemporaneamente (a meno che non rimandino lo zoom), è un ottimo work-around.

Hiding and Showing on screen Markers with Google Maps Android API V2

+4

grazie per il vostro ottimo blogpost – subash

+0

Ci sarebbe comunque di invertire questo al fine di essere in grado di indicare se ci sono indicatori sulla mappa ma al di fuori della schermata/vista/limiti correnti? –

+1

integrato con più gestori cluster, funziona come un fascino. quando si confronta con tutti gli indicatori posizionati, questa soluzione farà sì che il cluster si ridisegna/ricalcola un po ', ma va perfettamente bene dato un enorme guadagno di prestazioni. grazie @DiscDev – DayDayHappy

13

Per una soluzione di clustering su Android si consiglia di provare Android Maps estensioni: https://github.com/mg6maciej/android-maps-extensions

+0

Questo sembra davvero bello, non vedo l'ora di provarlo. – DiscDev

+0

@ MaciejGórski questa è una bella biblioteca. Spero solo che abbia alcuni documenti di supporto per descriverlo. –

+1

@KhaledAlanezi Lo spero anch'io. Poiché questo è open source, chiunque può contribuire creando una documentazione (ad esempio wiki su GitHub). Per me la migliore documentazione è un'app demo. –