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.
