diff --git a/is_equal.go b/is_equal.go index b197b84d2f20537927be208951f0c73235242b8e..eb9cdb0772d853c2844e3e78aa3082e5625a63c6 100644 --- a/is_equal.go +++ b/is_equal.go @@ -1,5 +1,7 @@ package xgotool +import "math" + // 浮点数比较相等时的最小值 // // 因为浮点数的精度存在丢失问题,所以浮点数的相同不能比较绝对的相等,而应该是在某一范围内相同 @@ -7,6 +9,10 @@ package xgotool // 所以此处的相同浮点数范围表示为 0.000,000,1 const FLOAT_EQUAL_MIN = 0.0000001 +// 地球半径大小 +// 用于计算两个经纬度间的距离 +const EARTH_RADIUS = 6378.137 + // 判断两个浮点数是否相等 // // f1 待比较的浮点数 @@ -30,3 +36,21 @@ func IsEqualFloat32(f1, f2 float32) bool { return f2-f1 < FLOAT_EQUAL_MIN } } + +// 计算经纬度之间的距离 +// 计算公式:C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180) +// +// lat1 坐标点1的纬度 +// lng1 坐标点1的经度 +// lat1 坐标点2的纬度 +// lng2 坐标点2的经度 +func EarthDistance(lat1, lng1, lat2, lng2 float64) float64 { + rad := math.Pi / 180 + lat1 = lat1 * rad + lng1 = lng1 * rad + lat2 = lat2 * rad + lng2 = lng2 * rad + theta := lng2 - lng1 + dist := math.Acos(math.Sin(lat1)*math.Sin(lat2) + math.Cos(lat1)*math.Cos(lat2)*math.Cos(theta)) + return dist * EARTH_RADIUS +}