2010-06-18 7 views
5

좌표가 2입니다. 좌표 1은 '사람'입니다. 좌표 2는 대상입니다.좌표가있는 마커를 이동하는 방법

어떻게 좌표 1을 100m를 좌표 2에 더 가깝게 이동합니까?

이것은 cron 작업에 사용되므로 php와 mysql 만 포함됩니다. 내가 가까이 100m로 사람에 대한 새로운 좌표를 계산 할 방법 51.575001, 4.83889

:

사람에있다 : 예를 들어

51.26667, 3.45417

대상입니다 ?

+2

미터의 좌표 또는 위도/경도이다? 후자의 경우 좌표계를 미터 단위로 가져올 수 있도록 WGS84 또는 simillar 타원체에 좌표 투영을 수행해야합니다. 그런 다음, 직선으로 100을 더 가깝게 이동하려고한다고 가정하면 (거리 또는 벽이 고려되지 않음) 유클리드 거리 공식을 사용할 수 있습니다. –

+1

소수점 숫자입니까? – Jeriko

+0

이들은 위도와 경도 좌표입니다. –

답변

10

Haversine을 사용하여 미터 단위의 두 점 사이의 차이를 계산합니다. 그 다음 사람의 좌표 값을 비례 적으로 조정하십시오. 당신의 가치를 먹이

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

:

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

이 102059.82251083 미터의 결과를 제공, 102.06 킬로미터

에 의해 조정 비율 100/102059.82251083 = 0.0009798174985988102859004569070625

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

한다 새로운 위도 51.266972108109와 경도 3.4555를 부여합니다. 267,728,867

+0

Google지도에서 사용 다음은 좋은 보충 자료입니다. http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL –

+0

흥미 롭습니다, Haversine. R로 무엇을 사용 하시겠습니까? –

+0

거리를 계산하는 방법을 알고 있습니다. 하지만 제대로 조정하는 방법을 모르겠다 –

4

자바 스크립트를 이해한다면, 당신은 다음과 같은 스택 오버플로 포스트에 moveTowards() 방법을 확인 할 수 있습니다 :

이 방법은 대상 지점을 반환하는 시작점을 제공하는 경우 , 끝점 및 해당 선을 따라 이동하는 거리를 지정합니다. 점 1을 시작점으로, 점 2를 끝점으로 사용하고 거리 100m를 사용할 수 있습니다. JavaScript로 작성되었지만 PHP 또는 MySQL로 쉽게 이식 할 수 있다고 확신합니다.

:

사용자가 SQL Server 2008의 기능을 정의 또한, 자바 스크립트 위의 구현의 일부를 구현이 다른 스택 오버플로 게시물을 확인 할 수는 func_MoveTowardsPoint라고

위의 내용은 SQL Server 2008의 내장 된 geography 데이터 형식을 사용합니다. 그러나 geography 데이터 유형 대신 위도와 경도에 대해 두 개의 decimal 데이터 유형을 쉽게 사용할 수 있습니다.

Chris Veness의 기사 Calculate distance, bearing and more between Latitude/Longitude points의 구현을 기반으로 한 SQL Server와 JavaScript 예제입니다.

+1

흥미로운 게시물 및 링크 –

4

X 축과 사람과 대상 간의 벡터 사이의 각을 찾습니다.

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

지금 세타를 사용하고 양이 새 지점을 계산하기 위해 지점을 진행하고자합니다.

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

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

+0

이 솔루션의 문제점은 지구를 구로 간주하지 않는다는 것입니다 ... 위도는 평행하며 약 111km 떨어져 있지만 경도는 적도에서 가장 넓은 111km 지점에서 점차적으로 극점에서 0으로 수렴합니다. –

+0

아. 좌표를 위도/경도로 읽지 않았습니다. –

+0

나는 아직 질문의 제목과 관련이 있기 때문에 여기에 답을 남겨 두겠다. –

관련 문제