2011-01-17 19 views
6

Estoy trabajando en una aplicación para Android que ya existe en el iPhone.Problema con una gran cantidad de marcadores en el mapa

En la aplicación, hay una actividad de mapa que tiene (conté) alrededor de 800 marcadores en cuatro grupos marcados por dibujables en cuatro colores diferentes. Cada grupo puede activarse o desactivarse. Información sobre los marcadores que tengo dentro de List. Creo un mapOverlay para cada grupo, luego adjunto esa superposición al mapa. Creo firmemente que la parte de codificación que hice correctamente. Pero adjuntaré mi código de todos modos ...

El caso es que mi Nexus One no puede manejar el mapa con todos esos marcadores. Toma alrededor de 15 segundos simplemente dibujar 500 marcadores. Entonces, cuando todo se dibuja, el mapa no es muy sencillo. Es algo difícil de acercar y navegar. Se puede hacer, pero la experiencia es mala y me gustaría ver si se puede hacer algo allí. Sé que si evito la conversión String> Double, podría ahorrar algo de tiempo, pero dudo que eso sea significativo.

iPhone parece que no tiene problemas para mostrar todos estos marcadores. Se tarda unos 1-2 segundos en mostrarlos a todos y el zoom y la panorámica no es tan malo. La desaceleración es notable pero aún aceptable. Personalmente, creo que no sirve dibujar todos esos marcadores, pero la aplicación está diseñada por otra persona y no se supone que haga cambios drásticos.

No estoy seguro de qué hacer aquí. Parece que tendré que buscar diferentes funcionalidades, tal vez usar la ubicación GPS, si lo conozco, y dibujar solo marcadores dentro de algún radio, o, si la ubicación no se conoce, usar el centro de la pantalla (mapa) y dibujar marcadores alrededor de eso. Tendré que tener una explicación razonable para mis jefes en caso de que realice estos cambios.

Aprecio si alguien tiene alguna idas.

Y el código:

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

que no he leído su código para ser justos pero sí, he usado mi propio algoritmo de ruta de la simplificación. Tuve que trazar 1379 marcas de posición y lo reduje a 65. Si estás interesado, me complacerá explicarte el problema, pero como no hacemos la tarea en este sitio, no puedo darte "teh-codez" :) – Reno

+2

En algún lugar de este foro he leído que ItemizedOverlay está diseñado para docenas de artículos. Si hay más cambio a Overlay podría ser necesario. Puedo confirmar eso. Dos aplicaciones con más de 1000 ItemizedOverlays necesitaron un minuto o más para dibujar. Después de cambiar a Superposición, siempre está dentro de 2-4 segundos. –

+0

Reno, ¿puede explicar su algoritmo de optimización? Simplemente no hay uso del mapa con todos esos marcadores. Es muy lento y demasiado abarrotado. – bobetko

Respuesta

3

Bien. Resultó que llamé populate() cada vez que añadí un marcador. Saqué populate() del método addOverlay() y lo llamo después de que termine el bucle. Todos los marcadores ahora se muestran casi instantáneamente. El único problema ahora es que el mapa es muy poco receptivo cuando se usa un zoom más bajo (muestra muchos marcadores a la vez). No veo solución para esto a menos que descubra cómo disminuir el número de marcadores en el mapa cuando el mapa se aleja ... pensando en agruparlos de alguna manera ... actualmente trabajando en esto ...

+0

no era eso ya mencionado aquí: http://stackoverflow.com/questions/2848189/efficient-map-overlays-in-android-google-map ????????? ..... en lugar de despotricar, podrías haber probado lo que allí se menciona ... de todos modos ... – Ahsan

0

Estoy teniendo el mismo problema en la carga de varios marcadores en el mapa, pero he puesto un poco de retraso en la carga de marcador y visualización del mapa.primer mapa de visualización y después de un retraso se cargarán todos los marcadores. eso cargará más rápido hasta cierto punto.

2

Hay hay dos maneras en que puedes hacer esta simplificación de ruta.

1) Si tiene el encabezado de todos los puntos. Puede mantener una tolerancia de rumbo, por ejemplo, si la diferencia de rumbo entre point A and B es 0.5 Simplemente dibuje una línea de A a B e ignore los puntos intermedios.

2) Si no tiene un encabezado. Haz un triángulo como se muestra en la figura. Si h está entre sus límites, omita los puntos intermedios y trazar una línea desde A to B enter image description here

También puede utilizar algún otro route simplification algorithms.


Ver también:

Ruta simplificación - Douglas Puecker Algorithm

Cuestiones relacionadas