From 93ace6de7ae2b7e2c411b3775334edc1e9b7e752 Mon Sep 17 00:00:00 2001 From: xiaoyutab Date: Wed, 28 Jun 2023 13:52:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=8F=E7=BA=AC=E5=BA=A6?= =?UTF-8?q?=E4=B8=A4=E7=82=B9=E4=B9=8B=E9=97=B4=E7=9A=84=E8=B7=9D=E7=A6=BB?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- is_equal.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/is_equal.go b/is_equal.go index b197b84..eb9cdb0 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 +} -- Gitee