缩短此代码,确定C#中两个纬度/长度之间的距离?

时间:2010-10-06 23:04:02

标签: c# geospatial

public static double Distance(LatLong from, LatLong to)
{
    double lat1 = from.Latitude * (Math.PI / 180.0);
    double lat2 = to.Latitude * (Math.PI / 180.0);

    return
        Math.Acos((Math.Sin(lat1) * Math.Sin(lat2)) +
        (Math.Cos(lat1) * Math.Cos(lat2) *
        Math.Cos((Math.PI / 180.0) * (to.Longitude - from.Longitude)))) * 3958.760;
}

你可以缩短这段代码吗?我只是想知道......

3 个答案:

答案 0 :(得分:3)

这是余弦公式的标准球面定律。你不会比这更简单。充其量,您可以稍微清理一下代码:

public static double Distance(LatLong from, LatLong to)
{
    double deg = Math.PI / 180.0;       // One degree in radians
    double lat1 = from.Latitude * deg;
    double lat2 = to.Latitude * deg;
    double dLng = (to.Longitude - from.Longitude) * deg;
    double R = 3958.760;

    return Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) +
                     Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(dLng)) * R;
}

答案 1 :(得分:1)

不,但我可以提供更短,更快的方式,但获得相对距离的准确方法要差得多:

public static double RelativeDistance(LatLong from, LatLong to)
{
  return (from.Latitude - to.Latitude) * (from.Latitude - to.Latitude) + (from.Longitude - to.Longitude) * (from.Longitude - to.Longitude);
}

根据坐标投影到方形2D网格(就像世界是2:1矩形一样),返回相对于距离平方的值。它对于真正的距离是如此无用,我甚至懒得拿一个平方根使其恢复到与投影成比例(因为投影是愚蠢的),但它可以服务的是通过这样的相对距离快速排序一小块区域(距离两极足够远),严重不准确无关紧要。

因此,它无法帮助您计算燃油成本,但它可以帮助您确定哪个酒吧(可能)最近。如果你想按给定点的相对距离排序,它可以很好地服务,它的速度是一个福音。除此之外,它毫无意义。

答案 2 :(得分:0)

该公式看起来像计算沿着球体表面的距离,因此即使对于实际上位于世界相对侧的点也是合理准确的。如果距离非常接近,你可以通过将点投射到通过其中一个点的圆柱体(与地球同轴)的表面上来近似它;缩放圆柱体,使圆柱体的北/南和东/西距离与地球上的距离相匹配。这只需要取其中一个纬度的余弦。请注意,如果这些点相距足够远以至于您使用哪个点的纬度很重要,那么它们相距太远就不能得到很好的近似值,但对于小距离来说,这种方法快速而简单。

请注意,顺便说一下,像锥形投影这样的东西在更远的距离上是准确的,但也需要更多的计算;如果一个人遇到那么多麻烦,也可以使用“正确”的计算。