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;
}
}
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
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. –
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