• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Grade zu metern umwandeln

Javier

Geonewbie
Ich möchtegerne wissen wie ich den abstand (in metern) zwishen zwei Längegräden berechnen kann. Ich weiss dass ich sie auf dem Äquator so berechnen kann:

distanz= Erdradius*2*sin(graden/2)

Aber wie mache ich es wenn ich mich nicht auf dem Äquator befinde? Soll ich dan die gleiche formel benützen und dann sie mal cos(Breitengrad) multiplizieren?

Vielen Dank

Javier
 

KajakFun

Geowizard
"Aber wie mache ich es wenn ich mich nicht auf dem Äquator befinde? Soll ich dan die gleiche formel benützen und dann sie mal cos(Breitengrad) multiplizieren? "

Im Prinzip rchtig.
1/60 Grad =1 Meile =1,86 km in Nord Süd Richtung
Da die Längengrade nach Norden dichter zusammenrücken gilt
1/60 Grad = 1.86 km * cos(Breitengrad) z.B. bei 48 Grad = 1,24 km

Bei N Grad.MM.MMM Darstellung entspricht eine Tausendstel Breitengraddifferenz 1,86 Meter bzw.
Bei E Grad.MM.MMM entspricht eine Tausendstel Differenz ca. 1,24 Meter (bei 48 Grad Breite) in Ost-West Richtung
KM Distanz zwischen 2 Punkten hinreichend genau mit Pythagoras = Wurzel(Meter NordDiff^2+Meter Ostdiff.^2)

Man kann aber auch auf Gauss Krüger Koordinaten umstellen dann sind die Differenzen direkt in Meter . :D :wink:
 

tobbes

Geocacher
Hallo,
ich würde schon gerne wissen wozu Du das brauchst? Zum Segeln?
Nach kurzer Literatur Befragung (hab mir mal ein Buch gekauft!):
Ja Du hast wohl recht.

Abstand zwischen den Minutenfeldern:
geographische Breite:
Abstand = 1,852 km (eine Seemeile)

geographische Länge:
Abstand = 1,852 * cosB(Breite)

Quelle:Manfred Feller/ Auf Tour mit dem GPS-Empfänger

Gruß Tobbes
 
OP
J

Javier

Geonewbie
Vilen Dank.

Eure Ratschläge waren sehr nützlich. Aber die resultate sind nich so herausgekommen als ich sie erwartet hatte.
Ich brauche es um den Abstand zwischen zwei parallel gefahrene Spuren zu berechnen.

Ich weiss dass am besten wäre es wenn ich UTM Koordinate hätte aber die waren schon in WGS84gegeben also konnte ich mein Gerät nicht zu UTM umstellen. Da ich etwa 10000 punkte habe kann ich die Korrdinate nicht 1 für 1 umwandeln und da ich cm genaue resultate brauche muss ich eine sehr zuverlässige software finden.

Kennt ihr irgend so eine. Es ist wichtig dass ich viele punkte auf mal eingeben kann. Vieleicht könntet ihr mirauch sagen welcher Geoid am besten für Deutschland passt.

Ich bedanke mich nochmals.

Javier
 
Hallo Javier,

Üblicherweise wird für eine Berechnung dieser Art die Haversine Formel verwendet.
Ein entsprechendes JavaScript und eine Erklärung der Formel ist hier zu finden:
http://www.movable-type.co.uk/scripts/LatLong.html

Diese lautet:

R = earth’s radius (mean radius = 6,371km)
Δlat = lat2 − lat1
Δlong = long2 − long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c

allerdings geht diese zunächst von einem Kugelmodell aus.
wenn Du nun mit dem entsprechenden Ellipsoid-Modell z.B. WGS1984 arbeitets, oder auch einem beliebigen anderen, müssen dir die entsprechenden Parameter (Equatorial-Radius, Polar-Radius, Eccentricity und Flattening) bekannt sein (bzw. errechnet werden.)

Dann kannst Du mit einer Annäherung des Kurven-Radius am Delta der beiden Koordinaten ein schon sehr genaues Ergebnis erhalten

Damit ist eine Genauigkeit von 0.1% möglich.

Wenn es noch genauer werden soll, gibt es noch die Vincenty-Formel:
http://www.movable-type.co.uk/scripts/LatLongVincenty.html

a, b = major & minor semiaxes of the ellipsoid
f = flattening (a−b)/a
φ1, φ2 = geodetic latitude
L = difference in longitude
U1 = atan((1−f).tanφ1)
U2 = atan((1−f).tanφ2)
λ = L, λ′ = 2π
while abs(λ−λ′) > 10-12 {
sinσ = √[ (cosU2.sinλ)² + (cosU1.sinU2 − sinU1.cosU2.cosλ)² ]
cosσ = sinU1.sinU2 + cosU1.cosU2.cosλ
σ = atan2(sinσ, cosσ)
α = asin(cosU1.cosU2.sinλ / sinσ)
cos2σm = cosσ − 2.sinU1.sinU2/cos²α
C = f/16.cos²α.[4+f.(4−3.cos²α)]
λ′ = λ
λ = L + (1−C).f.sinα.{σ+C.sinσ.[cos2σm+C.cosσ.(−1+2.cos²2σm)]}
}
u² = cos²α.(a²−b²)/b²
A = 1+u²/16384.{4096+u².[−768+u².(320−175.u²)]}
B = u²/1024.{256+u².[−128+u².(74−47.u²)]}
Δσ = B.sinσ.{cos2σm+B/4.[cosσ.(−1+2.cos²2σm) − B/6.cos2σm.(−3+4.sin²σ).(−3+4.cos²2σm)]}
s = b.A.(σ−Δσ)


Im WGS1984 ist das Ellipsoid Modell:
a = 6 378 137 m
b = 6 356 752.3142 m
f = 1 / 298.257223563

Wichtig und zu beachten ist in jedem Fall, dass du einen möglichst genauen Wert für PI verwenden musst, wenn du die Grad-Werte in Radianten umwandelst.

Ausserdem musst Du noch beachten, dass Du mit Fließkommazahlen doppelter genauigkeit rechnen musst, um rundungsfehler so klein wie möglich zu halten.

Ich habe die Formel noch ein wenig optimiert, um redundante Berechnungen von Sin/Cos/Tan/... zu vermeiden:

In VB.NET sieht das ganze dann so aus:
Code:
        Private Const epsilon As System.Double = 0.000000000000001

        Public Const DoublePI As System.Double = Math.PI * 2.0


        Public Shared Function DistanceBetween(ByVal start As Position, ByVal destination As Position, ByVal ellipsoid As Ellipsoid) As Distance
            Dim result As Distance

            Try
                If start.Equals(destination) Then
                    result = Distance.Empty
                Else

                    Dim lat1 As System.Double = start.Latitude.ToRadians.Value
                    Dim lon1 As System.Double = start.Longitude.ToRadians.Value
                    Dim lat2 As System.Double = destination.Latitude.ToRadians.Value
                    Dim lon2 As System.Double = destination.Longitude.ToRadians.Value
                    Dim semiMajorAxis As System.Double = ellipsoid.SemiMajorAxis.ToKilometers.Value
                    Dim semiMinorAxis As System.Double = ellipsoid.SemiMinorAxis.ToKilometers.Value
                    Dim flattening As System.Double = ellipsoid.Flattening

                    Dim L As System.Double = lon2 - lon1

                    Dim U1 As System.Double = Math.Atan((1 - flattening) * Math.Tan(lat1))
                    Dim U2 As System.Double = Math.Atan((1 - flattening) * Math.Tan(lat2))

                    Dim sinU1 As System.Double = Math.Sin(U1)
                    Dim cosU1 As System.Double = Math.Cos(U1)
                    Dim sinU2 As System.Double = Math.Sin(U2)
                    Dim cosU2 As System.Double = Math.Cos(U2)

                    Dim lambda As System.Double = L
                    Dim lambdaP As System.Double = DoublePI

                    Dim iterLimit As System.Int32 = 20

                    Dim sigma As System.Double
                    Dim sinSigma As System.Double
                    Dim cosSigma As System.Double

                    Dim sinLambda As System.Double
                    Dim cosLambda As System.Double

                    Dim alpha As System.Double
                    Dim cosSqAlpha As System.Double
                    Dim cos2SigmaM As System.Double

                    Dim C As System.Double

                    While (Math.Abs(lambda - lambdaP) > epsilon) And (iterLimit > 0)
                        iterLimit -= 1

                        sinLambda = Math.Sin(lambda)
                        cosLambda = Math.Cos(lambda)

                        sinSigma = Math.Sqrt((cosU2 * sinLambda) * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda))
                        cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda
                        sigma = Math.Atan2(sinSigma, cosSigma)

                        alpha = Math.Asin(cosU1 * cosU2 * sinLambda / sinSigma)
                        cosSqAlpha = Math.Cos(alpha) * Math.Cos(alpha)
                        cos2SigmaM = cosSigma - 2.0 * sinU1 * sinU2 / cosSqAlpha

                        C = flattening / 16.0 * cosSqAlpha * (4.0 + flattening * (4.0 - 3.0 * cosSqAlpha))
                        lambdaP = lambda
                        lambda = L + (1.0 - C) * flattening * Math.Sin(alpha) * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1.0 + 2.0 * cos2SigmaM * cos2SigmaM)))
                    End While

                    If (iterLimit = 0) Then
                        result = Distance.Empty
                    Else
                        Dim uSq As System.Double = cosSqAlpha * (semiMajorAxis * semiMajorAxis - semiMinorAxis * semiMinorAxis) / (semiMinorAxis * semiMinorAxis)
                        Dim A As System.Double = 1.0 + uSq / 16384.0 * (4096.0 + uSq * (-768.0 + uSq * (320.0 - 175.0 * uSq)))
                        Dim B As System.Double = uSq / 1024.0 * (256.0 + uSq * (-128.0 + uSq * (74.0 - 47.0 * uSq)))
                        Dim deltaSigma As System.Double = B * sinSigma * (cos2SigmaM + B / 4.0 * (cosSigma * (-1.0 + 2.0 * cos2SigmaM * cos2SigmaM) - B / 6.0 * cos2SigmaM * (-3.0 + 4.0 * sinSigma * sinSigma) * (-3.0 + 4.0 * cos2SigmaM * cos2SigmaM)))
                        Dim s As System.Double = semiMinorAxis * A * (sigma - deltaSigma)

                        result = New Distance(s, DistanceUnit.Kilometers)
                    End If

                End If
            Catch ex As Exception
                Throw ex
            End Try

            Return result
        End Function

Mit hilfe dieser Formel kannst Du den Abstand auf 1 mm genau berechnen (allerdings leider mit kleinen abweichungen durch rundungsfehler)
 

goldensurfer

Geoguru
Hallo,
wenn Du Dich ein bisschen mit JavaScript auskennst, schau mal hierhin. (Seite aufrufen und Quelltext anzeigen; der entsprechende JScript-Code steht direkt in der Seite)
Selbiges gibt's übrigens dort auch nochmal für die wegpunktprojektion - braucht man auch oft.
 
Oben