2010-06-18 12 views
5

Mam 2 współrzędne. Współrzędna 1 to "osoba". Współrzędna 2 jest miejscem docelowym.Jak przesunąć znacznik 100 metrów ze współrzędnymi

Jak przesunąć współrzędne 1 100 metrów bliżej współrzędnej 2?

Byłoby to używane w przypadku zadania cron, więc dołączono tylko php i mysql.

Na przykład:

osoba jest pod adresem: 51.26667, 3,45417

przeznaczenia jest: 51,575001, 4,83889

Jak obliczyć nowe współrzędne dla osoby, która ma być 100 metrów bliżej ?

+2

są współrzędnymi w metrach czy to lat/lon? Jeśli to drugie, musisz wykonać rzut współrzędnych na WGS84 lub prostą elipsoidę, aby uzyskać współrzędne w metrach. Następnie, zakładając, że chcesz zbliżyć się o 100 bliżej linii prostej (bez uwzględnienia ulic i ścian), możesz użyć wzoru odległości euklidesowej –

+1

Czy są to miejsca dziesiętne? – Jeriko

+0

te są latami, lng współrzędne. Używany przez google maps –

Odpowiedz

10

Użyj Haversine, aby obliczyć różnicę między dwoma punktami na metrach; następnie proporcjonalnie dostosuj wartość współrzędnych osoby.

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

Karmienie wartości:

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

daje wynik 102059.82251083 metrów, 102,06 km

Stosunek do regulacji przez to 100/102059,82251083 = 0,0009798174985988102859004569070625

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

Daje nową szerokość geograficzną 51.266972108109 i długość geograficzną równą 3.4555 267728867

+0

Poniżej znajduje się dobre uzupełnienie: http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL –

+0

Interesujące, Haversine. Co byś użył jako R? –

+0

Wiem, jak obliczyć odległość. Ale nie wiem, jak prawidłowo ustawić –

4

Jeśli rozumiesz JavaScript, może chcesz sprawdzić metodę moveTowards() w następującym przepełnienie stosu postu:

Metoda ta zwraca punkt docelowy, gdy dany punkt początkowy , punkt końcowy i odległość do pokonania wzdłuż tej linii. Punktem wyjścia może być punkt 1, punkt 2 jako punkt końcowy i odległość 100 metrów. Jest napisany w JavaScript, ale jestem pewien, że można go łatwo przenieść do PHP lub MySQL.

Można też sprawdzić to inne stanowisko przepełnieniem stosu, który implementuje część powyższej JavaScript realizacji, jak zdefiniowane przez użytkownika funkcji SQL Server 2008, zwany func_MoveTowardsPoint:

Powyższe wykorzystuje wbudowany typ danych SQL Server 2008 geography. Można jednak łatwo użyć dwóch typów danych decimal dla szerokości i długości geograficznej w miejsce pojedynczego typu danych geography.

Zarówno SQL Server, jak i przykłady JavaScriptu zostały oparte na implementacjach z artykułu Chrisa Venessa o numerze Calculate distance, bearing and more between Latitude/Longitude points.

+1

Interesujące posty i linki –

4

Znajdź kąt theta między osią X a wektorem od osoby do miejsca docelowego.

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

Teraz użyj theta i wysokość chcesz przesunąć punkt do obliczenia nowego punktu.

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

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

+0

Problem z tym rozwiązaniem polega na tym, że nie uważa Ziemi za kulę ... Stopnie szerokości geograficznej są równoległe i oddalone od siebie o około 111 km, ale pewien stopień długości geograficznej najszerszy na równiku na 111 km i stopniowo zbiega się do zera na biegunach. –

+0

Ahh. Nie odczytano współrzędnych w szerokości/długości geograficznej. –

+0

Wciąż będę tu trzymał odpowiedź, ponieważ jest ona nadal istotna (przynajmniej w tytule pytania) ... Możesz po prostu napisać o tym. –

Powiązane problemy