GeoPointInterface
GeoPointInterface representa una coordenada geográfica con latitud, longitud y altitud opcional.
Interfaz e implementación
Section titled “Interfaz e implementación”Interfaz GeoPointInterface
Section titled “Interfaz GeoPointInterface”La interfaz GeoPointInterface tiene las siguientes propiedades. Se utiliza para pruebas unitarias y otros propósitos.
interface GeoPointInterface { val latitude: Double val longitude: Double val altitude: Double?}GeoPoint
Section titled “GeoPoint”La clase GeoPoint es una implementación de la interfaz GeoPointInterface.
data class GeoPoint( override val latitude: Double, override val longitude: Double, override val altitude: Double = 0.0) : GeoPointInterfaceMétodos de creación
Section titled “Métodos de creación”Métodos de fábrica
Section titled “Métodos de fábrica”La clase GeoPoint proporciona los siguientes métodos de fábrica. Los desarrolladores pueden elegir el método que les resulte más conveniente.
// Especificar valores en orden latitud, longitudGeoPoint.fromLatLong(37.7749, -122.4194)
// Especificar valores en orden longitud, latitudGeoPoint.fromLongLat(-122.4194, 37.7749)
// Crear desde un objeto con interfaz GeoPointInterfaceGeoPoint.from(existingGeoPoint)
// Crear pasando valores directamente al constructorGeoPoint(latitude = 37.7749, longitude = -122.4194, altitude = 100)Ejemplos de uso
Section titled “Ejemplos de uso”// Colocación básica de marcadorval sanFrancisco = GeoPoint.fromLatLong(37.7749, -122.4194)
// Reemplace MapViewContainer con GoogleMapView, MapboxMapView u otro SDK de mapa de su elecciónMapViewContainer(state = mapViewState) { Marker( position = sanFrancisco, icon = DefaultIcon(label = "SF") )}Sistema de coordenadas
Section titled “Sistema de coordenadas”Latitud
Section titled “Latitud”- Rango: -90.0 a 90.0 grados
- -90.0: Polo Sur
- 0.0: Ecuador
- 90.0: Polo Norte
Longitud
Section titled “Longitud”- Rango: -180.0 a 180.0 grados
- -180.0: Línea Internacional de Cambio de Fecha (lado oeste)
- 0.0: Meridiano de Greenwich
- 180.0: Línea Internacional de Cambio de Fecha (lado este)
Validación y normalización
Section titled “Validación y normalización”Validación
Section titled “Validación”La función de extensión isValid() verifica si las coordenadas de un GeoPointInterface están dentro de rangos válidos.
- Latitud: Dentro del rango -90.0 a 90.0
- Longitud: Dentro del rango -180.0 a 180.0
Devuelve true cuando se cumplen ambas condiciones.
// Ejemplo de usoval point = GeoPoint.fromLatLong(37.7749, -122.4194)if (point.isValid()) { // Usar el punto}Normalización
Section titled “Normalización”Hay dos métodos disponibles para mantener las coordenadas dentro de rangos válidos.
normalize()
Section titled “normalize()”La función de extensión normalize() ajusta las coordenadas a rangos válidos.
- Latitud: Limitada a -90.0 a 90.0
- Longitud: Normalizada a -180.0 a 180.0 (operación módulo)
- Altitud: Convertida a 0.0 si es null
fun GeoPointInterface.normalize(): GeoPoint
// Ejemplo de usoval invalidPoint = GeoPoint.fromLatLong(100, 200) // Coordenadas inválidasval validPoint = invalidPoint.normalize() // Ajustadas al rango válidowrap()
Section titled “wrap()”El método wrap() envuelve apropiadamente las coordenadas que cruzan los polos.
- Cuando la latitud excede 90 grados: Se envuelve desde -90 grados, invierte la longitud 180 grados
- Cuando la latitud cae por debajo de -90 grados: Se envuelve desde 90 grados, invierte la longitud 180 grados
- Longitud: Normalizada a -180.0 a 180.0
// Ejemplo: Coordenadas más allá de los polosval point = GeoPoint(95, 10) // La latitud excede 90 gradosval wrapped = point.wrap() // 緯度: -85.0, 経度: 190.0 → -170.0La diferencia entre normalize() y wrap() está en cómo manejan el cruce de polos. normalize() simplemente limita los valores, mientras que wrap() calcula las coordenadas reales como si se cruzaran los polos en un globo.
Comparación
Section titled “Comparación”equals()
Section titled “equals()”El método equals() de GeoPoint realiza comparaciones considerando errores de punto flotante.
- Tolerancia: 1e-7 (aproximadamente 0.00000001 grados, alrededor de 1.1cm)
- Objetivos de comparación: Latitud, longitud y altitud
val point1 = GeoPoint(37.7749, -122.4194, 100)val point2 = GeoPoint(37.77490001, -122.41940001, 100.00000001)val isEqual = point1 == point2 // true(dentro de la tolerancia)Esta tolerancia permite que las comparaciones ignoren pequeñas diferencias de la aritmética de punto flotante.
Métodos de utilidad
Section titled “Métodos de utilidad”toUrlValue()
Section titled “toUrlValue()”El método toUrlValue() convierte latitud y longitud en una cadena URL.
- Formato:
"latitud,longitud" - Precisión: Por defecto 6 dígitos (aproximadamente 11cm), personalizable
val point = GeoPoint(37.7749, -122.4194)val urlValue = point.toUrlValue() // "37.774900,-122.419400" - Precisión predeterminada (6 dígitos)val urlValue3 = point.toUrlValue(precision = 3) // "37.775,-122.419" - Precisión personalizada (3 dígitos)Puede usarse para parámetros de URL en servicios de mapas como Google Maps o Mapbox.