计算c#中两点之间的距离 [英] calculating distance between two points in c#

查看:302
本文介绍了计算c#中两点之间的距离的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了这个代码,它取得了两个不同位置的经度和纬度,并计算了它们之间的距离。
我的代码是

  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.please help

解决方案

好吧,因为我带着你以前的回答带你走上了花园之路,我移植了

 这个给你一个算法:

> 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; //以公里为单位的地球半径
var dLat = Deg2Rad(lat2 - lat1); // deg2rad低于
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; //以公里为单位的距离
返回d;
}

double Deg2Rad(double deg){
return deg *(Math.PI / 180d);

当您提供固定值时,您的计算似乎正常工作: / p>

  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)


i used this code which takes longitude and latitude of two different location and calculates the distance between them my code is

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.######");  
}

but for all the input values the result i am getting is NaN.please help me.

解决方案

Ok, because I led you up the garden path with my previous answer, I ported this to give you an algorithm that works:

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);
}

Your calculation appears to work correctly when you supply fixed values:

var lat1 = 0d;
var lon1 = 52d;
var lat2 = 0d;
var lon2 = -52d;

which rather implies that these conversions are failing:

double lat1 = Convert.ToDouble(TextBox1.Text);
double lon1 = Convert.ToDouble(TextBox2.Text);
double lat2 = Convert.ToDouble(TextBox3.Text);
double lon2 = Convert.ToDouble(TextBox4.Text);

If you're still having trouble, place a breakpoint on these lines and take a look at the values of TextBox1.Text etc.

For more predictable parsing of floating point numbers, it's best to supply culture information:

Convert.ToDouble("1.2", System.Globalization.CultureInfo.InvariantCulture)

这篇关于计算c#中两点之间的距离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆