地球是一個近乎標准的橢球體,它的赤道半徑為6378.140千米,極半徑為 6356.755千米,平均半徑6371.004千米。

/// <summary> /// 給定的經度1,緯度1;經度2,緯度2. 計算2個經緯度之間的距離。 /// </summary> /// <param name="lat1">緯度1</param> /// <param name="lon1">經度1</param> /// <param name="lat2">緯度2</param> /// <param name="lon2">經度2</param> /// <returns>距離(公里、千米)</returns> private double Distance(double lat1, double lon1, double lat2, double lon2) { double EARTH_RADIUS = 6371.0; //用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 = 2 * EARTH_RADIUS * Math.Asin(Math.Sqrt(h)); return distance; } /// <summary> /// 將角度換算為弧度。 /// </summary> /// <param name="degrees">角度</param> /// <returns>弧度</returns> private double ConvertDegreesToRadians(double degrees) { return degrees * Math.PI / 180; } /// <summary> /// 將弧度換算為角度。 /// </summary> /// <param name="radian"></param> /// <returns></returns> private double ConvertRadiansToDegrees(double radian) { return radian * 180.0 / Math.PI; } /// <summary> /// HaverSin /// </summary> /// <param name="theta"></param> /// <returns></returns> private double HaverSin(double theta) { var v = Math.Sin(theta / 2); return v * v; }
在線計算經緯度距離工具 http://www.gpsspg.com/distance.htm