Android google map polilínea simple o múltiple

3 minutos de lectura

Tengo una pregunta de mejores prácticas sobre cómo administrar la adición de una ruta de polilínea a un GoogleMap en Android, que crece a medida que el usuario se mueve.

versión TLDR: ¿Es mejor seguir reemplazando la polilínea por una nueva que son todos los puntos anteriores más la nueva, o seguir agregando una tonelada de polilíneas de 2 puntos?

En iteraciones anteriores, creé una nueva polilínea de 2 puntos para cada nueva ubicación, donde el inicio está al final de la línea anterior y el final en la ubicación actual.

Me di cuenta de que podría estar creando MUCHOS recursos para que el mapa tuviera que realizar un seguimiento en lugar de solo uno. Debido a esto, he investigado cómo hacer una sola línea y simplemente agregarle puntos (eso no parece funcionar), y no hay ninguna documentación que pueda encontrar que diga cómo podría lograr esto.

Actualmente he aterrizado en esta solución:

private lateinit var polyLine: Polyline
fun updateLocation(location: Location?) {
    location?.let {
        val latLng = LatLng(location!!.latitude, location!!.longitude)
        if (firstLoc) {
            polyLine = googleMap.addPolyline(PolylineOptions().add(latLng))
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16F))
            firstLoc = false;
        } else {
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16F))
            val newLine = googleMap.addPolyline(PolylineOptions().addAll(polyLine.points).add(latLng).width(10f))
            polyLine.remove()
            polyLine = newLine
        }
    }
}

Lo que permite que el mapa solo tenga que lidiar con una línea a la vez. Mi pregunta principal es si esto es peor o no, debido a tener que recrear todos los puntos en la nueva línea cada vez. Ejecutándose en mi emulador y mi dispositivo real, parece estar bien. No hay parpadeo (lo que tiene sentido, está agregando la nueva línea antes de eliminar la anterior), y no parece haber ningún retraso.

Mi plan actual es continuar como está, porque es simple y parece funcionar. Pero me gustaría asegurarme de no causar más trabajo del que necesito. Parece que hay un poco de trabajo que debe realizarse en cualquier caso, pero me pareció que esta era la mejor ruta.

  • Le falta una tercera opción, que prefiero: como ya mantiene una referencia a Polyline, ¿por qué no simplemente reemplaza las coordenadas LatLng (mantenidas en una Lista creciente separada) usando Polyline.setPoints()?

    – usuario2808624

    3 de abril de 2020 a las 6:38

  • Oh, interesante, vi ese método, pero no lo probé porque addPoint no me funcionó en absoluto. Probaré setPoints y veré si eso funciona. Para que quede claro, ¿estaría llamando a setPoints en cada actualización de ubicación, pasando toda la lista en crecimiento? Parece que esta solución también solucionará el problema que acabo de encontrar, donde mi solución actual no actualiza la línea poli cuando mi pantalla está apagada, a pesar del servicio de primer plano.

    – Nieminen

    4 de abril de 2020 a las 13:21


  • Sí, estoy llamando setPoints con la lista completa, cada vez que (que es una vez por segundo en mi caso) la lista recibe un punto adicional. Por cierto: estoy ocultando la diferencia entre la creación por primera vez de Polyline y las actualizaciones posteriores en una clase separada, a la que denominé PolylineHolder. Esta clase se preocupa por crear la polilínea y mantener una referencia, cuando recibe el primer punto, y llama al método setPoints de la referencia para actualizaciones posteriores. Entonces, el cliente no necesita distinguir entre la primera actualización y las subsiguientes.

    – usuario2808624

    4 abr 2020 a las 20:53


  • ¡Eso es increíble, gracias! He actualizado para usar puntos de ajuste, pero aún no he salido a probarlo. Sin embargo, parece funcionar bien en mi emulador. Si no le importaría hacer su sugerencia una respuesta, y la aceptaré. Realmente me parece la mejor opción.

    – Nieminen

    5 abr 2020 a las 15:40

¿Ha sido útil esta solución?