std.geodesy — Erdellipsoid und Bezugsrahmen

Zurück zur Unit-Übersicht · std.geo.sphere · std.coordinates · Guide: Navigation und Wegpunkte

Zwei Units für Geodäsie auf dem Ellipsoid statt auf der Kugel: Referenzellipsoide mit ihren Krümmungsradien, und die Umrechnung zwischen geodätischen Koordinaten, ECEF und den örtlichen Rahmen ENU und NED.

Quelle: std/geodesy/

<WRAP center round important 90%> Der Unterschied zur Kugel ist keine Feinheit. Die Kugelnäherung in std.geo.sphere weicht in der Entfernung um bis zu 0,5 % ab — auf 1000 km sind das 5 km. Für eine Kartendarstellung belanglos, für Vermessung, Navigation oder eine Landebahnrechnung nicht. </WRAP>


Units im Überblick

Unit Import Inhalt
std.geodesy.ellipsoid import std.geodesy.ellipsoid; Ellipsoid-Typ, fertige Referenzellipsoide (WGS84, GRS80, Bessel 1841, Clarke 1866), Exzentrizität, Quer- und Meridiankrümmungsradius, Meter je Breiten- und Längengrad
std.geodesy.frames import std.geodesy.frames; Geodetic-Typ, geodätisch ↔ ECEF, ECEF ↔ ENU und NED, Azimut, Elevation, Schrägentfernung

Die vier Bezugsrahmen

Rahmen Ursprung Achsen Wofür
geodätisch Breite, Länge, Höhe über dem Ellipsoid Eingabe und Ausgabe, Karten
ECEF Erdmittelpunkt erdfest, kartesisch (x, y, z) Rechnen, GNSS, Umrechnungsdrehscheibe
ENU ein Standpunkt Ost, Nord, Oben Sichtlinien, Antennen, Vermessung
NED ein Standpunkt Nord, Ost, Unten Luftfahrt, Regelungstechnik

ECEF ist die Drehscheibe: geodätisch → ECEF → ENU/NED. EnuToNed und NedToEnu tauschen direkt um — sie vertauschen die ersten beiden Achsen und kehren das Vorzeichen der dritten um. Genau das ist der Fehler, der sonst unbemerkt bleibt: ein Vorzeichen in der Höhe.


Einstiegsbeispiel

unit main;
import std.coordinates.vec3;
import std.coordinates.transform;
import std.geodesy.ellipsoid;
import std.geodesy.frames;
import std.io;
import std.string;

fn main(): int64 {
    var e:  Ellipsoid := EllWgs84();
    var hh: Geodetic  := GeodFromDeg(53.6304, 9.9882, 0.0);   // Standpunkt
    var zz: Geodetic  := GeodFromDeg(53.5511, 9.9937, 0.0);   // Ziel

    var enu: V3 := EcefToEnu(e, hh, GeodToEcef(e, zz));

    PrintLn(StrConcat("Nord (m):     ", FloatToStr(enu.y, 1)));
    PrintLn(StrConcat("Azimut (Grad):", FloatToStr(RadToDeg(EnuAzimuth(enu)), 2)));
    PrintLn(StrConcat("Entfernung:   ", FloatToStr(EnuSlantRange(enu), 1)));
    PrintLn(StrConcat("1 Grad Breite:", FloatToStr(EllLatDegreeM(e, hh.latRad), 1)));
    PrintLn(StrConcat("1 Grad Laenge:", FloatToStr(EllLonDegreeM(e, hh.latRad), 1)));
    return 0;
}

Nord (m):     -8825.9
Azimut (Grad):177.63
Entfernung:   8833.4
1 Grad Breite:111298.1
1 Grad Laenge:66155.3

Der Längengrad ist auf dieser Breite nur noch 66 km lang, der Breitengrad 111 km — das ist der Grund, warum eine flache Rechnung mit gleich langen Grad-Schritten in Mitteleuropa um 40 % danebenliegt.


Wann welche Unit

Aufgabe Unit
Kurs und Strecke über den Großkreis, weltweit std.geo.sphere — schneller, 0,5 % ungenauer
Vermessung, örtliche Netze, Sichtlinien std.geodesy
Rechtecke und Umkreissuche im Nahbereich std.geo (Mikrograd, ganzzahlig)
Flugleistung und Flugführung std.aero

Letzte Aktualisierung: 2026-09-06 — Seite neu angelegt; erhoben aus std/geodesy/*.lyx, Beispiel gegen lyxc 1.2.2D übersetzt und ausgeführt.