Inhaltsverzeichnis

std.geo.sphere — Entfernungen und Kurse auf der Erdkugel

import std.geo.sphere;

Großkreisrechnung mit f64-Grad: Entfernung, Kurs, Zielpunkt, Quer- und Längsabweichung, Loxodrome, Sichtweite. Ergänzt std.geo, das in Mikrograd und ganzzahlig rechnet — hier stehen Gleitkommagrad und die Aufgaben der Navigation.

Winkel durchgehend in Grad, Entfernungen in Metern, Kurse 0…360 von Nord im Uhrzeigersinn.

std.geodesy (Ellipsoid statt Kugel) · std.geo · std.astro.guidance · Mathematik-Units · Guide: Navigation und Wegpunkte

<WRAP center round important 90%> Die Unit trägt seit 2026-09-06 englische Namen. 34 Funktionen und vier Konstanten wurden umbenannt, dazu die Parameternamen. Beide bestehenden Testläufe bleiben grün (62 und 23 Prüfungen).

vorher jetzt
GeoEntfernung · GeoEntfernungKm · GeoEntfernungSm GeoDistance · GeoDistanceKm · GeoDistanceNm
GeoKurs · GeoEndkurs · GeoNormKurs GeoBearing · GeoFinalBearing · GeoNormBearing
GeoQuerabweichung · GeoLaengsabweichung GeoCrossTrack · GeoAlongTrack
GeoZielpunkt · GeoMittelpunkt GeoDestination · GeoMidpoint
GeoLoxodromKurs · GeoLoxodromStrecke GeoRhumbBearing · GeoRhumbDistance
GeoAusGMS · GeoKompassSektor GeoFromDms · GeoCompassSector
GeoHorizont · GeoSichtverbindung GeoHorizon · GeoLineOfSight
GEO_NORD · GEO_SUED · GEO_OST · GEO_WEST GEO_NORTH · GEO_SOUTH · GEO_EAST · GEO_WEST

Beachten: aus GeoEntfernungSm (Seemeilen) wird GeoDistanceNm — die englische Abkürzung für die nautische Meile ist NM, nicht SM. Wer nur mechanisch „Sm → Nm„ ersetzt, trifft es hier zufällig richtig; wer SeaMiles erwartet, findet nichts. </WRAP>


1. Typ, Radien, Fehlerwert

pub type GeoPos = struct { lat: f64; lon: f64; }   // Grad

Funktion Wert / Bedeutung
GeoEarthRadius() 6 371 008.8 m — mittlerer Erdradius
GeoRadiusMoon() · GeoRadiusMars() 1 737 400 m · 3 389 500 m
GeoPosNew(lat, lon) Position bauen
GeoError() · GeoIsError(x) NaN als Fehlerwert, wie in std.astro
GeoLatValid(lat) · GeoLonValid(lon) · GeoPosValid(p) Bereichsprüfung (−90…90 bzw. −180…180)
GeoPosIsError(p) ist eine der Komponenten NaN?
GeoToRadians(grad) · GeoToDegrees(bogen) Umrechnung
GeoNormBearing(grad) auf 0…360 bringen (−10350)
GeoNormDelta(grad) Differenz auf −180…180 bringen

2. Entfernung und Kurs

Funktion Rückgabe Bedeutung
GeoDistanceR(a, b, radius) f64 Großkreisentfernung auf einer Kugel beliebigen Radius
GeoDistance(a, b) f64 [m] dieselbe mit dem Erdradius
GeoDistanceKm(a, b) · GeoDistanceNm(a, b) f64 in Kilometern bzw. Seemeilen (1852 m)
GeoAngularDistance(a, b) f64 [Grad] Entfernung ohne Radius — für Funkstrecken und Sichtbarkeit
GeoBearing(a, b) f64 [Grad] Anfangskurs
GeoFinalBearing(a, b) f64 [Grad] Kurs bei der Ankunft
GeoDestination(start, kurs, strecke) GeoPos direktes Problem: wohin führt ein Kurs?
GeoDestinationR(start, kurs, strecke, radius) GeoPos dasselbe auf anderem Körper
GeoMidpoint(a, b) GeoPos Mitte des Großkreisbogens
 
Auf einem Großkreis ändert sich der Kurs unterwegs. Hamburg → New York beginnt mit 293 Grad und endet mit 226 — ein Unterschied von 67 Grad. Wer einen festen Kurs steuern will, braucht die Loxodrome (Abschnitt 4); sie ist länger, aber ohne ständige Kurskorrektur zu fahren.

GeoAngularDistance liefert bereits Grad — nicht noch einmal durch GeoToDegrees schicken.

3. Abweichung von der Route

Funktion Rückgabe Bedeutung
GeoCrossTrack(punkt, von, nach) f64 [m] Abstand zum Großkreis; Vorzeichen sagt die Seite
GeoAlongTrack(punkt, von, nach) f64 [m] wie weit entlang der Route der Punkt schon liegt

4. Loxodrome

Funktion Rückgabe Bedeutung
GeoRhumbBearing(a, b) f64 [Grad] fester Kurs, der ans Ziel führt
GeoRhumbDistance(a, b) f64 [m] dessen Länge

5. Himmelsrichtungen und Sichtweite

Funktion Rückgabe Bedeutung
GEO_NORTH, GEO_SOUTH, GEO_EAST, GEO_WEST int64 Richtungskennungen (N/S/E/W als Zeichen)
GeoFromDms(grad, min, sek, richtung) f64 Grad-Minuten-Sekunden zu Dezimalgrad — exakt über /60 und /3600
GeoLatHemisphere(lat) · GeoLonHemisphere(lon) int64 passende Richtungskennung
GeoCompassSector(kurs) int64 0 = N, 1 = NNO, … 15 = NNW; jeder Sektor 22.5 Grad, Nord symmetrisch um 0
GeoHorizon(hoehe) f64 [m] Entfernung zum Horizont: R·acos(R/(R+h))
GeoLineOfSight(a, hoeheA, b, hoeheB) bool reichen beide Horizonte zusammen über die Strecke?
 
Eine unbekannte Himmelsrichtung wird gemeldet, nicht stillschweigend als Nord gelesen — anders als ParseDMS in std.geo, das den Wert dort positiv zurückgibt (#1888).

6. Beispiel

import std.geo.sphere;
import std.io;

fn zeig(n: pchar, v: f64, d: int64): void { Print(n); PrintLn(FloatToStr(v, d)); }
fn BI(b: bool): int64 { if (b) { return 1; } return 0; }

fn main(): int64 {
    var ham: GeoPos := GeoPosNew(53.5511, 9.9937);          // Hamburg
    var muc: GeoPos := GeoPosNew(48.1351, 11.5820);         // Muenchen
    var nyc: GeoPos := GeoPosNew(40.7128, 0.0 - 74.0060);   // New York

    zeig("HH->M   km         : ", GeoDistanceKm(ham, muc), 1);
    zeig("HH->NYC km         : ", GeoDistanceKm(ham, nyc), 1);
    zeig("HH->NYC sm         : ", GeoDistanceNm(ham, nyc), 1);
    zeig("Anfangskurs HH->NYC: ", GeoBearing(ham, nyc), 2);
    zeig("Endkurs HH->NYC    : ", GeoFinalBearing(ham, nyc), 2);
    zeig("Winkelabstand Grad : ", GeoAngularDistance(ham, nyc), 3);

    var mitte: GeoPos := GeoMidpoint(ham, nyc);
    Print("Mittelpunkt        : "); Print(FloatToStr(mitte.lat, 3));
    Print(" / "); PrintLn(FloatToStr(mitte.lon, 3));

    var ziel: GeoPos := GeoDestination(ham, 180.0, 500000.0);  // 500 km nach Sued
    Print("500 km Sued        : "); Print(FloatToStr(ziel.lat, 4));
    Print(" / "); PrintLn(FloatToStr(ziel.lon, 4));

    zeig("Querabw. M zu Route: ", GeoCrossTrack(muc, ham, nyc) / 1000.0, 1);
    zeig("Laengsabw. km      : ", GeoAlongTrack(muc, ham, nyc) / 1000.0, 1);
    zeig("Loxodromkurs       : ", GeoRhumbBearing(ham, nyc), 2);
    zeig("Loxodromstrecke km : ", GeoRhumbDistance(ham, nyc) / 1000.0, 1);
    zeig("Horizont 10 m km   : ", GeoHorizon(10.0) / 1000.0, 2);
    zeig("Horizont 10 km  km : ", GeoHorizon(10000.0) / 1000.0, 1);
    Print("Sicht HH<->M?      : "); PrintLn(IntToStr(BI(GeoLineOfSight(ham, 100.0, muc, 100.0))));
    zeig("GMS 53 33 4 N      : ", GeoFromDms(53.0, 33.0, 4.0, GEO_NORTH), 5);
    Print("Kompasssektor 200  : "); PrintLn(IntToStr(GeoCompassSector(200.0)));
    Print("Breite gueltig 91? : "); PrintLn(IntToStr(BI(GeoLatValid(91.0))));
    zeig("Kurs -10 normiert   : ", GeoNormBearing(0.0 - 10.0), 1);
    return 0;
}

HH->M   km         : 612.4
HH->NYC km         : 6129.9
HH->NYC sm         : 3309.9
Anfangskurs HH->NYC: 293.24
Endkurs HH->NYC    : 226.07
Winkelabstand Grad : 55.128
Mittelpunkt        : 55.243 / -38.234
500 km Sued        : 49.0545 / 9.9937
Querabw. M zu Route: -505.3
Laengsabw. km      : 346.3
Loxodromkurs       : 257.25
Loxodromstrecke km : 6469.4
Horizont 10 m km   : 11.29
Horizont 10 km  km : 356.7
Sicht HH<->M?      : 0
GMS 53 33 4 N      : 53.55111
Kompasssektor 200  : 9
Breite gueltig 91? : 0
Kurs -10 normiert   : 350.0

Drei Dinge lassen sich daran ablesen:

Die negative Querabweichung Münchens (−505 km) sagt die Seite: München liegt südlich der Route Hamburg → New York.


Letzte Aktualisierung: 2026-09-07 — Unit auf englische Namen umgestellt: 34 Funktionen, vier Konstanten und die Parameternamen umbenannt (GeoEntfernungGeoDistance, GeoKursGeoBearing, GeoQuerabweichungGeoCrossTrack, GEO_SUEDGEO_SOUTH); Umbenennungstabelle als Kasten aufgenommen. Beispiele gegen lyxc 1.2.2D übersetzt.

Vorherige letzte Aktualisierung: 2026-09-01 — Seite neu angelegt aus std/geo/sphere.lyx; Beispiel mit lyxc 1.1.16A gebaut und ausgeführt.