Dokumentation / Core / GeoPoint und Bereich

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.

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

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.

Mitglieder
Type
Beschreibung
latitude
Double
Breitengrad (Grad). −90 bis 90.
longitude
Double
Längengrad (Grad). −180 bis 180.
altitude
Double · 0.0
Höhe (Meter). Wird nur von 3D-Anbietern interpretiert.
wrap()
GeoPoint
Gibt eine Koordinate zurück, bei der der Längengrad über die Datumsgrenze hinweg gefaltet wurde.
toUrlValue(precision)
String · 6
Zeichenfolge "Breitengrad,Längengrad". Standardmäßig 6 Dezimalstellen.

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.

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)

// Aus jedem Wert, der GeoPointInterface implementiert
val copied = GeoPoint.from(anyPositionLike)

val url = tokyo.toUrlValue() // "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.

normalize()

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.

isValid()

ü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.

Kotlin · Erweiterungsfunktionen
// Wird als Erweiterungsfunktion von GeoPointInterface bereitgestellt
val 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.

Mitglieder
Beschreibung
southWest / northEast
Zwei Ecken des Rechtecks. Wenn leer, nicht festgelegt.
center
Mitte. Wird auch für Rechtecke berechnet, die die Datumsgrenze überschreiten.
isEmpty
Ob noch kein Punkt enthalten ist.
extend(point)
Erweitert das Rechteck so, dass es den Punkt einschließt. Die Erweiterung erfolgt in Richtung des kürzeren Weges beim Längengrad.
contains(point)
Ob der Punkt innerhalb des Rechtecks liegt.
intersects(other)
Ob sich zwei Rechtecke überlappen. Wird zur Bestimmung von Kacheln und Abrufbereichen verwendet.
union(other)
Ein neues Rechteck, das beide Rechtecke einschließt.
expandedByDegrees(lat, lon)
Ein neues Rechteck, das um einen angegebenen Betrag in Grad nach außen erweitert wurde. Wenn Sie in Metern erweitern möchten, verwenden Sie expandBounds von Spherical.
toSpan()
Gibt Breitengrad- und Längengraddifferenz in Form eines GeoPoint zurück.
toUrlValue(precision)
Zeichenfolge "Südwest,Nordost". Standardmäßig 6 Dezimalstellen.
GeoRectBounds · Kotlin
// 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)

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.

fitBounds()

Verengt die Kamera, damit der gesamte Bereich passt. padding ist der Bildschirmrand (in logischen Pixeln).

GroundImageState

Wenn Sie ein Bild auf der Karte platzieren, geben Sie den Ort als Bereich an.

CameraRestriction · restrictBounds

Legt den Bereich, den die Kamera nicht verlassen darf, als Rechteck fest (Android · React).

visibleRegion.bounds

Das in onCameraMove gelieferte MapCameraPosition enthält den angezeigten Bereich. Sie können nur Daten aus diesem Bereich abrufen.

expandBounds()

Version, die in Metern erweitert. Siehe die Seite zu geografischen Berechnungen.

GeoJSON / Kacheln

Für die Entscheidung über die Kachelgenerierung und das erneute Abrufen wird intersects verwendet.

Implementierung im 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")
}
Beispielvideo · Anpassung an einen Bereich mit fitBounds
Video noch nicht aufgenommenBestimmt den Bereich, der mehrere Marker enthält, und zeigt, wie die Kamera mit fitBounds heranzoomt. Der Fokus liegt auf dem Zwischenverlauf der Animation.

Verwandte Seiten