簡體   English   中英

縮短此代碼,確定C#中兩個緯度/長度之間的距離?

[英]Shorten this code that determines distance between two lat/longs in C#?

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

你可以縮短這段代碼嗎? 我是在想 ...

這是余弦公式的標准球面定律。 你不會比這更簡單。 充其量,您可以稍微清理一下代碼:

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

不,但我可以提供更短,更快的方式,但獲得相對距離的准確方法要差得多:

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的矩形)。 它對於真正的距離是如此無用,我甚至懶得拿一個平方根使其恢復到與投影成比例(因為投影是愚蠢的),但它可以服務的是通過這樣的相對距離快速排序一個小區域(遠離兩極),嚴重不准確無關緊要。

因此,它不會幫助您計算您的燃料成本,但它將幫助您確定哪個酒吧(可能)最近。 如果你想按給定點的相對距離排序,它可以很好地服務,它的速度是一個福音。 除此之外,它毫無意義。

該公式看起來像計算沿着球體表面的距離,因此即使對於實際上位於世界相對側的點也是合理准確的。 如果距離非常接近,你可以通過將點投射到通過其中一個點的圓柱體(與地球同軸)的表面上來近似它; 縮放圓柱體,使圓柱體的北/南和東/西距離與地球上的距離相匹配。 這只需要取其中一個緯度的余弦。 請注意,如果這些點相距足夠遠以至於您使用哪個點的緯度很重要,那么它們距離太近以至於不能很好地近似,但對於小距離,這種方法快速而簡單。

請注意,順便說一下,像錐形投影這樣的東西在更遠的距離上是准確的,但也需要更多的計算; 如果一個人遇到那么多麻煩,也可以使用“正確”的計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM