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