2009-11-03 31 views
6

Ich möchte eine Funktion erstellen, die den Abstand zwischen zwei Paaren von Lat/Longs mit dem Pythag Theorem anstelle der Haversine Großkreisformel berechnet. Da dies über relativ kurze Entfernungen (3km) sein wird, denke ich, dass diese Version, die eine flache Erde voraussetzt, in Ordnung sein sollte. Wie kann ich das machen? Ich habe das Internet gefragt und mir nichts Nützliches einfallen lassen. :)Berechnung der Entfernung zwischen zwei Punkten mit Pythagoras Theorem

Danke.

EDIT:

Hier ist, was ich kam mit (scheint zu funktionieren):

def get_dist(lat0, lng0, lat1, lng1) 
    begin 
    d_ew = (lng1.to_f - lng0.to_f) * Math.cos(lat0.to_f) 
    d_ns = (lat1.to_f - lat0.to_f) 
    d_lu = Math.sqrt(d_ew.to_f * d_ew.to_f + d_ns.to_f * d_ns.to_f) 
    d_mi = ((2*Math::PI*3961.3)/360)*d_lu 
    return d_mi 
    rescue Exception => ex 
    logger.debug "[get_dist] An exception occurred: #{ex.message}" 
    return -1 
    end 
end 
+13

Bestes Zitat jemals. „Ich im Internet gefragt und kam nicht mit etwas Sinnvolles up“ –

+0

Definitiv mit dem für meinen Zitatgenerator für meine Website. – user

+0

Ich schlage vor, Sie nehmen Ihren besten Schuss und wir werden von dort gehen (Post, was Sie bisher haben!) –

Antwort

14

Sie können einen einfachen Pythagoras Dreieck verwenden, wenn Sie die Entfernungen erwarten die Größe zu klein sein im Vergleich zu der Erde.

Angenommen, Sie befinden sich bei (lat0, long0) und Sie möchten die Entfernung zu einem Punkt (lat1, long1) in "Breiteneinheiten" kennen.

Horizontal (EW) Abstand ist etwa

d_ew = (long1 - long0) * cos(lat0) 

Dieses multipliziert mit cos wird (LAT0) zu berücksichtigen Längengrade näher zusammen bei hohen Breitengraden bekommen.

Vertikal (NS) Entfernung ist einfacher

d_ns = (lat1 - lat0) 

So ist der Abstand zwischen den beiden Punkten ist

d = sqrt(d_ew * d_ew + d_ns * d_ns) 

Sie diese Methode für anspruchsvollere Aufgaben verfeinern, aber dies sollte gut genug sein für Entfernungen vergleichen.

In der Tat, zum Vergleichen von Entfernungen ist es in Ordnung, d Quadrat zu vergleichen, was bedeutet, dass Sie die sqrt-Operation weglassen können.

+0

++ 1 - Deine ist einfacher als meine, also habe ich meine gelöscht . –

+0

perfekt, danke: D – cakeforcerberus

+0

Aus Neugier, wenn ich horizontalen Abstand bekomme, gibt es eine Möglichkeit, das zu km oder Meilen zu konvertieren? – cakeforcerberus

3

Nun, da Ihre Punkte nahe beieinander liegen, ist die Oberfläche der Kugel fast flach. Suchen Sie also einfach die Koordinaten der Punkte im 3D-Raum, also finden Sie (x, y, z) für jeden der Punkte. wo

x = r*sin(lat)*cos(long) 
y = r*sin(lat)*sin(long) 
z = r*cos(lat) 

wo r der Radius der Kugel ist. oder etwas in der Art, wie Sie lat/long definieren. Sobald Sie die beiden xyz-Koordinaten haben, verwenden Sie einfach sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2). Sie können wirklich nicht einfach ein 2D-Pythagoras-Theorem verwenden, da Sie vernünftige 2D-Koordinaten benötigen, was schwierig ist.

+0

Es wäre sicherlich einen Vergleich der Ergebnisse dieses Ansatzes mit meinen 2D-Pythagoras mit cos (lat) wert. Sie können gut akzeptable Ergebnisse wie folgt erhalten. –

1

Sie werden häufig diese Schreibweise 'dy, dx' sehen, die für die Differenz y und die Differenz x steht. Sie berechnen einfach die Differenzen auf beiden Achsen, die Quadratwurzel der beiden Differenzen werden entsprechend dem Theorum quadriert (die Summe des Hypes ist gleich dem Quadrat der anderen beiden Seiten).

var dx:Number = x1-x2; 
var dy:Number = y1-y2; 
var distance:Number = Math.sqrt(dx*dx + dy*dy); 

Hoffnung ist klar genug

Verwandte Themen