2014-03-27 137 views
5

我正在嘗試整理一個方法來計算c#中2個點之間的距離。c中計算2點之間的距離#

這是我一直在嘗試的代碼,但我擔心我得到的答案不正確。

static void Main() 
    { 
     //postcode australia 2600 -> 3000 
     float latA = -31.997976f; 
     float longA = 115.762877f; 
     float latB = -31.99212f; 
     float longB = 115.763228f; 
     decimal distance = (DistanceBetween(latA, latB, longA, longB)); 
     Console.WriteLine("Distance is" + distance); 
     Console.ReadLine(); 
    } 

    static decimal DistanceBetween(float latA, float longA, float latB, float longB) 
    { 
     var RadianLatA = Math.PI * latA/180; 
     var RadianLatb = Math.PI * latB/180; 
     var RadianLongA = Math.PI * longA/180; 
     var RadianLongB = Math.PI * longB/180; 

     double theDistance = (Math.Sin(RadianLatA)) * 
       Math.Sin(RadianLatb) + 
       Math.Cos(RadianLatA) * 
       Math.Cos(RadianLatb) * 
       Math.Cos(RadianLongA - RadianLongB); 

     return Convert.ToDecimal(((Math.Acos(theDistance) * (180.0/Math.PI)))) * 69.09M * 1.6093M; 
    } 

這是從本網站這裏 Distance between addresses

上什麼錯誤/

感謝 瑞安

任何想法找到了應對調整
+0

http://www.movable-type.co.uk/scripts/latlong.html本網站總是幫我出兩點之間計算距離。 – woutervs

+0

謝謝,很好的鏈接。我把這個放在一個asp.net應用程序來計算郵政編碼之間的距離,所以我需要得到這個代碼的權利! – user1672867

+0

我的第一個猜測是你的三元數轉換中的一個標誌問題。拉起wolframalpha或一個計算器,瀏覽代碼並查看每個''Math.Sin'''(或其他trig函數)的結果,並查看結果是否匹配。 從度數轉換爲弧度時,還必須考慮在trig函數中使用的符號 –

回答

11

我通常使用的類是GeoCoordinate

double latA = -31.997976f; 
double longA = 115.762877f; 
double latB = -31.99212f; 
double longB = 115.763228f; 

var locA = new GeoCoordinate(latA, longA); 
var locB = new GeoCoordinate(latB, longB); 
double distance = locA.GetDistanceTo(locB); // metres 
+0

我昨天試過了,但如果我曾經在「using System」中寫過。 Device.Location「出現錯誤。我必須在這個課程中添加一些手冊嗎? – user1672867

+1

你需要添加一個項目引用System.Device dll,它不包括默認 – Liath

+0

Thankyou這麼多。我現在會這樣做:) – user1672867

-4

距離公式:鑑於兩分(x1,y1)和(x2,y2),這些點之間的距離由下式給出:

enter image description here

使用它相應

+1

這將是在一個平坦的表面上,而不是在地球儀上:) – woutervs

+0

試試這個鏈接希望它有助於..其他http:// www。 calculatorsoup.com/calculators/geometry-solids/distance-two-points.php – suku

+0

仍然不適合球面計算... – woutervs

3
double lat1 = //input; 
double lat2 = //input; 
var R = 6371; 
var dLat = (lat2-lat1).ToRad(); 
var dLon = (lon2-lon1).ToRad(); 
lat1 = lat1.ToRad(); 
lat2 = lat2.ToRad(); 
var a = Math.Pow(Math.Sin(dLat/2),2) + (Math.Pow(Math.Sin(dLon/2),2) * Math.Cos(lat1)*Math.Cos(lat2)); 
var c = 2* Math.Atan2(Math.Sqrt(a), Math.Sqrt(1-a)); 
var distance = R*c; 

public double ToRad(this double degs) { 
    return degs * (Math.PI/180.0); 
} 

輸入所需的雙打。

這是半正規公式,它用來計算我們地球上兩點之間的距離。這是一條直線上的距離,如果您需要路徑上的距離,則必須找到該路徑上的所有點,然後計算每兩個點之間的距離,然後計算其總和。

+0

編輯我的答案。 – woutervs

+0

謝謝我現在就給這個:) – user1672867

+1

由於你是一個新用戶,不要忘記把upvote/mark作爲答案,它的答案是有用的。 – woutervs

2

您可以使用DbGeography進行空間計算。它有DbGeography.Distance方法用於計算兩個gps點之間的距離。

否則,請嘗試Ref: Harversine Formula來計算兩點之間的距離。

+0

沒見過那個,我通常使用GeoCoordinate - http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate(v=vs.110).aspx – Liath

+0

請原諒我的愚蠢。我嘗試了Geocoordinate,但無法啓動它。我對編程頗爲陌生。我現在要試試這個。我必須定義「使用System.Data.Spatial」才能使用該方法嗎? – user1672867

+0

@ user1672867我想我已經在我之前的一個問題中找到了一個例子。我會試着去挖掘它 - 我只是好奇GeoCoordinate和DBGeography之間的區別... – Liath