using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Infrastructure.Service.Helper { public class CalculatedDistance { private static double HaverSin(double theta) { var v = Math.Sin(theta / 2); return v * v; } static double EARTH_RADIUS = 6371.0;//km 地球半径 平均值,千米 /// /// 给定的经度1,纬度1;经度2,纬度2. 计算2个经纬度之间的距离。 /// /// 经度1 /// 纬度1 /// 经度2 /// 纬度2 /// 距离(公里、千米) public static int Distance(double lat1, double lon1, double lat2, double lon2) { //用haversine公式计算球面两点间的距离。 //经纬度转换成弧度 lat1 = ConvertDegreesToRadians(lat1); lon1 = ConvertDegreesToRadians(lon1); lat2 = ConvertDegreesToRadians(lat2); lon2 = ConvertDegreesToRadians(lon2); //差值 var vLon = Math.Abs(lon1 - lon2); var vLat = Math.Abs(lat1 - lat2); //h is the great circle distance in radians, great circle就是一个球体上的切面,它的圆心即是球心的一个周长最大的圆。 var h = HaverSin(vLat) + Math.Cos(lat1) * Math.Cos(lat2) * HaverSin(vLon); var distance = (int)((2 * EARTH_RADIUS * Math.Asin(Math.Sqrt(h))) * 1000); return distance; } /// /// 将角度换算为弧度。 /// /// 角度 /// 弧度 private static double ConvertDegreesToRadians(double degrees) { return degrees * Math.PI / 180; } private static double ConvertRadiansToDegrees(double radian) { return radian * 180.0 / Math.PI; } } }