/// <summary> /// 楕円体に沿った、東西方向の単位長[m/deg]を返す /// <para>実際は高度の分だけ若干の誤差が発生するし、2地点の高度差は考慮しない。</para> /// <para>参考:理科年表,p.563,2003.</para> /// <para>ちなみに、http://yamadarake.web.fc2.com/trdi/2009/report000001.html を見ると使用した公式がヒュベニの公式と言うものであることが分かる</para> /// </summary> /// <returns>楕円体に沿った、東西方向の単位長[m/deg]</returns> public Length GetUnitLengthForEN() { Length ans = new Length(0, 0); Blh temp = this.ToRadian(); GlobalDatum _datum = new GlobalDatum(this.DatumKind); ans.E = Math.PI / 180.0 * _datum.a * Math.Cos(temp.B) / Math.Sqrt(1.0d - _datum.e2 * Math.Pow(Math.Sin(temp.B), 2.0d)); // 高度については無視 ans.N = Math.PI / 180.0 * _datum.a * (1.0d - _datum.e2) / Math.Pow(1.0d - _datum.e2 * Math.Pow(Math.Sin(temp.B), 2.0d), 1.5d); // 地表面に限れば誤差は無視可能。誤差は、地上では最大6408/6400程度 return ans; }
/// <summary> /// 距離演算その1 /// <para>ヒュベニの公式を利用して、引数で指定された座標までの距離[m]を返します。</para> /// <para>GetDistance2()と比較して、40 km差で0.01 m以下の差が生じます。</para> /// <para>最短距離を求めているわけではないことに注意してください。</para> /// <para>なお、高度は無視して楕円体面上での距離を求めています。</para> /// </summary> /// <param name="pos">求めたい地点の座標</param> /// <returns>南北・東西方向の距離[m]を構造体で返す</returns> public Length GetDistance(Blh pos) { Length ans; Blh me = this.ToDegree(); // 自身のコピー Blh he = pos.ToDegree(); // 引数のコピー。単位はdegに統一する Field.RectangleField field = new Field.RectangleField(me, he); Blh center = field.Center; ans = new Length(field.DifferInLon * center.GetUnitLengthForEN().E, field.DifferInLat * center.GetUnitLengthForEN().N); // 緯度・経度差から距離を求める。 return ans; }