C# 计算c中两点之间的距离#
我使用了这个代码,它获取两个不同位置的经度和纬度,并计算它们之间的距离 我的代码是C# 计算c中两点之间的距离#,c#,google-maps,latitude-longitude,C#,Google Maps,Latitude Longitude,我使用了这个代码,它获取两个不同位置的经度和纬度,并计算它们之间的距离 我的代码是 protected void Button1_Click(object sender, EventArgs e) { double lat1= Convert.ToDouble(TextBox1.Text); double lon1= Convert.ToDouble(TextBox2.Text); double lat2= Convert.ToDouble(TextBox3.Text);
protected void Button1_Click(object sender, EventArgs e)
{
double lat1= Convert.ToDouble(TextBox1.Text);
double lon1= Convert.ToDouble(TextBox2.Text);
double lat2= Convert.ToDouble(TextBox3.Text);
double lon2= Convert.ToDouble(TextBox4.Text);
var rlat1 = Math.PI * lat1/180;
var rlat2 = Math.PI * lat2/180;
var rlon1 = Math.PI * lon1/180;
var rlon2 = Math.PI * lon2 / 180;
var theta = lon1-lon2;
var rtheta = Math.PI * theta/180;
var dist = Math.Sign(rlat1) * Math.Sign(rlat2) + Math.Cos(rlat1) * Math.Cos(rlat2) * Math.Cos(rtheta);
dist = Math.Acos(dist);
dist = dist * 180/Math.PI;
dist = dist * 60 * 1.1515;
dist = dist * 1.609344 ;
TextBox5.Text = dist.ToString("0.######");
}
但是对于所有的输入值,我得到的结果是NaN。请帮帮我。好的,因为我用我的上一个答案引导您进入花园路径,我移植给您一个有效的算法:
void Main()
{
double lat1=12.916933d,
lon1=77.562658d,
lat2=12.930140d,
lon2=77.587732d;
double dist = GetDistanceFromLatLonInKm(lat1, lon1, lat2, lon2);
// dist == 3.08890370651166 yay!
}
double GetDistanceFromLatLonInKm(double lat1,
double lon1,
double lat2,
double lon2) {
var R = 6371d; // Radius of the earth in km
var dLat = Deg2Rad(lat2 - lat1); // deg2rad below
var dLon = Deg2Rad(lon2 - lon1);
var a =
Math.Sin(dLat / 2d) * Math.Sin(dLat / 2d) +
Math.Cos(Deg2Rad(lat1)) * Math.Cos(Deg2Rad(lat2)) *
Math.Sin(dLon / 2d) * Math.Sin(dLon / 2d);
var c = 2d * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1d - a));
var d = R * c; // Distance in km
return d;
}
double Deg2Rad(double deg) {
return deg * (Math.PI / 180d);
}
当您提供固定值时,您的计算似乎工作正常:
var lat1 = 0d;
var lon1 = 52d;
var lat2 = 0d;
var lon2 = -52d;
这意味着这些转换失败:
double lat1 = Convert.ToDouble(TextBox1.Text);
double lon1 = Convert.ToDouble(TextBox2.Text);
double lat2 = Convert.ToDouble(TextBox3.Text);
double lon2 = Convert.ToDouble(TextBox4.Text);
如果仍有问题,请在这些行上放置一个断点,然后查看TextBox1.Text
等的值
对于更可预测的浮点数解析,最好提供区域性信息:
Convert.ToDouble("1.2", System.Globalization.CultureInfo.InvariantCulture)
检查十进制分隔符是否有效。它必须是逗号或点,这取决于您的区域设置。您可以向问题添加一些示例输入吗?这应该可以提供解决方案。我不确定我们是否比你更适合做这件事?对于任何坐标,它都会给出相同的答案。最好看看这个问题,可能有很多原因。通常情况下,当输入不在功能范围内时,即Acos具有域−1.≤ x≤ 1.或者,即使结果是想象中的数字,但如果我想从textboxi中获取这些值…lat1=12.916933 long1=77.562658,lat2=12.930140,long2=77.587732,该怎么办?这些都是有效值,对吗?那我为什么会得到Nan?@user2775241:看起来你的算法确实有问题。你的答案是可以的,但我直到最近才有足够的分数对它发表评论,所以我创建了另一个。:)