2009-07-10 5 views
9

Ich beschäftige mich derzeit mit GPS-Daten kombiniert mit präziser Höhenmessung. Ich möchte den Abstand zwischen zwei aufeinanderfolgenden Punkten berechnen. Es gibt eine Menge Informationen über die Berechnung der Entfernung zwischen zwei Punkten mit dem WGS84 Ellipsoid und so weiter.Bei der Berechnung der geodätischen Distanz wird die Höhe berücksichtigt

jedoch habe ich keine Informationen gefunden, die Höhe Änderungen berücksichtigt für diese Abstandsberechnung.

weiß jemand über einige Websites, Papiere, Bücher usw., die eine solche Methode beschreibt? danke

bearbeiten: Sql Server 2008 geografische Erweiterungen vernachlässigen auch Höheninformationen bei der Berechnung der Entfernung.

+0

Ich habe nicht an den WGS84 Gleichungen sah, so schreibe ich nicht dies als eine Antwort. Das heißt, es scheint mir, dass Sie in der Lage sein sollten, einen Radius oder zwei zu optimieren, um Ihre Messpunkte zu der "neuen" Oberfläche zu machen. Dies würde wahrscheinlich am besten funktionieren, wenn Ihre Höhenmessungen GPS-basiert sind; auf der Grundlage mechanischer Mittel (z. B. Luftdruck) kann "Meereshöhe" eine sehr geringe Beziehung zum Modell-Geoid haben. – kdgregory

+0

Haben Sie jemals eine gute Lösung dafür gefunden? – lnafziger

Antwort

0

Ich würde vorschlagen, dass über jede Entfernung, wo die Verwendung der WGS84 Ihnen deutlich bessere Genauigkeit geben würde, dass der Höhenunterschied keine Rolle spielt. Und über jede Entfernung, bei der der Höhenunterschied eine Rolle spielt, sollten Sie wahrscheinlich nur die Approximation der Geraden verwenden.

0

Um dies zu tun, müssen Sie als Erstes die Höhenänderung definieren. Die normalen Gleichungen funktionieren, weil sie sich auf einer zweidimensionalen Oberfläche befinden, aber das Hinzufügen der dritten Dimension bedeutet, dass die einfache Definition der kürzesten Distanz nicht mehr anwendbar ist. Zum Beispiel ist jetzt die dritte Dimension 'im Spiel', Ihre kürzeste Distanz könnte durch das Original schneiden Ellipsoid. Es ist ein bisschen schnell und schmutzig, aber Ihre beste Lösung könnte sein, anzunehmen, dass die Änderungsrate der Alltität entlang des ursprünglichen 2D-Pfads auf dem Ellipsoid konstant ist. Sie können dann die 2D-Entfernung als eine Länge berechnen, die Änderungsrate der Höhe berechnen und dann einfach Pythagoras verwenden, um die Längenzunahme zu berechnen, wobei eine Seite des Dreiecks die 2D-Entfernung und die Höhe die zweite Länge ist.

6

Ich habe eine WGS84-Entfernungsfunktion implementiert, die den Durchschnitt der Start- und Endhöhe als konstante Höhe verwendet. Wenn Sie sicher sind, dass sich auf Ihrem Weg relativ wenig Höhenschwankungen ergeben, funktioniert dies akzeptabel (der Fehler ist relativ zum Höhenunterschied Ihrer beiden LLA-Punkte).

Hier ist mein Code (C#):

/// <summary> 
    /// Gets the geodesic distance between two pathpoints in the current mode's coordinate system 
    /// </summary> 
    /// <param name="point1">First point</param> 
    /// <param name="point2">Second point</param> 
    /// <param name="mode">Coordinate mode that both points are in</param> 
    /// <returns>Distance between the two points in the current coordinate mode</returns> 
    public static double GetGeodesicDistance(PathPoint point1, PathPoint point2, CoordMode mode) { 
     // calculate proper geodesics for LLA paths 
     if (mode == CoordMode.LLA) { 
      // meeus approximation 
      double f = (point1.Y + point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double g = (point1.Y - point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double l = (point1.X - point2.X)/2 * LatLonAltTransformer.DEGTORAD; 

      double sinG = Math.Sin(g); 
      double sinL = Math.Sin(l); 
      double sinF = Math.Sin(f); 

      double s, c, w, r, d, h1, h2; 
      // not perfect but use the average altitude 
      double a = (LatLonAltTransformer.A + point1.Z + LatLonAltTransformer.A + point2.Z)/2.0; 

      sinG *= sinG; 
      sinL *= sinL; 
      sinF *= sinF; 

      s = sinG * (1 - sinL) + (1 - sinF) * sinL; 
      c = (1 - sinG) * (1 - sinL) + sinF * sinL; 

      w = Math.Atan(Math.Sqrt(s/c)); 
      r = Math.Sqrt(s * c)/w; 
      d = 2 * w * a; 
      h1 = (3 * r - 1)/2/c; 
      h2 = (3 * r + 1)/2/s; 

      return d * (1 + (1/LatLonAltTransformer.RF) * (h1 * sinF * (1 - sinG) - h2 * (1 - sinF) * sinG)); 
     } 

     PathPoint diff = new PathPoint(point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z, 0); 
     return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y + diff.Z * diff.Z); 
    } 

In der Praxis wir, dass die Höhendifferenz einen großen Unterschied macht selten gefunden haben, unsere Wege werden typischerweise 1-2 km lang mit der Höhe in der Größenordnung von 100 m variiert und wir sehen ungefähr ~ 5m Änderung im Vergleich zur Verwendung des WGS84 Ellipsoids unmodifiziert.

Edit:

dazu hinzuzufügen, wenn Sie große Höhenänderungen tun erwarten, können Sie konvertieren Sie Ihre WGS84 zu ECEF-Koordinaten (Erde zentrierte Erde fest) und bewerten geradlinige Pfade als meine am unteren Ende gezeigt Funktion. um einen Punkt zu ECEF Umwandlung ist einfach zu tun:

/// <summary> 
    /// Converts a point in the format (Lon, Lat, Alt) to ECEF 
    /// </summary> 
    /// <param name="point">Point as (Lon, Lat, Alt)</param> 
    /// <returns>Point in ECEF</returns> 
    public static PathPoint WGS84ToECEF(PathPoint point) { 
     PathPoint outPoint = new PathPoint(0); 

     double lat = point.Y * DEGTORAD; 
     double lon = point.X * DEGTORAD; 
     double e2 = 1.0/RF * (2.0 - 1.0/RF); 
     double sinLat = Math.Sin(lat), cosLat = Math.Cos(lat); 

     double chi = A/Math.Sqrt(1 - e2 * sinLat * sinLat); 
     outPoint.X = (chi + point.Z) * cosLat * Math.Cos(lon); 
     outPoint.Y = (chi + point.Z) * cosLat * Math.Sin(lon); 
     outPoint.Z = (chi * (1 - e2) + point.Z) * sinLat; 

     return outPoint; 
    } 

Edit 2:

ich über einige der anderen Variablen in meinem Code gefragt wurde:

// RF is the eccentricity of the WGS84 ellipsoid 
public const double RF = 298.257223563; 

// A is the radius of the earth in meters 
public const double A = 6378137.0; 

LatLonAltTransformer ist eine Klasse I verwendet Konvertieren von LatLonAlt-Koordinaten in ECEF-Koordinaten und definiert die obigen Konstanten.

+0

Ich glaube nicht, dass der Fragesteller nach Situationen gefragt hat, in denen die Höhe effektiv konstant ist. Ich denke, es ging darum, den Abstand zwischen zwei Punkten zu ermitteln, bei dem die Höhen zwischen den beiden Punkten stark voneinander abweichen. – jprete

+0

Vielleicht habe ich nicht geklärt, aber meine Lösung mittelt die Höhen der beiden Punkte und nennt diese Konstante. Die Auswertung der geodätischen Distanz mit zwei verschiedenen Höhen ist zeitraubend und schwierig, insbesondere wenn eine Approximation sehr gute Ergebnisse liefert. –

+0

Ich glaube, dass der ursprüngliche Fragesteller die geringe Änderung der Entfernung, die sich aus Höhenänderungen ergibt, erfassen möchte; Aus diesem Grund ist die Verwendung des Durchschnittswerts oder des maximalen Alter oder des Mindestwerts alt keine Lösung. Geradlinige Distanzen sind auch keine Lösung für das Höhendifferenzproblem, weil solche geraden Linien nicht das passende Steig-/Sinkprofil haben, das man erwarten würde, wenn man sagt "Ich bin 60 Meilen gereist und habe die Höhe um 20000 Fuß geändert Zeit". Z.B. Wenn der letzte Punkt deines A unterhalb des Horizonts liegt, dann ist das erste, was der Pfad tun wird, unter dem Boden zu tunneln. – jprete

0

Für den Anfang brauchen Sie ein Modell, das Ihnen sagt, wie sich die Höhe auf der Linie zwischen den beiden Punkten ändert. Ohne ein solches Modell haben Sie keine konsistente Definition der Entfernung zwischen zwei Punkten.

Wenn Sie ein lineares Modell hatten (50% der Entfernung zwischen den Punkten bedeutet auch, dass Sie 50% der Höhe nach oben gegangen sind), dann können Sie wahrscheinlich vorgeben, dass das Ganze ein rechtwinkliges Dreieck ist; Sie verhalten sich so, als ob die Welt flach wäre, um zu bestimmen, wie sich die Höhenverschiebung auf die Entfernung auswirkt. Die Entfernung auf dem Boden ist die Basis, die Höhenänderung ist die Höhe des Dreiecks und die Hypotenuse ist Ihre geschätzte wahre Reisedistanz von Punkt zu Punkt.

Wenn Sie das weiter verfeinern möchten, dann können Sie feststellen, dass das obige Modell perfekt für infinitesimale Abstände ist, was bedeutet, dass Sie über einzelne Distanzen, Kalkül-Stil, jedes Mal mit der aktuellen Höhe iterieren können um die Bodenentfernung zu berechnen und dann das gleiche trigonometrische Verhältnis zu verwenden, um den Höhenänderungsbeitrag zu der zurückgelegten Entfernung zu berechnen. Ich würde das wahrscheinlich in einer for() - Schleife mit 10 bis 100 Teilen des Segments machen, und möglicherweise durch Versuch und Irrtum herausfinden, wie viele Stücke benötigt werden, um innerhalb des Epsilons vom wahren Wert zu kommen. Es wäre auch möglich, das Linienintegral zu berechnen, um den tatsächlichen Abstand zwischen den zwei Punkten unter diesem Modell herauszufinden.

0

Sie interessieren sich wahrscheinlich nicht für die Höhe für große 2D Abstandsabstände. Also, wenn der Dist ist über 20 (oder vielleicht 50) km, dann wen kümmert sich um die Höhenunterschied (hängt von Ihren Bedürfnissen Fall). Unter sagen wir 20km, füttern Sie den einfachen pythagoräischen Zusatz zum Höhenunterschied. Führen Sie es reibungslos ein.

Distance between two geo-points?