Dibujar sobre 4K polylines en android google maps

Estoy desarrollando ahora una aplicación para dispositivos Android. La principal funcionalidad es dibujar polilíneas en el mapa para mostrar cuál es el tráfico en la ciudad en cada calle. Desafortunadamente, cuando dibujo alrededor de 3K polilíneas – el número se reduce de acuerdo con el tamaño de la pantalla y el nivel de zoom – mi mapa se vuelve increíblemente lento … No mencionar el tiempo de dibujo de todas las líneas.

Tal vez usted sabe de manera más eficiente para marcar las calles o dibujar líneas en un mapa?

También estaba pensando en cambiar a OSM, pero nunca lo usé y no sé lo eficiente que es.

Puedo depurar la aplicación en Samsung Galaxy Note 10.1 y App utiliza Map API v2

Mi código para dibujar polilíneas:

Polyline line; List<Float> coordinatesStart; List<Float> coordinatesEnd; LatLng start; LatLng end; List<List<Float>> coordinates; int polylinesNumber = 0; for(Features ftr : features){ coordinates = ftr.geometry.coordinates; for(int i = 0; i<coordinates.size()-1; i++){ coordinatesStart = coordinates.get(i); coordinatesEnd = coordinates.get(i+1); start = new LatLng(coordinatesStart.get(1), coordinatesStart.get(0)); end = new LatLng(coordinatesEnd.get(1), coordinatesEnd.get(0)); line = map.addPolyline(new PolylineOptions() .add(start, end) .width(3) .color(0x7F0000FF)); //semi-transparent blue polylinesNumber++; } } 

¡Apreciaría cualquier ayuda!

4 Solutions collect form web for “Dibujar sobre 4K polylines en android google maps”

¿Comprueba si la polilínea que dibuja es visible incluso para el usuario en la pantalla? Si no, esa sería mi primera idea. Esta pregunta podría ser de ayuda para eso.

Quiero escuchar esto porque no he encontrado esta respuesta completa. Si aleja el zoom, seguirá teniendo un montón de polilíneas individuales en la pantalla y el hilo de la interfaz de usuario se interrumpirá. TileProvider este problema usando un TileProvider personalizado y una proyección de mercator esférico de mis puntos LatLng a píxeles de pantalla. La idea surgió de la utilidad map-utils-library , que tiene la mayoría de las herramientas necesarias para escribir un lienzo en un mosaico (y muchas otras delicadezas también).

He escrito un ejemplo de ComplexTileOverlays de un proyecto en el que estaba trabajando. Esto incluye formas de cambiar el grosor de alfa y de línea en CustomTileProvider .

En primer lugar cargar mi base de datos personalizada de polilíneas en la memoria con una pantalla de presentación (para este ejemplo, es una base de datos abierta de instalaciones de bicicletas en la isla de Montreal). Desde allí, dibujo cada proyección de línea sobre un lienzo de 256 x 256 píxeles que representa un mosaico. En general esta técnica es más rápida a pasos agigantados si tiene un montón de superposiciones gráficas para atar al mapa.

Gran optimización aquí:

Su error principal es que utiliza la new PolyLineOptions instancia de new PolyLineOptions para cada línea que dibuja en los mapas. Esto es hacer el dibujo terriblemente lento.

La solución sería:

Utilice sólo una instancia de opciones de polilínea y utilice sólo la función .add(LatLng) dentro de los bucles.

  //MAGIC #1 here //You make only ONE instance of polylineOptions. //Setting width and color, points for the segments added later inside the loops. PolylineOptions myPolylineOptionsInstance = new PolylineOptions() .width(3) .color(0x7F0000FF); for (Features ftr : features) { coordinates = ftr.geometry.coordinates; for (int i = 0; i < coordinates.size(); i++) { coordinatesStart = coordinates.get(i); start = new LatLng(coordinatesStart.get(1), coordinatesStart.get(0)); //MAGIC #2 here //Adding the actual point to the polyline instance. myPolylineOptionsInstance.add(start); polylinesNumber++; } } //MAGIC #3 here //Drawing, simply only once. line = map.addPolyline(myPolylineOptionsInstance); 

Atención:

Si desea tener diferentes colores para diferentes segmentos / secciones de línea, tendrá que utilizar múltiples opciones de polilínea, ya que la opción de polilínea sólo podría tener un color. Pero el método sería el mismo: Use como pocos polylineOptions como usted puede.

  • ¿Por qué WebView es mucho más rápido que un TextView?
  • ¿Cómo actualizar Android ListView con datos dinámicos en tiempo real?
  • Cómo detectar la velocidad de la CPU android?
  • C + + pura aplicación para Android y su rendimiento
  • Android HTTP Publicar en una URL sin parámetros
  • Despliegue de dibujo de pantalla de Android Canvas
  • Coracteres corrompidos o desaparecidos después de ejecutar Proguard
  • Cómo trabajar alrededor de la demora / lento WebView representación que se produce en algunos dispositivos?
  • Android - Declarativa vs interfaz de usuario programática
  • Android: Actualiza los datos de fragmento anteriores cuando se pulsa el botón de retroceso
  • Cómo determinar qué está ralentizando la aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.