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.
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.
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.
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"
let tokyo = GeoPoint(latitude: 35.6812, longitude: 139.7671) let haneda = GeoPoint.fromLatLong(latitude: 35.548852, longitude: 139.784086) let fromLngLat = GeoPoint.fromLongLat(longitude: 139.7671, latitude: 35.6812) // Desde cualquier valor que cumpla GeoPointProtocol let copied = GeoPoint.from(position: anyPositionLike) let url = tokyo.toUrlValue() // "35.681200,139.767100"
import { createGeoPoint, fromLatLng, fromLngLat, GeoPoint } from '@mapconductor/js-sdk-core';
const tokyo = createGeoPoint({ latitude: 35.6812, longitude: 139.7671 });
const haneda = fromLatLng({ latitude: 35.548852, longitude: 139.784086 });
const fromLngLatPoint = fromLngLat({ longitude: 139.7671, latitude: 35.6812 });
// Lo mismo se puede obtener desde el espacio de nombres
const same = GeoPoint.fromLatLong({ latitude: 35.6812, longitude: 139.7671 });
const url = tokyo.toUrlValue(6); // "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.
ajustar al rango
La latitud se recorta a −90~90, la longitud se ajusta a −180~180. La longitud 200 se convierte en −160.
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.
// Se ofrece como función de extensión de GeoPointInterface val safe = raw.normalize() if (!raw.isValid()) return
let safe = raw.normalize()
guard raw.isValid() else { return }const 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.
// 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)let bounds = GeoRectBounds()
routePoints.forEach { bounds.extend(point: $0) }
mapState.fitBounds(bounds: bounds, padding: 48)
let fetchArea = bounds.expandedByDegrees(latPad: 0.05, lonPad: 0.05)import { createGeoRectBounds } from '@mapconductor/js-sdk-core';
const bounds = createGeoRectBounds();
routePoints.forEach(p => bounds.extend(p));
mapViewState.fitBounds(bounds, 48);
const fetchArea = bounds.expandedByDegrees(0.05, 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.
Acerca la cámara para que quepa todo el rango. padding es el margen de pantalla (píxeles lógicos).
Al pegar una imagen en el mapa, se especifica el lugar como un rango.
Define el área donde la cámara no puede salir, como un rectángulo (Android · React).
El MapCameraPosition recibido en onCameraMove tiene el rango mostrado. Puede obtener solo los datos de ese rango.
Versión que se expande en metros. Consulte la página de cálculos geográficos.
Se usa intersects para decidir la generación y la recuperación de mosaicos.
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")
}