예제 #1
0
 /// <summary>
 /// 経緯度の位置 a, b の惑星を楕円体近似した場合の距離が
 /// 許容範囲 tolerance 以下か判定
 /// </summary>
 /// <param name="a">経緯度の位置1つめ</param>
 /// <param name="b">経緯度の位置2つめ</param>
 /// <param name="tolerance">許容範囲</param>
 /// <param name="llda">経緯度の距離を計算するアルゴリズム</param>
 /// <param name="planet">楕円体近似した惑星の形状定義; null の場合は <see cref="GeometricalSpecification.Earth_WGS84"/> が採用されます </param>
 /// <returns>許容範囲以下なら true</returns>
 public static bool NearlyEqualsTo
     (this ILonLatGettable a
     , ILonLatGettable b
     , Length tolerance                         = null
     , LonLatDistanceAlgorithm llda             = LonLatDistanceAlgorithm.Haversine
     , IGeometricalSpecificationGettable planet = null
     )
 {
     return(a.DistanceTo(b, llda, planet) <= (tolerance ?? Length.Meter));
 }
예제 #2
0
        /// <summary>
        /// 経緯度の位置 a と b の緯度方向の距離を計算する
        /// </summary>
        /// <param name="a">経緯度の位置1つめ</param>
        /// <param name="b">経緯度の位置2つめ</param>
        /// <param name="llda">経緯度の距離を計算するアルゴリズム</param>
        /// <param name="planet">楕円体近似した惑星の形状定義; null の場合は <see cref="GeometricalSpecification.Earth_WGS84"/> が採用されます </param>
        /// <returns>緯度方向の距離</returns>
        public static Length LatitudeDistanceTo
            (this ILonLatGettable a
            , ILonLatGettable b
            , LonLatDistanceAlgorithm llda             = LonLatDistanceAlgorithm.Haversine
            , IGeometricalSpecificationGettable planet = null
            )
        {
            var aa = new LonLat(PlaneAngle.Zero, a.Latitude);
            var bb = new LonLat(PlaneAngle.Zero, b.Latitude);

            return(aa.DistanceTo(bb, llda, planet));
        }
예제 #3
0
        /// <summary>
        /// 経緯度の位置 a と b の中間の緯度における経度方向の距離を計算する
        /// </summary>
        /// <param name="a">経緯度の位置1つめ</param>
        /// <param name="b">経緯度の位置2つめ</param>
        /// <param name="llda">経緯度の距離を計算するアルゴリズム</param>
        /// <param name="planet">楕円体近似した惑星の形状定義; null の場合は <see cref="GeometricalSpecification.Earth_WGS84"/> が採用されます </param>
        /// <returns>経度方向の距離</returns>
        public static Length LongitudeDistanceTo
            (this ILonLatGettable a
            , ILonLatGettable b
            , LonLatDistanceAlgorithm llda             = LonLatDistanceAlgorithm.Haversine
            , IGeometricalSpecificationGettable planet = null
            )
        {
            var alat = (a.Latitude + b.Latitude) / 2.0;
            var aa   = new LonLat(a.Longitude, alat);
            var bb   = new LonLat(b.Longitude, alat);

            return(aa.DistanceTo(bb, llda, planet));
        }
예제 #4
0
        /// <summary>
        /// 2つの経緯度 a, b について、
        /// 楕円体近似した惑星の形状定義 planet 上における
        /// 惑星表面上の地点間の距離を長さ次元で計算します
        /// </summary>
        /// <param name="a">経緯度の位置1つめ</param>
        /// <param name="b">経緯度の位置2つめ</param>
        /// <param name="llda">経緯度の距離を計算するアルゴリズム</param>
        /// <param name="planet">楕円体近似した惑星の形状定義; null の場合は <see cref="GeometricalSpecification.Earth_WGS84"/> が採用されます </param>
        /// <returns>距離</returns>
        public static Length DistanceTo
            (this ILonLatGettable a
            , ILonLatGettable b
            , LonLatDistanceAlgorithm llda             = LonLatDistanceAlgorithm.Haversine
            , IGeometricalSpecificationGettable planet = null
            )
        {
            planet = planet ?? GeometricalSpecification.Earth_WGS84;

            switch (llda)
            {
            case LonLatDistanceAlgorithm.Haversine:
                return(a.DistanceToHaversine(b, planet));

            case LonLatDistanceAlgorithm.Vincenty:
                return(a.DistanceToVincenty(b, planet));

            default:
                throw new NotImplementedException();
            }
        }