GeoPoint und Bereich (GeoRectBounds)
MapConductor verfügt über nur einen einzigen Koordinatentyp: GeoPoint. Sie müssen sich nicht mit den anbieterspezifischen LatLng-, CLLocationCoordinate2D- oder LngLat-Typen befassen. Der rechteckige Bereich wird von GeoRectBounds repräsentiert und durch zwei Punkte (Südwest und Nordost) ausgedrückt. Beide haben auf allen drei Plattformen dieselbe Mitgliederstruktur.
01 · GeoPoint
Ein unveränderlicher Wert mit drei Komponenten: Breitengrad, Längengrad und Höhe. Die Höhe kann weggelassen werden; in diesem Fall wird sie als 0 behandelt. Die Gleichheitsprüfung und der Hash werden anhand des Inhalts von Breitengrad und Längengrad (sowie Höhe) bestimmt, sodass der Wert direkt als Schlüssel in einer Map oder für Differenzprüfungen verwendet werden kann.
Es gibt drei Möglichkeiten zur Erstellung: den Konstruktor, eine Factory, die die Reihenfolge von Breitengrad und Längengrad explizit macht, sowie die Konvertierung aus anderen Koordinatentypen. Die Reihenfolge Längengrad,Breitengrad, bei der leicht Verwechslungen auftreten können, ist durch die Namen unterscheidbar gemacht.
val tokyo = GeoPoint(35.6812, 139.7671) val haneda = GeoPoint.fromLatLong(35.548852, 139.784086) val fromLngLat = GeoPoint.fromLongLat(139.7671, 35.6812) // Aus jedem Wert, der GeoPointInterface implementiert 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) // Aus jedem Wert, der GeoPointProtocol entspricht 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 });
// Dasselbe ist auch über den Namensraum erreichbar
const same = GeoPoint.fromLatLong({ latitude: 35.6812, longitude: 139.7671 });
const url = tokyo.toUrlValue(6); // "35.681200,139.767100"fromLatLng und fromLatLong sowie fromLngLat und fromLongLat sind Aliase für dasselbe. Sie können diejenige auswählen, die der Namensgebung Ihres bestehenden Codes entspricht.
02 · Normalisierung und Gültigkeit
Koordinaten aus externen Daten können außerhalb des gültigen Bereichs liegen oder Längengrade über 360 Grad haben. Es stehen normalize zum Einschränken auf den Bereich und isValid zum Überprüfen bereit, ob die Werte innerhalb des Bereichs liegen.
in den Bereich bringen
Die Breite wird auf −90 bis 90 beschnitten, die Länge auf −180 bis 180 gewickelt. Länge 200 wird zu −160.
überprüfen, ob innerhalb des Bereichs
true nur, wenn die Breite zwischen −90 und 90 liegt und die Länge zwischen −180 und 180. Wird zur Validierung beim Import verwendet.
// Wird als Erweiterungsfunktion von GeoPointInterface bereitgestellt 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
Stellt ein Rechteck durch zwei Punkte (Südwest und Nordost) dar. Die primäre Verwendung ist als „wachsende Box“, bei der das Hinzufügen von Punkten den umschließenden Bereich erweitert. Direkt nach der Erstellung ist er leer (isEmpty) und southWest sowie northEast sind nicht festgelegt.
// Die Grenzen bilden, die die gesamte Route umfassen, und die Kamera daran anpassen
val bounds = GeoRectBounds()
routePoints.forEach { bounds.extend(it) }
mapViewState.fitBounds(bounds = bounds, padding = 48)
// Etwas großzügiger als den sichtbaren Bereich laden
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 · Einsatzmöglichkeiten für Bereiche
GeoRectBounds taucht an vielen Stellen in der API auf. Da es immer derselbe Typ ist, können Sie einmal erstellte Bereiche wiederverwenden.
Verengt die Kamera, damit der gesamte Bereich passt. padding ist der Bildschirmrand (in logischen Pixeln).
Wenn Sie ein Bild auf der Karte platzieren, geben Sie den Ort als Bereich an.
Legt den Bereich, den die Kamera nicht verlassen darf, als Rechteck fest (Android · React).
Das in onCameraMove gelieferte MapCameraPosition enthält den angezeigten Bereich. Sie können nur Daten aus diesem Bereich abrufen.
Version, die in Metern erweitert. Siehe die Seite zu geografischen Berechnungen.
Für die Entscheidung über die Kachelgenerierung und das erneute Abrufen wird intersects verwendet.
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")
}