2009-07-10 25 views
9

現在、正確な高度測定と組み合わされたGPSデータを処理しています。 2つの連続点間の距離を計算します。 WGS84楕円体を使用して2点間の距離を計算することについては、多くの情報がある があります。測地線距離を計算するときに高度を考慮する

しかし、私はこの 距離計算のために考慮に高度変更を要するすべての情報を見つけることができませんでした。

このような方法を説明するウェブサイト、論文、書籍などについて知っている人はいますか? おかげ

編集:また、SQL Server 2008の地理的な拡張無視高度情報距離を計算します。

+0

私はWGS84方程式を見ていないので、答えとしてこれを書いていないです。つまり、測定点を「新しい」サーフェスにするには、半径を2つ調整する必要があります。これはおそらく高度測定がGPSベースの場合に最も効果的です。機械的手段(例えば空気圧)に基づいている場合、「海面」はモデルジオイドとほとんど関係がない可能性があります。 – kdgregory

+0

あなたはこのために良い解決策を思いついたことがありますか? – lnafziger

答えて

0

私は、WGS84を使用すると、標高の差が重要ではないという著しく優れた精度が得られると考えています。また、標高の違いがある場所では、直線近似を使用してください。

0

これを行うには、まず高度の変更を定義する方法があります。正規方程式は2次元の表面上にあるために機能しますが、3次元を追加すると、最短距離の単純な定義はもはや適用されなくなります。例えば、thrid次元が '再生中'で、楕円。 少し速くて汚いですが、あなたの最善の解決策は、楕円の元の2Dパスに沿って、すべての変化率が一定であると仮定することです。次に、2D距離を長さとして計算し、高度の変化率を計算し、ピタゴラスを使用して長さの増加を計算します。三角形の片側が2D距離で、高度が第2の長さです。

6

開始高度と終了高度の平均を一定高度として使用してWGS84距離関数を実装しました。あなたの道に沿って高度の変化が比較的少ないことが確かであれば、これはうまく機能します(エラーは2つのLLAポイントの高度差に比例します)。

ここに私のコード(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); 
    } 

私たちは高度差はほとんど大きな違いがないことを発見しました、私たちのパスは通常、100メートルのオーダーで様々な高度で長い1-2kmされていますそして修正されていないWGS84楕円体を使用した場合と比べて平均約5mの変化が見られます。

編集:

あなたが大規模な高度の変化を期待していた場合、あなたはWGS84がECEF座標に変換することができます(地球中心地球固定)と私の一番下に示すように、直線のパスを評価し、これに追加します関数。 ECEFにポイントを変換すると、やることは簡単です:

/// <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; 
    } 

編集2:私は自分のコード内の他の変数のいくつかについて尋ねた

// 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は、私が使用するクラスですLatLonAlt座標をECEF座標に変換し、上の定数を定義します。

+0

私は、高度が事実上一定である状況について質問者が質問しているとは思わない。ポイントは、2つのポイントの間の高度が大きく異なる2つのポイントの間の大円のスタイルの距離を見つけることでした。 – jprete

+0

多分私は明確にしなかったかもしれませんが、私の解決策は2点の高度の平均をとってその定数を呼び出します。 2つの別々の標高を使用して測地線距離を評価することは、近似が非常に良好な結果を得る場合には特に時間がかかり、困難です。 –

+0

元の質問者は標高の変化による距離のわずかな変化を捕らえたいと思っています。そのため、平均値、つまり最大altまたは最小altを使用するのは解決策ではありません。 直線距離は、高度差の問題の解決法ではありません。そのような直線は、「私は60マイル走行し、高度を20000フィート増やした時間"。例えば。あなたの最後の地点が地平線より下にある場合、道が最初にすることは地面の下をトンネルすることです。 – jprete

0

まず、2つの点の間の線上で標高がどのように変化するかを示すモデルが必要です。このようなモデルがなければ、2点間の距離の一貫した定義はありません。

リニアモデル(ポイント間の距離の50%を移動すると、高度の50%を上回ったということも意味します)があれば、おそらく全体が正三角形であるとふりまえることができます。すなわち、世界が平坦であるかのように行動して、高度シフトがどのように距離に影響するかを判断します。地面に沿った距離はベース、高度の変化は三角形の高さ、斜辺はポイントからポイントまでのあなたの推定された真の移動距離です。

これ以上詳細化したい場合は、上のモデルは無限遠の距離に完全に適していることに気付くことができます。つまり、現在の標高を使用するたびに距離の個々のデルタを計算することができます地上距離を計算し、次に同じ三角法比を使用して、移動距離に対する高度変化寄与を計算する。私はおそらくfor()ループで10〜100個のセグメントを使って、おそらく試行錯誤によって実際の値のイプシロン内に入るのに必要な数を計算します。このモデルの下で2点間の実際の距離を計算するために線積分を計算することも可能です。

0

大規模な2D距離の区切りでは高度は気にしません。だから、あなたが得るdistが20(またはおそらく50)km以上であれば、高度diffについて気にする人は(あなたのニーズに応じて)。 20キロのところでは、高度差に加えて単純なピタゴラスの餌を食べる。それを円滑に送りなさい。

Distance between two geo-points?

関連する問題