以千米为单位计算纬度和经度
Compute Latitude and Longitude to Kilometer
我正在尝试使用纬度和经度
计算从目的地1到目的地2的公里距离
目的地 1(宿雾市 PH) 纬度:1017.8590 经度:12353.4304
Destination2(Talisay PH) 纬度:1015.6445 经度:12350.0404
我的输出是:299.28607720457882 KM
代码:
double lat1 = Convert.ToDouble(txtLat1.Text.ToString());
double lat2 = Convert.ToDouble(txtLat2.Text.ToString());
double lon1 = Convert.ToDouble(txtLong1.Text.ToString());
double lon2 = Convert.ToDouble(txtLong2.Text.ToString());
var R = 6378.137; // Radius of earth in KM
var dLat = (lat2 - lat1) * Math.PI / 180;
var dLon = (lon2 - lon1) * Math.PI / 180;
var a =
Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(lat1 * Math.PI / 180) * Math.Cos(lat2 * Math.PI / 180) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
string x = (R * c).ToString();
var d = (R * c);
我尝试使用 http://www.entfernungsrechner.net/en/distance/city/1717512/city/1683881 这个网站来计算该目的地的公里数,输出结果是 12.2 公里
嗯,对于初学者来说,它说的是 12.2KM,因为你会开车。这与上面的 Haversine 公式的输出不同。
您应该尝试将小数点放在正确的位置。我得到一个更合理的结果 4.45 公里。
https://dotnetfiddle.net/cs5Ppq
public class Program
{
public static void Main()
{
double lat1 = 10.178590;
double lat2 = 10.156445;
double lon1 = 123.500404;
double lon2 = 123.534304;
var R = 6378.137; // Radius of earth in KM
var dLat = (lat2 - lat1) * Math.PI / 180;
var dLon = (lon2 - lon1) * Math.PI / 180;
var a =
Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(lat1 * Math.PI / 180) * Math.Cos(lat2 * Math.PI / 180) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
string x = (R * c).ToString();
var d = (R * c);
Console.WriteLine(d);
}
}
注意:您可以对照此 http://andrew.hedges.name/experiments/haversine/ 工具检查您的结果
编辑:如果您想要最准确的数字,因为 Haversine 公式可能低估和高估地球上极端的距离,您需要使用 Vincety 解决方案。这不适合心脏虚弱的人:
http://www.movable-type.co.uk/scripts/latlong-vincenty.html
我正在尝试使用纬度和经度
计算从目的地1到目的地2的公里距离目的地 1(宿雾市 PH) 纬度:1017.8590 经度:12353.4304
Destination2(Talisay PH) 纬度:1015.6445 经度:12350.0404
我的输出是:299.28607720457882 KM
代码:
double lat1 = Convert.ToDouble(txtLat1.Text.ToString());
double lat2 = Convert.ToDouble(txtLat2.Text.ToString());
double lon1 = Convert.ToDouble(txtLong1.Text.ToString());
double lon2 = Convert.ToDouble(txtLong2.Text.ToString());
var R = 6378.137; // Radius of earth in KM
var dLat = (lat2 - lat1) * Math.PI / 180;
var dLon = (lon2 - lon1) * Math.PI / 180;
var a =
Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(lat1 * Math.PI / 180) * Math.Cos(lat2 * Math.PI / 180) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
string x = (R * c).ToString();
var d = (R * c);
我尝试使用 http://www.entfernungsrechner.net/en/distance/city/1717512/city/1683881 这个网站来计算该目的地的公里数,输出结果是 12.2 公里
嗯,对于初学者来说,它说的是 12.2KM,因为你会开车。这与上面的 Haversine 公式的输出不同。
您应该尝试将小数点放在正确的位置。我得到一个更合理的结果 4.45 公里。
https://dotnetfiddle.net/cs5Ppq
public class Program
{
public static void Main()
{
double lat1 = 10.178590;
double lat2 = 10.156445;
double lon1 = 123.500404;
double lon2 = 123.534304;
var R = 6378.137; // Radius of earth in KM
var dLat = (lat2 - lat1) * Math.PI / 180;
var dLon = (lon2 - lon1) * Math.PI / 180;
var a =
Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(lat1 * Math.PI / 180) * Math.Cos(lat2 * Math.PI / 180) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
string x = (R * c).ToString();
var d = (R * c);
Console.WriteLine(d);
}
}
注意:您可以对照此 http://andrew.hedges.name/experiments/haversine/ 工具检查您的结果
编辑:如果您想要最准确的数字,因为 Haversine 公式可能低估和高估地球上极端的距离,您需要使用 Vincety 解决方案。这不适合心脏虚弱的人: http://www.movable-type.co.uk/scripts/latlong-vincenty.html