13

私は現在、正確な高度測定と組み合わせた gps データを扱っています。連続する2点間の距離を計算したい。WGS84 楕円体などを使用して 2 点間の距離を計算する方法については、多くの情報があります。

ただし、この距離の計算に高度の変化を考慮した情報は見つかりませんでした。

そのような方法を説明しているウェブサイト、論文、本などを知っている人はいますか? ありがとう

edit : Sql Server 2008 の地理的拡張機能は、距離を計算するときに高度情報も無視します。

4

5 に答える 5

8

開始高度と終了高度の平均を一定高度として使用する 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 m のオーダーで変化する 1 ~ 2 km の長さであり、変更されていない WGS84 楕円体を使用した場合と比較して、平均で約 5 m の変化が見られます。

編集:

これに加えて、高度の大幅な変化が予想される場合は、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;

LatLonAltTransformerLatLonAlt 座標から ECEF 座標に変換するために使用したクラスで、上記の定数を定義します。

于 2009-08-11T13:47:46.633 に答える
1

大きな 2D 距離の分離では、高度は気にしないでしょう。したがって、取得した距離が 20 km (またはおそらく 50 km) を超えている場合、誰が高度差を気にするか (ニーズのケースによって異なります)。例えば ​​20km 以下では、高度差に単純なピタゴラス数を追加します。スムーズに投入してください。

2 つのジオポイント間の距離は?

于 2012-11-27T19:51:15.373 に答える
0

WGS84 を使用すると精度が大幅に向上し、高度の差が問題にならない距離であれば、どのような距離でも使用することをお勧めします。また、高度の違いが問題となる距離では、おそらく直線近似を使用する必要があります。

于 2009-07-11T21:53:23.890 に答える
0

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

線形モデルがある場合 (ポイント間の距離の 50% を移動するということは、高度の 50% を上に移動したことも意味します)、おそらく全体が直角三角形であると見なすことができます。つまり、高度の変化が距離にどのように影響するかを判断するために、世界が平らであるかのように行動します。地面に沿った距離は底辺、高度の変化は三角形の高さ、斜辺はポイントからポイントへの実際の推定移動距離です。

それをさらに改良したい場合は、上記のモデルが無限小距離に完全に適していることに注意してください。つまり、現在の高度を使用して地面を計算するたびに、微積分スタイルで距離の個々のデルタを反復処理できます。次に、同じ三角比を使用して、移動距離に対する高度変化の寄与を計算します。おそらく、セグメントの 10 ~ 100 個の部分を使用して for() ループでこれを行い、おそらく試行錯誤によって、真の値のイプシロン内に収まるのに必要な部分の数を割り出します。このモデルの下で 2 点間の実際の距離を計算するために、線積分を計算することも可能です。

于 2009-08-11T15:48:28.070 に答える
0

これを行うために最初に対処しなければならない問題は、高度の変化を定義する方法です。正規方程式は 2 次元の表面上にあるため機能しますが、3 番目の次元を追加すると、最短距離の単純な定義が適用できなくなります。たとえば、3 番目の次元が「機能している」ため、最短距離は元の表面を通過する可能性があります。楕円。少し手早くて汚いですが、最善の解決策は、楕円体上の元の 2D パスに沿って高度の変化率が一定であると仮定することです。次に、2D 距離を長さとして計算し、高度の変化率を計算し、ピタゴラスを使用して、三角形の 1 辺を 2D 距離、高度を 2 番目の長さとして長さの増加を計算します。

于 2009-08-11T13:42:21.477 に答える