Abstand zwischen Lat / Long-Punkten

10

Ich versuche, die Entfernung zwischen zwei Längen- und Breitengraden zu berechnen. Ich habe einen Code, der meistens funktioniert, den ich aus diesem Beitrag herausgerissen habe, aber ich verstehe nicht wirklich, wie er funktioniert.

Hier ist der Code:

<?php
// POINT 1
$thisLat = deg2rad(44.638);
$thisLong = deg2rad(-63.587);

// POINT 2
$otherLat = deg2rad(44.644);
$otherLong = deg2rad(-63.911);

$MeanRadius = 6378 - 21 * sin($lat1);

$xa = (Cos($thisLat)) * (Cos($thisLong));
$ya = (Cos($thisLat)) * (Sin($thisLong));
$za = (Sin($thisLat));

$xb = (Cos($otherLat)) * (Cos($otherLong));
$yb = (Cos($otherLat)) * (Sin($otherLong));
$zb = (Sin($otherLat));

$distance = $MeanRadius * Acos($xa * $xb + $ya * $yb + $za * $zb);

echo $distance;
?>

Ich habe ein paar Fragen:

  1. Was sind xa, ya, za? Ich verstehe, dass es sich um Punkte auf einer kartesischen 3D-Ebene handelt, aber wo sind sie relativ? Der Mittelpunkt der Erde?
  2. Wie cos($xa * $xb + $ya * $yb + $za * $zb)berechnet dies den Abstand zwischen den Punkten? Ich weiß, dass ich dies in 2D tun würde:

Alt-Text

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Wie genau wird das sein? Auf der anderen Seite wurde darüber diskutiert. Aber ich möchte die Entfernung speziell nutzen, um festzustellen, ob sich Benutzer innerhalb von 10 m, 20 m oder 50 m voneinander befinden. Kann ich das mit guter Genauigkeit tun?
  2. Wofür soll ich verwenden $MeanRadius? Ist das ein vernünftiger Wert? Ich denke, dass dieser Wert davon ausgeht, dass die Erde eine Elipse ist.
sechzig Fuß
quelle

Antworten:

17

Dies ist ein schrecklicher Code für den allgemeinen Gebrauch, da er zu fehlerhaften Ergebnissen führen oder auf kurzen Strecken sogar ganz fehlschlagen kann. Verwenden Sie stattdessen die Haversine-Formel .

(Die Formel, auf der Ihr Code basiert, konvertiert zwei Punkte auf der Kugel (keine Ellipse) in ihre kartesischen 3D-Koordinaten (xa, ya, za) und (xb, yb, zb) auf der EinheitKugel und bildet ihr Punktprodukt, das dem Kosinus des Winkels zwischen ihnen entspricht. Die ACos-Funktion gibt den Winkel zurück, der bei Skalierung mit dem Erdradius die Entfernung schätzt. Das Problem ist, dass sich der Kosinus eines kleinen Winkels, beispielsweise der Größe 'e' im Bogenmaß, von 1 um einen Betrag nahe e ^ 2/2 unterscheidet. Dies verschwindet in der Gleitkomma-Fehlerwolke, wenn e kleiner als die Quadratwurzel der doppelten Gleitkomma-Genauigkeit ist. Wenn Sie mit einfacher Genauigkeit rechnen, bedeutet dies, dass Werte von e kleiner als 0,001 - ungefähr ein Kilometer - mit Null verwechselt werden! Bei doppelter Genauigkeit liegt der Grenzwert bei e = 10 ^ -8, aber wenn e = 10 ^ -4 oder so (ungefähr 10 Meter) ist, können Sie möglicherweise so viel Präzision verlieren, dass Sie sich Sorgen machen müssen., hat einige hochpräzise interne Berechnungen eingebaut)).

whuber
quelle
7

Schauen Sie sich diese Website an: http://www.movable-type.co.uk/scripts/latlong.html

Wenn Sie es implementieren und die falschen Antworten erhalten, haben Sie wahrscheinlich die falschen Einheiten. Ich denke, für diese Site werden die meisten Operationen im Bogenmaß statt in Dezimalgraden ausgeführt.

Patrick
quelle