C# 如何确定两组纬度/经度坐标之间的距离?

C# 如何确定两组纬度/经度坐标之间的距离?,c#,distance,latitude-longitude,C#,Distance,Latitude Longitude,我正试图写一些东西来确定两组lat/lon坐标之间的距离 我正在使用我在上找到的以下代码: 我的问题是,我遇到了编译错误“当前上下文中不存在名称‘toRadians’/‘cos’/‘sin/‘toDegrees’”。我做错了什么?您可以编写如下函数: double ToRadians(double degrees) { return degrees * Math.PI / 180; } double ToDegrees(double radians) { return radians * 18

我正试图写一些东西来确定两组lat/lon坐标之间的距离

我正在使用我在上找到的以下代码:


我的问题是,我遇到了编译错误“当前上下文中不存在名称‘toRadians’/‘cos’/‘sin/‘toDegrees’”。我做错了什么?

您可以编写如下函数:

double ToRadians(double degrees) { return degrees * Math.PI / 180; }
double ToDegrees(double radians) { return radians * 180 / Math.PI; }
double lat1Radians = toRadians(lat1);
您可以编写一个
toDegrees
函数,如下所示:

double ToRadians(double degrees) { return degrees * Math.PI / 180; }
double ToDegrees(double radians) { return radians * 180 / Math.PI; }
double lat1Radians = toRadians(lat1);
您应该将
sin
cos
替换为
Math.sin
Math.cos
这看起来像是C

首先,您需要定义
toRadians
toDegrees

double toRadians(double degrees) {
    double sign = Math.Sign(degrees);
    while(Math.Abs(degrees) > 360) {
        degrees -= sign * 360;
    }
    return Math.PI * degrees / 180;
}

double toDegrees(double radians) {
    double sign = Math.Sign(radians);
    while(Math.Abs(radians) > 2 * Math.PI) {
        radians -= sign * 2 * Math.PI;
    }
    return 180 * radians / Math.PI;
}
然后,要使用三角函数,需要使用
Math.Sin
Math.Cos

double dist = Math.Sin(lat1) * Math.Sin(lat2)
                + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);

评论:

public static double distance (double lat1, double lon1, double lat2, double lon2) { 
double lat1 = Convert.ToDouble(latitude);
double lon1 = Convert.ToDouble(longitude);
double lat2 = Convert.ToDouble(destlat);
double lon2 = Convert.ToDouble(destlon);
这是什么?在哪里定义了
纬度
经度
destlat
destlon
?此外,您似乎将
lat1
lon1
lat2
lon2
作为此方法的参数,因此您不能在此处使用相同的名称定义局部变量

double theta = toRadians(lon1-lon2); 
lat1 = toRadians(lat1); 
lon1 = toRadians(lon1); 
lat2 = toRadians(lat2); 
lon2 = toRadians(lon2); 
这是不好的风格。如果
lat1
表示纬度(以度为单位),则最好计算
lat1
的弧度等效值,如下所示:

double ToRadians(double degrees) { return degrees * Math.PI / 180; }
double ToDegrees(double radians) { return radians * 180 / Math.PI; }
double lat1Radians = toRadians(lat1);
因此,将上述内容替换为:

double theta = toRadians(lon1-lon2); 
double lat1Radians = toRadians(lat1); 
double lon1Radians = toRadians(lon1); 
double lat2Radians = toRadians(lat2); 
double lon2Radians = toRadians(lon2);
最后:

double dist = sin(lat1) * sin(lat2)
                + cos(lat1) * cos(lat2) * cos(theta); 
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 
这种款式也不好。第一个公式和第二个公式不可能同时表示要计算的距离。您应该将第一个公式的结果分配给一个名称更有意义的变量。在最坏的情况下,至少要执行以下操作:

double temp = Math.Sin(lat1) * Math.Sin(lat2)
                + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);
double dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

return dist;

您需要稍微修改一下这段代码

正如SLaks所说,您需要定义自己的
toRadians()
方法,因为.NET没有本机版本


您还需要将对cos()和sin()的调用更改为:Math.cos()和Math.sin()

您可能需要使用以下C类:

用法:

// Calculate Distance in Miles
GeoCodeCalc.CalcDistance(47.8131545175277, -122.783203125, 42.0982224111897, -87.890625);

// Calculate Distance in Kilometers
GeoCodeCalc.CalcDistance(47.8131545175277, -122.783203125, 42.0982224111897, -87.890625, GeoCodeCalcMeasurement.Kilometers);

来源:

我知道这个问题很老了,但如果其他人偶然发现这个问题,请使用
系统中的设备

var distanceInMeters = new GeoCoordinate(lat1, lon1)
    .GetDistanceTo(new GeoCoordinate(lat2, lon2));

正在计算经纬度点之间的距离

双纬度1=转换为双纬度


你为什么要在
双精度
上调用
Convert.ToDouble
?@SLaks:同意,刚才注意到了
Convert.ToDouble
。如果你给我们找到此代码的链接,会更容易帮助你。是的,C#好的,我将链接编辑到了问题中。您可能不需要将其限制在小于2π的范围内。几乎肯定不需要执行换行操作——纬度和经度往往有合适的范围=)@Jason,您可以使用
double deg=180*弧度/Mapth.Pi;返回(度%360)+(度-数学截断(度))
@SLaks我相信他想做一个通用函数。现在我得到的“System.Math”不包含“Pi”的定义。如果你经常调用这个函数,如果你的代码运行缓慢,请为Pi/180和180/Pi创建两个常量。