Documentación / Core / GeoPoint y rango

GeoPoint y rango (GeoRectBounds)

MapConductor tiene un solo tipo de coordenadas: GeoPoint. No necesita tocar LatLng, CLLocationCoordinate2D ni LngLat específicos de cada proveedor. El rango rectangular lo maneja GeoRectBounds y se representa con dos puntos: suroeste y noreste. Ambos tienen la misma estructura de miembros en las 3 plataformas.

ANDROID
com.mapconductor.core.features
iOS
MapConductorCore
REACT
@mapconductor/js-sdk-core
Plataforma

01 · GeoPoint

Un valor inmutable con tres componentes: latitud, longitud y altitud. La altitud se puede omitir y, en ese caso, se trata como 0. La comparación de igualdad y el hash se determinan según el contenido de latitud y longitud (y altitud), por lo que se puede usar tal cual como clave de mapa o para comprobar diferencias.

Miembros
Type
Descripción
latitude
Double
Latitud (grados). −90 a 90.
longitude
Double
Longitud (grados). −180 a 180.
altitude
Double · 0.0
Altitud (metros). Solo los proveedores 3D lo interpretan.
wrap()
GeoPoint
Devuelve una coordenada con la longitud plegada a través de la línea de cambio de fecha.
toUrlValue(precision)
String · 6
Cadena "latitud,longitud". Por defecto, 6 decimales.

Hay tres formas de crearlo: el constructor, una fábrica que aclara el orden de latitud y longitud, y la conversión desde otros tipos de coordenadas. Para el orden longitud,latitud, donde es fácil equivocarse, se usan nombres que permiten distinguirlos.

GeoPoint · Kotlin
val tokyo = GeoPoint(35.6812, 139.7671)
val haneda = GeoPoint.fromLatLong(35.548852, 139.784086)
val fromLngLat = GeoPoint.fromLongLat(139.7671, 35.6812)

// Desde cualquier valor que implemente GeoPointInterface
val copied = GeoPoint.from(anyPositionLike)

val url = tokyo.toUrlValue() // "35.681200,139.767100"

fromLatLng y fromLatLong, así como fromLngLat y fromLongLat, son alias de lo mismo. Puede elegir la que se adapte a la nomenclatura de su código existente.

02 · Normalización y validez

Las coordenadas de datos externos pueden estar fuera de rango o tener longitudes mayores de 360 grados. Se proporcionan normalize para ajustar al rango e isValid para comprobar si están dentro.

normalize()

ajustar al rango

La latitud se recorta a −90~90, la longitud se ajusta a −180~180. La longitud 200 se convierte en −160.

isValid()

verificar si está dentro del rango

true solo cuando la latitud está entre −90 y 90 y la longitud entre −180 y 180. Se usa para validación al importar.

Kotlin · Funciones de extensión
// Se ofrece como función de extensión de GeoPointInterface
val safe = raw.normalize()
if (!raw.isValid()) return

03 · GeoRectBounds

Representa un rectángulo con dos puntos: suroeste y noreste. El uso básico es como "caja que crece": al ir añadiendo puntos, se expande el rango que los contiene a todos. Al crearlo, está vacío (isEmpty) y southWest y northEast no están establecidos.

Miembros
Descripción
southWest / northEast
Dos esquinas del rectángulo. Si está vacío, no están establecidos.
center
Centro. Se calcula correctamente incluso si el rectángulo cruza la línea de cambio de fecha.
isEmpty
Si todavía no contiene ningún punto.
extend(point)
Expande el rectángulo para incluir el punto. La longitud se expande hacia el lado más corto.
contains(point)
Si el punto está dentro del rectángulo.
intersects(other)
Si dos rectángulos se superponen. Se usa para determinar teselas y rangos de obtención.
union(other)
Un nuevo rectángulo que contiene ambos rectángulos.
expandedByDegrees(lat, lon)
Un nuevo rectángulo expandido hacia afuera la cantidad indicada en grados. Para expandir en metros, use expandBounds de Spherical.
toSpan()
Devuelve la diferencia de latitud y longitud en forma de GeoPoint.
toUrlValue(precision)
Cadena "suroeste,noreste". Por defecto, 6 decimales.
GeoRectBounds · Kotlin
// Crea los límites que abarcan toda la ruta y ajusta la cámara a ellos
val bounds = GeoRectBounds()
routePoints.forEach { bounds.extend(it) }

mapViewState.fitBounds(bounds = bounds, padding = 48)

// Obtén un poco más que el área visible
val fetchArea = bounds.expandedByDegrees(latPad = 0.05, lonPad = 0.05)

04 · Cuándo usar rangos

GeoRectBounds aparece en varias partes de la API. Como todos son del mismo tipo, puede reutilizar un rango creado una vez.

fitBounds()

Acerca la cámara para que quepa todo el rango. padding es el margen de pantalla (píxeles lógicos).

GroundImageState

Al pegar una imagen en el mapa, se especifica el lugar como un rango.

CameraRestriction · restrictBounds

Define el área donde la cámara no puede salir, como un rectángulo (Android · React).

visibleRegion.bounds

El MapCameraPosition recibido en onCameraMove tiene el rango mostrado. Puede obtener solo los datos de ese rango.

expandBounds()

Versión que se expande en metros. Consulte la página de cálculos geográficos.

GeoJSON / mosaicos

Se usa intersects para decidir la generación y la recuperación de mosaicos.

Implementación en video · Android + MapLibreKotlin · Jetpack Compose
val spots = listOf(
    GeoPoint.fromLatLong(35.6586, 139.7454), // Tokyo Tower
    GeoPoint.fromLatLong(35.7101, 139.8107), // Skytree
    GeoPoint.fromLatLong(35.6852, 139.7528), // Imperial Palace
)

// Start from an empty rectangle and widen it one point at a time
val bounds = GeoRectBounds()
spots.forEach { bounds.extend(it) }

MapLibreMapView(state = mapViewState) {
    spots.forEachIndexed { i, point ->
        Marker(MarkerState(id = "spot-$i", position = point))
    }
}

Button(onClick = {
    // padding is screen margin in logical pixels; at 0 the outermost point hugs the edge
    if (!bounds.isEmpty) mapViewState.fitBounds(bounds, padding = 64)
}) {
    Text("Show all")
}
Video de ejemplo · Ajustar al rango con fitBounds
Video aún no grabadoCalcula el rango que contiene varios marcadores y muestra cómo la cámara se acerca con fitBounds. Lo importante son los pasos intermedios de la animación.

Páginas relacionadas