經緯度計算距離


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HarvenSin
{
class Program
{
/// <summary>
/// 根據經緯度,計算2個點之間的距離。
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//39.94607,116.32793 31.24063,121.42575
Console.WriteLine(Distance(39.94607, 116.32793, 31.24063, 121.42575));

}


public static double HaverSin(double theta)
{
var v = Math.Sin(theta / 2);
return v * v;
}


static double EARTH_RADIUS = 6371.0;//km 地球半徑 平均值,千米

/// <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>
public static double 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 = 2 * EARTH_RADIUS * Math.Asin(Math.Sqrt(h));

return distance;
}

/// <summary>
/// 將角度換算為弧度。
/// </summary>
/// <param name="degrees">角度</param>
/// <returns>弧度</returns>
public static double ConvertDegreesToRadians(double degrees)
{
return degrees * Math.PI / 180;
}

public static double ConvertRadiansToDegrees(double radian)
{
return radian * 180.0 / Math.PI;
}

}
}

引用

https://www.cnblogs.com/zhoug2020/p/8993750.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM