Beispiel #1
0
 /// <summary>
 /// 距離演算その4
 /// <para>
 /// 2点をXYZ座標へ変換して、そのベクトルの差分のノルムを取る(== 直線距離[m])という処理を行います。
 /// 40 kmでその2に対して0.1 m以下の差を生じる。
 /// 地表における距離10 km以下であれば実用上は問題はないと考えられる。
 /// 演算の速さが取り柄です。
 /// 標高も演算に使われます。
 /// また、標高が高い(高度数十km)地点での短距離はこのメソッドの方がその2や3よりも精度上優位でしょう。
 /// </para>
 /// </summary>
 /// <param name="pos">求めたい地点の座標</param>
 /// <returns>距離</returns>
 public double GetDistance4(Blh pos)
 {
     Ecef me = this.ToXYZ();
     Ecef he = pos.ToXYZ();
     return (me - he).Norm;
 }
Beispiel #2
0
        /// <summary>
        /// 距離演算その2
        /// <para>
        /// <para>引数で指定された座標までの距離[m]を返します。</para>
        /// 参考:http://homepage3.nifty.com/kubota01/distance.htm
        /// 距離が50kmを超えるようなら、こちらのメソッドの使用を推奨します。
        /// ただし、数百km以上であればその5またはその6の使用を推奨します。
        /// <para>なお、高度は無視して楕円体面上での距離を求めています。</para>
        /// </para>
        /// </summary>
        /// <param name="pos">求めたい地点の座標</param>
        /// <returns>距離</returns>
        public double GetDistance2(Blh pos)
        {
            Ecef me = this.ToXYZ();
            Ecef he = pos.ToXYZ();
            GlobalDatum _datum = new GlobalDatum(this.DatumKind);

            double d_straight = Math.Sqrt(Math.Pow(me.x - he.x, 2.0) + Math.Pow(me.y - he.y, 2.0) + Math.Pow(me.z - he.z, 2.0));   // XYZ直交座標系を用いた直線距離(線は地中に潜る)
            double Nme = _datum.a / Math.Sqrt(1.0d - _datum.e2 * Math.Sin(this.ToRadian().B));
            double Nse = _datum.a / Math.Sqrt(1.0d - _datum.e2 * Math.Sin(pos.ToRadian().B));
            double N = (Nse + Nme) / 2.0d;                                                         // 平均の半径のようなもの
            double angle = Math.Asin(d_straight / 2.0d / N);                                       // 半射程角(絵を描けば分かる)
            return 2.0d * angle * N;
        }