2014-03-27 19 views
5

Ich versuche, eine Methode zu sortieren, um den Abstand zwischen 2 Punkten in C# zu berechnen.Berechnen der Entfernung zwischen 2 Punkten in C#

Dies ist der Code, den ich versucht habe, obwohl ich fürchte, die Antwort, die ich bekomme, ist nicht korrekt.

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

dies wurde aus einer Antwort auf dieser Seite hier angepasst Distance between addresses

Irgendwelche Gedanken auf, was falsch läuft/

Dank Ryan

+0

http://www.movable-type.co.uk/scripts/latlong.html Diese Seite half mir immer heraus mit Entfernungen zwischen zwei Punkten zu berechnen. – woutervs

+0

Danke, gute Verbindung. Ich lege das in eine asp.net-Anwendung, um die Entfernungen zwischen den Postleitzahlen zu berechnen, also muss ich diesen Code richtig bekommen! – user1672867

+0

Meine erste Schätzung wird ein Zeichenproblem in Ihren trignometrischen Conversions sein. Ziehen Sie Wolframalpha oder einen Taschenrechner hoch, gehen Sie durch den Code und sehen Sie die Ergebnisse für jede Ihrer '' Math.Sin''' (oder andere trigonometrischen Funktionen) und sehen Sie, ob die Ergebnisse übereinstimmen. Konvertieren von Grad zu Radianten muss auch Zeichen berücksichtigen, wenn in trig Funktionen –

Antwort

11

Die Klasse I in der Regel verwenden ist 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

Ich versuchte dies gestern, aber wenn ich jemals schrieb in "using System. Device.Location "ist ein Fehler aufgetreten. Muss ich in dieser Klasse manuell einige hinzufügen? – user1672867

+1

Sie müssen einen Projektverweis auf die System.Device DLL hinzufügen, es ist nicht standardmäßig enthalten – Liath

+0

Vielen Dank. Ich werde das jetzt tun :) – user1672867

-4

Entfernung Formel: die beiden Punkte Gegeben (x1, y1) und (x2, y2) ist der Abstand zwischen diesen Punkten durch die Formel gegeben:

enter image description here

Verwendung es dementsprechend

+1

Das wäre richtig auf einer ebenen Fläche, nicht auf einem Globus :) – woutervs

+0

versuchen Sie diesen Link hoffe, es hilft .. andere http: // www. calculatorsoup.com/calculators/geometry-solids/distance-two-points.php – suku

+0

Noch nicht für eine sphärische Berechnung geeignet ... – 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); 
} 

Eingang erwartet verdoppelt.

Dies ist die hairsine Formel, die verwendet wird, um die Entfernungen auf unserem Globus zwischen zwei Punkten zu berechnen. Dies ist die Entfernung in einer geraden Linie, wenn Sie die Entfernung auf einem Pfad benötigen, müssen Sie alle Punkte auf diesem Pfad finden und dann die Abstände zwischen den zwei Punkten berechnen und dann die Summe daraus nehmen.

+0

Bearbeitete meine Antwort. – woutervs

+0

Danke, ich gebe das jetzt los :) – user1672867

+1

Da Sie ein neuer Benutzer sind, vergessen Sie nicht zu upvote/markieren als Antwort es war diese Antwort hilfreich. – woutervs

2

Sie können DbGeography für die räumliche Berechnung verwenden. Es hat DbGeography.Distance Methode, die verwendet wird, um den Abstand zwischen zwei GPS-Punkten zu berechnen.

Andernfalls versuchen Sie Ref: Harversine Formula, um den Abstand zwischen zwei Punkten zu berechnen.

+0

Nicht gesehen, dass ich normalerweise GeoCoordinate - http://msdn.microsoft.com/en-us/library/system.device.location.geoordinate(v=vs.110).aspx – Liath

+0

Bitte verzeihen Sie meine Dummheit. Ich habe Geocoordinate versucht, konnte es aber nicht zum Laufen bringen. Ich bin ziemlich neu im Programmieren. Ich werde es jetzt versuchen. Muss ich "using System.Data.Spatial" definieren, um diese Methode verwenden zu können? – user1672867

+0

@ user1672867 Ich denke, ich habe ein Beispiel irgendwo in einer meiner vorherigen Frage. Ich werde versuchen, es auszugraben - ich war nur neugierig auf den Unterschied zwischen GeoCoordinate und DBGeography ... – Liath

Verwandte Themen