【问题标题】:calculating distance between two points in c#在c#中计算两点之间的距离
【发布时间】:2014-05-06 05:30:41
【问题描述】:

我使用此代码获取两个不同位置的经度和纬度并计算它们之间的距离 我的代码是

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。请帮助我。

【问题讨论】:

  • 你能在问题中添加一些示例输入吗
  • 调试这应该提供解决方案。我不确定是否比你更适合做这件事?
  • 对于任何坐标它给出相同的答案
  • 最好看看这个问题what does NaN mean for doubles in C#?
  • 可能有很多原因。通常会发生这种情况,例如输入不在函数的域中,即 Acos 的域 -1 ≤ x ≤ 1。甚至结果数是虚数

标签: c# google-maps latitude-longitude


【解决方案1】:

好的,因为我用我之前的回答引导你走上花园小路,所以我移植了this 给你一个有效的算法:

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)

【讨论】:

  • 但是如果我想从文本框中取值怎么办
  • 我提供了这些值...lat1=12.916933 long1=77.562658,lat2=12.930140,long2=77.587732.这些都是有效值对吧?那我为什么要得到楠?
  • @user2775241:看起来你的算法确实有问题。
【解决方案2】:

检查十进制分隔符是否有效。它必须是逗号或点,具体取决于您的区域设置。

【讨论】:

  • 您的答案还可以,但直到最近我还没有足够的分数来评论它,所以我创建了另一个。 :)
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2011-04-23
  • 2014-11-14
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多