2011-01-17 10 views
6

Sto lavorando a un'app Android già esistente su iPhone.Problema con un numero elevato di indicatori sulla mappa

Nell'app, c'è un'attività mappa che ha (ho contato) circa 800 marker in quattro gruppi contrassegnati da drawable in quattro colori diversi. Ogni gruppo può essere attivato o disattivato. Informazioni sui marker che ho all'interno di List. Creo una mappaOverlay per ogni gruppo, quindi allego questa sovrapposizione alla mappa. Credo fermamente che la parte di codice che ho fatto correttamente. Ma aggiungerò comunque il mio codice ...

Il fatto è che il mio Nexus One non può gestire la mappa con tutti quei marker. Ci vogliono circa 15 secondi per disegnare 500 segnalini. Poi quando tutto è disegnato, la mappa non è abbastanza liscia. È un po 'difficile da ingrandire e navigare. Può essere fatto, ma l'esperienza è negativa e vorrei vedere se qualcosa può essere fatto lì. So che se evito String> Conversione doppia, potrei risparmiare un po 'di tempo, ma dubito che sarebbe significativo.

iPhone sembra non abbia problemi a mostrare tutti questi indicatori. Ci vogliono circa 1-2 secondi per mostrarli tutti e lo zoom e il panning non sono poi così male. Il rallentamento è evidente ma comunque accettabile. Personalmente ritengo che non valga la pena di disegnare tutti quei marker, ma l'app è progettata da qualcun altro e non dovrei apportare cambiamenti drastici.

Non sono sicuro di cosa fare qui. Sembra che dovrò trovare diverse funzionalità, magari usare la posizione GPS, se noto, e disegnare solo marcatori entro un raggio, o, se la posizione non è nota, usare il centro dello schermo (mappa) e disegnare i marker attorno a questo. Dovrò avere una spiegazione ragionevole per i miei capi nel caso io faccia questi cambiamenti.

Apprezzo se qualcuno ha qualche ida.

E il codice:

List<Overlay> mapOverlays = mapView.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(R.drawable.pin_blue); 
    drawable = this.getResources().getDrawable(R.drawable.pin_blue); 
    ArrList = appState.GetSleepArrList(); 
    ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, this); 
    ... 
    ... 
     for (int m = 0; m < ArrList.size(); m++) { 
      tName = ArrList.get(m).get("name").toString(); 
      tId = ArrList.get(m).get("id").toString(); 
      tLat = ArrList.get(m).get("lat").toString();; 
      tLng = ArrList.get(m).get("lng").toString();; 
      try { 
       lat = Double.parseDouble(tLat); 
       lng = Double.parseDouble(tLng); 
       p1 = new GeoPoint(
         (int) (lat * 1E6), 
         (int) (lng * 1E6)); 
       OverlayItem overlayitem = new OverlayItem(p1, tName, tId); 
       itemizedoverlay.addOverlay(overlayitem); 
      } catch (NumberFormatException e) { 
       Log.d(TAG, "NumberFormatException" + e);  
      } 
     } 
     mapOverlays.add(itemizedoverlay); 
     mapView.postInvalidate(); 

................................

public class ItemizedOverlay extends ItemizedOverlay<OverlayItem> 
{ 
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    private Context mContext; 
    public HelloItemizedOverlay(Drawable defaultMarker, Context context) 
    { 
     super(boundCenterBottom(defaultMarker)); 
     mContext = context; 
    } 

    public void addOverlay(OverlayItem overlay) 
    { 
     mOverlays.add(overlay); 
     populate(); 
    } 
    @Override 
    protected OverlayItem createItem(int i) 
    { 
     return mOverlays.get(i); 
    } 
    @Override 
    public int size() 
    { 
     return mOverlays.size(); 
    } 
    @Override 
    protected boolean onTap(int index) 
    { 
     final OverlayItem item = mOverlays.get(index); 
        ... EACH MARKER WILL HAVE ONCLICK EVENT THAT WILL PRODUCE CLICABLE 
        ... BALOON WITH MARKER'S NAME.   
     return true; 
    }  
}  
+0

Io ho mai letto il codice per essere equi, ma sì, ho usato il mio algoritmo percorso di semplificazione. Ho dovuto tracciare circa 1379 segnaposto e l'ho ridotto a 65. Se sei interessato sarò felice di spiegare l'algo ma dato che non facciamo i compiti su questo sito non posso darti "teh-codez" :) – Reno

+2

Da qualche parte in questo forum ho letto che ItemizedOverlay è progettato per decine di elementi. Se ci sono più possibilità di passare a Sovrapposizione, potrebbe essere necessario. Posso confermarlo. Due app con oltre 1000 ItemizedOverlays avevano bisogno di un minuto circa per disegnare. Dopo il passaggio a Sovrapposizione è sempre entro 2-4 secondi. –

+0

Reno, puoi spiegare il tuo algoritmo di ottimizzazione? Non c'è proprio nessun uso della mappa con tutti quei segnalini. È troppo lento e troppo ingombrante. – bobetko

risposta

3

Bene. È risultato che richiamo populate() ogni volta dopo aver aggiunto un marcatore. Ho preso populate() dal metodo addOverlay() e lo chiamo dopo il ciclo. Tutti i marcatori ora mostrano quasi istantaneamente. L'unico problema ora è che la mappa non risponde molto quando si usa lo zoom inferiore (mostrando molti indicatori contemporaneamente). Non vedo una soluzione per questo a meno che non capisca come diminuire il numero di marcatori sulla mappa quando la mappa viene rimpicciolita ... pensando di raggrupparli in qualche modo .... attualmente lavorando su questo ...

+0

non era quello già menzionato qui: http://stackoverflow.com/questions/2848189/efficient-map-overlays-in-android-google-map ????????? ..... invece di sbraitare avresti potuto provare ciò che è stato menzionato lì ... comunque ... – Ahsan

0

Sto riscontrando lo stesso problema nel caricamento di più marker sulla mappa, ma ho messo un po 'di ritardo nel caricamento del marker e nella visualizzazione della mappa. Prima mappa di visualizzazione e dopo un po' di ritardo verrà caricato tutto il marker. che verrà caricato più velocemente in una certa misura.

2

Là sono due modi in cui puoi eseguire questa semplificazione del percorso.

1) Se si ottiene il titolo di tutti i punti. È possibile mantenere una tolleranza di intestazione, ad esempio se la differenza di intestazione tra point A and B è 0.5 Basta disegnare una linea da A a B e ignorare i punti tra.

2) Se non si dispone di un titolo. Fai un triangolo come mostrato in fig. Se h si trova tra i propri limiti, saltare i punti in mezzo e tracciare una linea da A to B enter image description here

È inoltre possibile utilizzare qualche altro route simplification algorithms.


Vedi anche:

percorso di semplificazione - Douglas Puecker Algorithm