2010-06-18 31 views
5

Tengo 2 coordenadas. Coordinate 1 es una 'persona'. Coordinate 2 es un destino.Cómo mover un marcador 100 metros con coordenadas

¿Cómo muevo la coordenada 1 100 metros más cerca de la coordenada 2?

Esto se usaría en un trabajo cron, por lo que solo se incluyen php y mysql.

Por ejemplo:

persona está en: 51.26667, 3.45417

destino es: 51.575001, 4,83889

cómo iba a calcular las nuevas coordenadas para la Persona que es 100 metros más cerca ?

+2

son las coordenadas en metros o es que lat/lon? Si es este último, debe hacer una proyección de coordenadas en WGS84 o un elipsoide similar para obtener coordenadas en metros. Luego, suponiendo que desea acercarse 100 en línea recta (no calles ni muros a considerar), puede usar la fórmula de distancia euclidiana –

+1

¿Son esos decimales? – Jeriko

+0

esas son lat, lng coordenadas. Usado por google maps –

Respuesta

10

Usa Haversine para calcular la diferencia entre los dos puntos en metros; luego ajuste proporcionalmente el valor de las coordenadas de la persona.

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

La alimentación de sus valores de:

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

da un resultado de 102059.82251083 metros, 102,06 kilometros

La relación de ajustar por se 100/102059,82251083 = 0,0009798174985988102859004569070625

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

Da una nueva latitud de 51.266972108109 y longitud de 3.4555 267728867

+0

A continuación se muestra un buen suplemento: http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL –

+0

Interesante, el Haversine. ¿Qué usarías como R? –

+0

sé cómo calcular la distancia. Pero no sé cómo ajustar correctamente –

4

Si usted entiende JavaScript, es posible que desee comprobar hacia fuera el método moveTowards() en el siguiente post desbordamiento de pila:

Este método devuelve el punto de destino cuando se le da un punto de inicio , un punto final y la distancia para viajar a lo largo de esa línea. Puede usar el punto 1 como punto de partida, el punto 2 como punto final y una distancia de 100 metros. Está escrito en JavaScript, pero estoy seguro de que se puede portar fácilmente a PHP o MySQL.

También es posible que desee comprobar hacia fuera este otro mensaje de desbordamiento de pila que implementa una parte de la aplicación por encima de JavaScript, como usuario de la función definida para SQL Server 2008, llamado func_MoveTowardsPoint:

Lo anterior usa el tipo de datos incorporado geography de SQL Server 2008. Sin embargo, puede usar fácilmente dos tipos de datos decimal para latitud y longitud en lugar del tipo de datos geography único.

Tanto el SQL Server como los ejemplos de JavaScript se basaron en implementaciones del artículo de Chris Veness Calculate distance, bearing and more between Latitude/Longitude points.

+1

Interesantes publicaciones y enlaces –

4

Encuentra el ángulo theta entre el eje xy el vector de persona a destino.

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

Ahora usa theta y la cantidad que desea avanzar el punto para calcular el nuevo punto.

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

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

+0

El problema con esta solución es que no considera la tierra como una esfera ... Los grados de latitud son paralelos y están separados aproximadamente 111 km, pero un grado de longitud es más ancho en el ecuador a 111 km y converge gradualmente a cero en los polos. –

+0

Ahh. No leí las coordenadas están en latitud/longitud. –

+0

Aún conservaría la respuesta aquí, porque sigue siendo relevante (al menos el título de la pregunta) ... Simplemente, puede poner una nota al respecto. –

Cuestiones relacionadas