Mathe für Geoinformatiker: Koordinate auf Linie verschieben

Claude.ai ist manchmal ziemlich begabt bei solchen Dingen, ich kann das Ergebnis allerdings nicht einschätzen. Es könnte auch Bullshit sein, man weiß nie so genau:

Ich verstehe Ihre Anforderung. Sie möchten eine Formel oder VBA-Code, um eine neue Koordinate (b2) zu berechnen, die auf der Linie zwischen zwei gegebenen Koordinaten (a und b) liegt, aber um eine bestimmte Distanz von b in Richtung a verschoben ist. Hier sind Lösungen sowohl als Excel-Formel als auch als VBA-Funktion:

Option Explicit

' Funktion zur Berechnung der neuen Koordinate b2
Function BerechneKoordinateB2(lat1 As Double, lon1 As Double, lat2 As Double, lon2 As Double, distanzKm As Double) As String
    Const PI As Double = 3.14159265358979
    Const ERDE_RADIUS As Double = 6371 ' Erdradius in Kilometern
    
    ' Umrechnung in Radianten
    lat1 = lat1 * PI / 180
    lon1 = lon1 * PI / 180
    lat2 = lat2 * PI / 180
    lon2 = lon2 * PI / 180
    
    ' Berechnung der Gesamtdistanz
    Dim dLon As Double
    dLon = lon2 - lon1
    Dim gesamtDistanz As Double
    gesamtDistanz = 2 * ERDE_RADIUS * ArcSin(Sqr((Sin((lat2 - lat1) / 2)) ^ 2 + Cos(lat1) * Cos(lat2) * (Sin(dLon / 2)) ^ 2))
    
    ' Verhältnis der neuen Distanz zur Gesamtdistanz
    Dim fraction As Double
    fraction = 1 - (distanzKm / gesamtDistanz)
    
    ' Berechnung der neuen Koordinate
    Dim a As Double, b As Double, x As Double, y As Double, z As Double
    Dim c As Double, d As Double
    
    a = Sin((1 - fraction) * gesamtDistanz / ERDE_RADIUS) * Cos(lat2)
    b = Cos((1 - fraction) * gesamtDistanz / ERDE_RADIUS) - Sin(lat1) * Sin(lat2)
    
    lat2 = ArcSin(Sin(lat1) * Cos((1 - fraction) * gesamtDistanz / ERDE_RADIUS) + Cos(lat1) * a)
    lon2 = lon1 + ArcTan2(a * Sin(dLon), b - Sin(lat1) * Sin(lat2))
    
    ' Umrechnung zurück in Grad
    lat2 = lat2 * 180 / PI
    lon2 = lon2 * 180 / PI
    
    ' Rückgabe als String im Format "Latitude, Longitude"
    BerechneKoordinateB2 = Format(lat2, "0.000000") & ", " & Format(lon2, "0.000000")
End Function

' Hilfsfunktion für ArcSin
Function ArcSin(x As Double) As Double
    If Abs(x) = 1 Then
        ArcSin = Sgn(x) * PI / 2
    Else
        ArcSin = Atn(x / Sqr(1 - x * x))
    End If
End Function

' Hilfsfunktion für ArcTan2
Function ArcTan2(y As Double, x As Double) As Double
    If x > 0 Then
        ArcTan2 = Atn(y / x)
    ElseIf x < 0 Then
        If y >= 0 Then
            ArcTan2 = Atn(y / x) + PI
        Else
            ArcTan2 = Atn(y / x) - PI
        End If
    ElseIf y > 0 Then
        ArcTan2 = PI / 2
    ElseIf y < 0 Then
        ArcTan2 = -PI / 2
    Else
        ArcTan2 = 0 ' Undefiniert, könnte auch einen Fehlerwert zurückgeben
    End If
End Function

Um diese VBA-Funktion in Excel zu verwenden, fügen Sie sie in ein VBA-Modul ein. Dann können Sie sie in einer Zelle wie folgt aufrufen:

=BerechneKoordinateB2(A2, B2, C2, D2, E2)

Dabei wird angenommen, dass:

  • A2 und B2 die Breiten- und Längengrade von Koordinate-a enthalten
  • C2 und D2 die Breiten- und Längengrade von Koordinate-b enthalten
  • E2 die Distanz in Kilometern enthält, um die die Linie verkürzt werden soll

Alternativ können Sie auch eine Excel-Formel verwenden, die jedoch komplexer und möglicherweise weniger genau ist. Hier ist eine Annäherung:

=LET(
    lat1, RADIANS(A2),
    lon1, RADIANS(B2),
    lat2, RADIANS(C2),
    lon2, RADIANS(D2),
    d, E2/6371,
    f, 1-d/ACOS(SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(lon2-lon1)),
    A, SIN((1-f)*d)*COS(lat2),
    B, COS((1-f)*d)-SIN(lat1)*SIN(lat2),
    lat3, ASIN(SIN(lat1)*COS((1-f)*d)+COS(lat1)*A),
    lon3, lon1+ATAN2(A*SIN(lon2-lon1), B-SIN(lat1)*SIN(lat3)),
    CONCATENATE(TEXT(DEGREES(lat3),"0.000000"), ", ", TEXT(DEGREES(lon3),"0.000000"))
)

Diese Formel verwendet die LET-Funktion, die in neueren Excel-Versionen verfügbar ist. Sie führt die gleiche Berechnung wie die VBA-Funktion durch, ist aber möglicherweise etwas weniger genau aufgrund der Einschränkungen von Excel-Formeln.

Beide Methoden verwenden die Haversine-Formel zur Berechnung von Distanzen auf einer Kugel und berücksichtigen die Krümmung der Erde.