Dokumentation / Core / Berechnungen auf der Erdkugel

Berechnungen auf der Erdkugel (Spherical)

Wir bieten geografische Berechnungen wie Entfernung, Azimut, Fläche und Interpolation auf drei Plattformen mit denselben Namen und denselben Ergebnissen. Da wir uns nicht auf plattformspezifische Hilfsfunktionen der Karten-SDKs verlassen, ändern sich die Werte nicht, wenn der Anbieter gewechselt wird. Auch die Tap-Erkennung im SDK und die Darstellung von Großkreispfaden verwenden diese Berechnungen.

ELLIPSOID
WGS84
SEMI-MAJOR
6,378,137 m
FLATTENING
1 / 298.257…
UNIT
Meter / Grad
Plattform

01 · Grundlegende Berechnungen

Häufig verwendete Funktionen sind in Spherical zusammengefasst. Entfernungen werden in Metern, Peilungen in Grad, wobei Nord als 0 gilt, und Flächen in Quadratmetern zurückgegeben. Die Argumente sind die Koordinaten selbst und hängen nicht von Projektion oder Zoom ab.

Funktion
Beschreibung
computeDistanceBetween
Entfernung zwischen zwei Punkten (Meter).
computeHeading
Azimut vom Start- zum Endpunkt (-180 bis 180 Grad).
computeOffset
Koordinate, die sich durch Angabe von Entfernung und Azimut vom Startpunkt ergibt. Wird zur Erzeugung von Kreisen und Ringen verwendet.
computeOffsetOrigin
Berechnet den Startpunkt rückwärts aus Endpunkt, Entfernung und Azimut.
computeLength
Gesamtlänge entlang einer Koordinatenfolge (Meter). Für die Entfernungsanzeige von Routen.
computeArea / computeSignedArea
Fläche, die von einer geschlossenen Koordinatenfolge umschlossen wird (Quadratmeter). Vorzeichenbehaftete Werte können zur Bestimmung der Drehrichtung verwendet werden.
interpolate
Führt eine Verhältnisinterpolation zwischen zwei Punkten auf einem Großkreispfad durch.
Planar.interpolate
Führt eine Verhältnisinterpolation zwischen zwei Punkten durch eine gerade Linie in Breite/Länge durch (Methode des Planar-Modells). Auch bei Überquerung der Datumsgrenze wird die kürzeste Seite gewählt.
com.mapconductor.core.spherical
val meters = Spherical.computeDistanceBetween(from, to)
val heading = Spherical.computeHeading(from, to)

// Die Rand-Marker des Kreises in acht Richtungen setzen
val ring = (0 until 8).map { i ->
    Spherical.computeOffset(center, 3_000.0, i * 45.0)
}

val routeMeters = Spherical.computeLength(routePoints)
val areaSqMeters = Spherical.computeArea(polygonPoints)

02 · Kugelmodell und Ellipsoidmodell

Für geografische Berechnungen stehen zwei Genauigkeitsstufen zur Verfügung: das Kugelmodell, das die Erde als perfekte Kugel behandelt, und das geodätische Modell, das die Erde als WGS84-Ellipsoid behandelt. Je nach Anwendungsfall wird das passende Modell gewählt.

Die Konstanten basieren in beiden Fällen auf WGS84 (Äquatorradius 6.378.137 m, Abplattung 1/298.257223563). Da alle drei Plattformen dieselben Konstanten und Formeln verwenden, geben gleiche Eingaben dieselben Werte zurück.

Spherical

Kugelmodell (schnell genug, genau genug)

Anwendung: Entfernungsanzeige · Azimut · Ringgenerierung · Fläche · Tap-Erkennung

Entfernung per Haversine, Azimut und Interpolation per sphärischer Trigonometrie. Bis zu einigen hundert Kilometern sind Fehler praktisch vernachlässigbar; der Vorteil ist der geringe Rechenaufwand.

WGS84Geodesic

Ellipsoidmodell (Geodätische Linie)

Anwendung: Langstrecken-Flugrouten · präzise Entfernung, Azimut, Fläche

Berechnet die geodätische Linie auf dem WGS84-Ellipsoid (iterative Lösung vom Vincenty-Typ). Da die Methodenstruktur wie bei Spherical ist, können Sie bei Kugeln Spherical und bei WGS84 WGS84Geodesic verwenden, ohne den Aufruf zu ändern. Die Fläche wird nach Authalic (Ellipsoid) berechnet.

FALLBACK

Fällt bei Nichtkonvergenz auf Kugel zurück

Die iterative Lösung des Ellipsoids konvergiert nicht immer, z. B. bei fast antipodalen Punkten. In diesem Fall wird automatisch auf das Ergebnis des Kugelmodells umgeschaltet, sodass niemals 0 oder NaN zurückgegeben wird. Aufrufer müssen keine Ausnahmebehandlung schreiben.

03 · Brücke zur Anzeige

Funktionen, die bildschirmbasierte Größen wie „einen Fingerbreit“ oder „16px Rand“ auf der Karte in geografische Entfernungen umrechnen. Da die Umrechnung Zoom und Breitengrad berücksichtigt, bleibt die Wahrnehmung gleich, auch wenn Vergrößerung oder Ort sich ändern.

calculateMetersPerPixel
Meter pro Pixel bei einem angegebenen Zoom und Breitengrad.
expandBounds
Erweitert einen rechteckigen Bereich um eine bestimmte Anzahl Meter nach außen. Nützlich, um Daten etwas weiter als den sichtbaren Bereich zu laden.

Abbildung · Ablauf, der für die Tap-Erkennung verwendet wird

01

Wandelt den eingestellten „Fingergröße“ (logische Einheiten) in Bildschirmpixel um.

02

Mit calculateMetersPerPixel wird die Toleranzdistanz (Meter) beim aktuellen Zoom und beim aktuellen Breitengrad umgerechnet.

03

Mit dieser Toleranzdistanz wird geprüft, ob ein Punkt Linien oder Formen berührt – direkt in geografischen Koordinaten.

Dank dieses Ablaufs ändert sich die Leichtgängigkeit von Linien beim Zoomen nicht, und die Erkennung ist bei allen Anbietern gleich.

04 · Berechnungen für Linien und Formen

Funktionen, um das Zeichnen und die Erkennung von Polylines und Polygonen auf allen Anbietern mit denselben Ergebnissen zu gewährleisten. Dieselben Funktionen, die im SDK intern verwendet werden, sind öffentlich verfügbar.

Funktion
Beschreibung
WGS84Geodesic.createInterpolatePoints
Interpoliert Koordinaten abschnittsweise entlang der Geodäte. Erstellt eine Koordinatenliste für Engines, die Kurven nicht direkt zeichnen können.
Planar.createInterpolatePoints
Interpoliert Koordinaten entlang einer geraden Linie von Breiten- und Längengrad. Der Name ist gleich, nur der Namensraum unterscheidet sich.
WGS84Geodesic.pointOnLineOrNull
Gibt für ein Liniensegment auf der Geodäte den nächsten Punkt innerhalb der angegebenen Entfernung zurück. Wird zur Tap-Erkennung für Kurven verwendet.
Planar.pointOnLineOrNull
Prüft, ob ein Punkt für ein Liniensegment einer geraden Linie innerhalb der angegebenen Entfernung liegt.
splitByMeridian
Teilt eine Koordinatenliste, die den 180. Längengrad überschreitet, an der Grenze. Dies ist eine Top-Level-Funktion, die keinem Namensraum angehört.
closestPointOnSegment
Ermittelt den nächsten Punkt auf einem Liniensegment. Dies ist ebenfalls eine Top-Level-Funktion.

createInterpolatePoints und pointOnLineOrNull sind sowohl in WGS84Geodesic als auch in Planar unter demselben Namen vorhanden. Der Aufrufer kann zwischen dem Geodäten-Modell und dem Geraden-Modell wechseln, indem er einfach den Namensraum austauscht.

CONSISTENCY

Gleiche Eingabe, gleiches Ergebnis

Die Implementierungen für Kotlin, Swift und TypeScript verwenden dieselben Formeln und dieselben Konstanten. Abweichungen bei angezeigten Entfernungen oder Flächen zwischen Plattformen treten nicht auf.

PUBLIC API

Auch aus Apps verwendbar

Die Kernberechnungsfunktionen sind keine internen Hilfsfunktionen, sondern Teil der öffentlichen API. Sie können direkt in der Logik der App verwendet werden, z. B. zur Anzeige von Routenentfernungen, Berechnung von Radien oder benutzerdefinierter Trefferprüfung. Alle auf dieser Seite aufgelisteten Funktionen sind auf allen drei Plattformen verfügbar.

Verwandte Seiten