2014-09-25 9 views
5

Non ho trovato alcuna spiegazione completa su come utilizzare questa tecnica su Android, quindi ho deciso di creare un thread Q &.Come utilizzare Viewport Marker Management su Android

Se la tua app deve mostrare una grande quantità di marker su una mappa di google e il clustering non è sufficiente per impedire all'app di funzionare troppo lentamente, una delle tue scelte migliori è usare questa tecnica di gestione degli indicatori di Viewport. Potete leggere la spiegazione teorica qui: https://developers.google.com/maps/articles/toomanymarkers

ho scritto una breve guida qui di seguito ...

risposta

5

1 ° --- Nell'attività in cui viene creata la mappa è necessario impostare l'OnCameraChangeListener e ottenere i limiti della vostra schermata come questa:

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { 

     @Override 
     public void onCameraChange(CameraPosition arg0) { 

     LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds; 

     } 

2 ° --- Questo passaggio può variare in base alla modalità di recupero dei dati dei marker. In sostanza, ciò che devi fare è calcolare se lat e long di ognuno dei tuoi marcatori sono all'interno dei limiti dello schermo. Ti mostrerò come farlo recuperando i dati da una base dati SQLite memorizzando latitudine e longitudine in due diversi clomuni DOUBLE all'interno della tabella dei marcatori.

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { 

     @Override 
     public void onCameraChange(CameraPosition arg0) { 

     LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 

     LatLng northeast = bounds.northeast; 
     String boundLat = String.valueOf(northeast.latitude); 
     String boundLong = String.valueOf(northeast.longitude); 

     LatLng southwest = bounds.southwest; 

     String boundLat2 = String.valueOf(southwest.latitude); 
     String boundLong2 = String.valueOf(southwest.longitude); 

     //Remove all markers from map 

     mMap.clear(); // or if your a using cluster manager: 
     //mClusterManager.clearItems(); 

     String[] fields = new String[] { "name", "latitude", "longitude" }; 
     String[] args = new String[] {boundLat, boundLong, boundLat2, boundLong2,}; 

     Cursor markers = dataBase.query("markers", fields, "latitude<=? AND longitude<=? AND latitude>=? AND longitude>=?"); 

     if (markers.moveToFirst()) { 
       do { 
        mMap.addMarker(new MarkerOptions() 
        .position(new LatLng(marker.getDouble(1), marker.getDouble(2))) 
        .title(marker.getString(0))); 

        // or if you are using cluster manager create and add the items as you normaly do. 

        } while (c.moveToNext()); 

        //if using cluster manager add : 
        //mClusterManager.cluster(); 
        } 
    } 
}); 

L'idea è abbastanza semplice, basta avere in mente che i vostri marcatori lat e Longi devono essere più piccoli rispetto alla posizione a nord est di schermo e più grande di quanto l'angolo sud-ovest, o semplicemente utilizzare la funzione LatLngBounds.contains.

Modificato:

Per evitare InfoWindow sempre chiuso quando si fa clic su un marcatore che non è già al centro dello schermo, è possibile modificare il marcatore click action listener predefinita, eliminando il movimento della fotocamera.

map.setOnMarkerClickListener(new OnMarkerClickListener() { 

     @Override 
     public boolean onMarkerClick(Marker arg0) { 
      arg0.showInfoWindow(); 

      return true; //must be true, if not, it will execute the default code after yours 
     } 

    }); 
+0

Funziona come un fascino. Ma cosa può fare per mostrare il titolo del marcatore? Quando premo il marker, setOnCameraChangeListener() viene chiamato e chiude di nuovo il titolo. Come risolvi questo problema? Grazie! – jcasadellaoller

+0

Ho modificato la risposta. – MauriF

+2

Grazie mauriF. L'ho risolto, ma in un modo diverso. Ho messo un valore booleano su true su markerClickListener e false if is true su onCameraChange. Infine aggiorna solo la posizione della telecamera se il valore booleano è falso. Lo stesso risultato. Grazie ancora per il tuo tempo! – jcasadellaoller

Problemi correlati