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