2010-06-18 9 views
5

Ich habe 2 Koordinaten. Koordinate 1 ist eine "Person". Koordinate 2 ist ein Ziel.So verschieben Sie einen Marker 100 Meter mit Koordinaten

Wie verschiebe ich Koordinate 1 100 Meter näher an Koordinate 2?

Dies würde in einem Cron-Job verwendet werden, also nur PHP und MySQL enthalten.

Zum Beispiel:

Person ist: 51,26667, 3,45417

Destination ist: 51,575001, 4,83889

Wie würde ich die neuen Koordinaten für Person berechnen 100 Meter, um näher ?

+2

Sind die Koordinaten in Meter oder ist das lat/lon? Wenn Letzteres erforderlich ist, müssen Sie eine Koordinatenprojektion in WGS84 oder ein Simillar-Ellipsoid durchführen, um Koordinaten in Metern zu erhalten. Angenommen, Sie möchten 100 näher in einer geraden Linie (keine Straßen oder Wände zu berücksichtigen) bewegen, können Sie die euklidische Distanzformel verwenden –

+1

Sind diese Dezimalzahlen? – Jeriko

+0

das sind lat, lng Koordinaten. Verwendet von Google Maps –

Antwort

10

Verwenden Sie Haversine, um den Unterschied zwischen den zwei Punkten in Metern zu berechnen; Passen Sie dann den Wert der Personenkoordinaten proportional an.

$radius = 6378100; // radius of earth in meters 
$latDist = $lat - $lat2; 
$lngDist = $lng - $lng2; 
$latDistRad = deg2rad($latDist); 
$lngDistRad = deg2rad($lngDist); 
$sinLatD = sin($latDistRad); 
$sinLngD = sin($lngDistRad); 
$cosLat1 = cos(deg2rad($lat)); 
$cosLat2 = cos(deg2rad($lat2)); 
$a = ($sinLatD/2)*($sinLatD/2) + $cosLat1*$cosLat2*($sinLngD/2)*($sinLngD/2); 
if($a<0) $a = -1*$a; 
$c = 2*atan2(sqrt($a), sqrt(1-$a)); 
$distance = $radius*$c; 

Füttern Sie Ihre Werte:

$lat = 51.26667;  // Just South of Aardenburg in Belgium 
$lng = 3.45417; 
$lat2 = 51.575001;  // To the East of Breda in Holland 
$lng2 = 4.83889; 

ein Ergebnis von 102059,82251083 Meter gibt, 102,06 Kilometer

Das Verhältnis einzustellen, indem wird 100/102059,82251083 = 0,0009798174985988102859004569070625

$newLat = $lat + (($lat2 - $lat) * $ratio); 
$newLng = $lng + (($lng2 - $lng) * $ratio); 

Gibt einen neuen Breitengrad von 51,266972108109 und Längengrad 3,4555 an 267728867

+0

Folgendes ist eine gute Ergänzung: http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL –

+0

Interessant, die Haversine. Was würdest du als R benutzen? –

+0

ich weiß, wie man die Entfernung berechnet. Aber weiß nicht, wie man richtig einstellt –

4

Wenn Sie JavaScript verstehen, sollten Sie die moveTowards() Methode in der folgenden Stack-Überlauf Post überprüfen:

Diese Methode den Zielpunkt zurückkehrt, wenn ein Startpunkt gegeben ein Endpunkt und die Entfernung entlang dieser Linie. Sie können Punkt 1 als Ausgangspunkt, Punkt 2 als Endpunkt und eine Entfernung von 100 Metern verwenden. Es ist in JavaScript geschrieben, aber ich bin sicher, dass es leicht auf PHP oder MySQL portiert werden kann.

Sie können auch diesen anderen Stack-Überlauf Post zu überprüfen, die einen Teil der oben genannten JavaScript-Implementierung implementiert, als eine Benutzerfunktion für SQL Server definiert 2008 genannt func_MoveTowardsPoint:

Bei dem obigen Beispiel wird der in SQL Server 2008 integrierte Datentyp geography verwendet. Sie können jedoch problemlos zwei decimal Datentypen für Breiten- und Längengrade anstelle des einzelnen Datentyps geography verwenden.

Sowohl die SQL Server- als auch die JavaScript-Beispiele basierten auf Implementierungen aus Chris Veness 'Artikel Calculate distance, bearing and more between Latitude/Longitude points.

+1

Interessante Postings und Links –

4

Suchen Sie den Winkel Theta zwischen der X-Achse und dem Vektor von Person zu Ziel.

theta = Atan2(dest.y-person.y, dest.x-person.x).

nun mit Theta und die Menge möchten Sie den Punkt vorzurücken den neuen Punkt zu berechnen.

newPoint.x = advanceDistance * cos(theta) + person.x

newPoint.y = advanceDistance * sin(theta) + person.y

+0

Das Problem mit dieser Lösung ist, dass es nicht die Erde als eine Kugel betrachtet ... Breitengrade sind parallel und sind etwa 111km voneinander entfernt, aber ein Längengrad ist am Äquator bei 111 km am breitesten und konvergiert allmählich an den Polen zu Null. –

+0

Ahh. Habe die Koordinaten nicht in Längen-/Breitengrad gelesen. –

+0

Ich würde immer noch die Antwort hier behalten, weil es immer noch relevant ist (zumindest zum Titel der Frage) ... Sie können einfach nur eine Anmerkung darüber machen. –

Verwandte Themen