Modelos de localización personalizados con Clean Architecture en Kotlin

Clase 9 de 33Curso de Android: Integración de APIs nativas

Resumen

El desarrollo de aplicaciones móviles modernas frecuentemente implica manipular datos de localización. Entender cómo implementar modelos propios, siguiendo los principios de Clean Architecture, permite mantener la lógica independiente y más fácil de mantener o expandir. Aquí aprenderás cómo estructurar modelos personalizados partiendo de los estándares de Google y agregando funcionalidades propias útiles como cálculos de distancia y tiempos en Kotlin.

¿Qué elementos básicos requiere un modelo de localización?

Una estructura clara empieza con lo más sencillo que necesitamos para representar una ubicación física:

  • Latitud.
  • Longitud.

Estas propiedades básicas se definen utilizando tipos de dato Double en Kotlin:

data class Location(
    val lat: Double,
    val long: Double
)

¿Cómo realizar cálculos de distancia entre puntos?

Para un uso más práctico y preciso, el modelo necesita implementar métodos para cálculos como la distancia recorrida entre dos puntos. Incorporar esto requiere considerar ciertos aspectos:

  • Utilizar funciones trigonométricas (seno, coseno, raíz cuadrada).
  • Incluir la medición del diámetro terrestre (aproximadamente 6.371.000 metros).
  • Asegurar precisión al considerar la curvatura terrestre.

La función que se agrega puede parecer compleja inicialmente, pero en resumen funciona tomando:

  • Coordenadas iniciales y finales.
  • Realizando operaciones matemáticas que incluyen trigonometría y parámetros terrestres.

¿Qué es un modelo Location With Timestamp?

Integrar tiempos específicos añade valor al monitoreo de posiciones. Entonces, se define una estructura que incluye:

  • Ubicación física.
  • Timestamp o la hora específica en que se registra dicha ubicación.
  • Posibilidad de incluir referencias multimedia (fotos).

Implementado en código como:

data class LocationWithTimestamp(
    val location: Location,
    val timestamp: Long,
    val photos: List<Photo> // se desarrollan próximamente
)

¿Cómo se estructura y utiliza el modelo Location Data?

Este modelo actúa como contenedor principal de información relevante:

  • Recorrido total reportado en metros.
  • Almacenamiento de distintos segmentos de ubicaciones, generadas al realizar pausas (por ejemplo, para tomar fotos).

Implementado en Kotlin con listas anidadas:

data class LocationData(
    val distanceMeters: Int,
    val locations: List<List<LocationWithTimestamp>>
)

Se genera una lista anidada ya que cada pausa en la aplicación crea un nuevo segmento en el recorrido.

¿Qué papel cumple la clase Location Calculations?

Su propósito es fundamental para realizar diversos cálculos compilados, como la distancia total recorrida. Utiliza métodos integrados de Kotlin para simplificar procesos:

  • Recorre las listas usando operadores como sumOf y zipWithNext.
  • Realiza cálculos sucesivos para obtener una suma final.

Ejemplo práctico del uso de Location Calculations:

class LocationCalculations {

    fun getTotalDistanceMeters(locations: List<List<LocationWithTimestamp>>): Int {
        return locations.sumOf { 
            it.zipWithNext { location1, location2 ->
                location1.location.distance(location2.location)
            }.sum()
        }.roundToInt()
    }
}

Las estructuras y métodos vistos aquí te permitirán obtener mayor control y claridad al trabajar con datos de localización, preparando el camino para su futura integración con servicios de Google Play. Anímate a aplicar estos conceptos en tu propio proyecto y comparte cualquier duda que tengas sobre estos procesos de implementación.