2010-02-02 19 views
21

usando un valor de Latitud y Longitud (Punto A), estoy tratando de calcular otro Punto B, X metros llevando 0 radianes desde el punto A. Luego visualice el punto B Latitud y Longitud valores.Calcule el segundo punto conociendo el punto de partida y la distancia

Ejemplo (Pseudo código):

PointA_Lat = x.xxxx; 
PointA_Lng = x.xxxx; 
Distance = 3; //Meters 
bearing = 0; //radians 

new_PointB = PointA-Distance; 

yo era capaz de calcular la distancia entre dos puntos, pero lo que yo quiero encontrar es el segundo punto de conocer la distancia y el rumbo.

Preferiblemente en PHP o Javascript.

Gracias

+1

Tal vez esto sea útil http://www.meridianworlddata.com/Distance-Calculation.asp – stacker

Respuesta

38

Parece que está midiendo la distancia (R) en metros, y teniendo (theta) en sentido antihorario desde el este hacia el este. Y para sus propósitos (cientos de metros), la geometría del plano debería ser lo suficientemente precisa. En ese caso,

dx = R*cos(theta) ; theta measured counterclockwise from due east 
dy = R*sin(theta) ; dx, dy same units as R 

Si theta se mide en sentido horario desde el norte (por ejemplo, cojinetes de brújula), el cálculo para dx y dy es ligeramente diferente:

dx = R*sin(theta) ; theta measured clockwise from due north 
dy = R*cos(theta) ; dx, dy same units as R 

En cualquier caso, la cambio en grados de longitud y latitud es:

delta_longitude = dx/(111320*cos(latitude)) ; dx, dy in meters 
delta_latitude = dy/110540     ; result in degrees long/lat 

la diferencia entre las constantes 110540 y 111320 se debe a la tierra de achatamiento (las circunferencias polares y ecuatoriales son diferentes).

Aquí está un ejemplo práctico, utilizando los parámetros de una pregunta posterior de los suyos:

Dada una ubicación de inicio en longitud -87.62788 grados, latitud 41.88592 grados, encontrar las coordenadas del punto 500 metros al noroeste desde el principio ubicación.

Si estamos midiendo los ángulos en sentido antihorario desde el este hacia el este, "noroeste" corresponde a theta = 135 grados. R es 500 metros.

dx = R*cos(theta) 
    = 500 * cos(135 deg) 
    = -353.55 meters 

dy = R*sin(theta) 
    = 500 * sin(135 deg) 
    = +353.55 meters 

delta_longitude = dx/(111320*cos(latitude)) 
       = -353.55/(111320*cos(41.88592 deg)) 
       = -.004266 deg (approx -15.36 arcsec) 

delta_latitude = dy/110540 
       = 353.55/110540 
       = .003198 deg (approx 11.51 arcsec) 

Final longitude = start_longitude + delta_longitude 
       = -87.62788 - .004266 
       = -87.632146 

Final latitude = start_latitude + delta_latitude 
       = 41.88592 + .003198 
       = 41.889118 
+0

¡Gracias Jim por el ejemplo de edición! Realmente lo aprecio. Entiendo completamente el concepto ahora. – pppglowacki

+0

Jimk Lewis: Intenté usar tu fórmula aquí (http://stackoverflow.com/questions/8064930/google-maps-v3-circle-circle-that-i-created-do-not-match) y no obtuve una círculo perfecto, ¡eche un vistazo! – Nyxynyx

+0

Hmm, ¿funciona esto en cualquier parte del mundo? Parece que solo funciona en algunos lugares. Intento trazar un punto en el sudeste, y en ocasiones termino en el noroeste. – paulwhit

-1

dx = sin (cojinete)
dy = cos (cojinete)
x = center.x + dist dx;
y = center.y + dist
dy;

+0

Esto funcionaría en un avión si intercambias sin() y cos() – stacker

+0

centroX = 41.88592 (Latitud) y centroY = -87.62788 (Longitud) Mi distancia es de 500 metros. El cálculo anterior no me da las coordenadas a 500 metros a la derecha de mi ubicación original. La distancia está en el formato incorrecto así que estoy tratando de resolver eso a continuación. – pppglowacki

+0

cierto, depende de la convención para el rodamiento. si 0 es "a la derecha" y x + es "a la derecha", entonces intercambiamos sin y cos ... la convención no fue dada en la pregunta, así que inventé algo al azar. –

3

Podría ser útil si supiera que 3600 segundos de arco son 1 grado (latitud o longitud), que hay 1852 metros en una milla náutica, y una milla náutica es 1 segundo de arco. Por supuesto, depende de que las distancias sean relativamente cortas, de lo contrario tendría que usar la trigonometría esférica.

+1

El trigonometría esférica es un buen punto para aumentar. Si las distancias son algo más grandes que unas pocas millas, divergirán del globo y se elevarán en el aire. Si esto importa o no, depende de su caso de uso, precisión y objetivos. Tal vez él no está trabajando en un globo sino en un espacio plano. – Karl

+0

Karl y akallio, gracias por la entrada. Realmente estoy trabajando en una superficie plana y la distancia será de aproximadamente 500 metros. – pppglowacki

+0

tan solo para confirmar con la conversión anterior: 500 metros = 0.2699784 segundos de arco? – pppglowacki

2

Aquí es una versión actualizada utilizando Swift:

let location = CLLocation(latitude: 41.88592 as CLLocationDegrees, longitude: -87.62788 as CLLocationDegrees) 

let distanceInMeter : Int = 500 
let directionInDegrees : Int = 135 

let lat = location.coordinate.latitude 
let long = location.coordinate.longitude 

let radDirection : CGFloat = Double(directionInDegrees).degreesToRadians 

let dx = Double(distanceInMeter) * cos(Double(radDirection)) 
let dy = Double(distanceInMeter) * sin(Double(radDirection)) 

let radLat : CGFloat = Double(lat).degreesToRadians 

let deltaLongitude = dx/(111320 * Double(cos(radLat))) 
let deltaLatitude = dy/110540     

let endLat = lat + deltaLatitude 
let endLong = long + deltaLongitude 

Usando esta extensión:

extension Double { 
    var degreesToRadians : CGFloat { 
     return CGFloat(self) * CGFloat(M_PI)/180.0 
    } 
} 
Cuestiones relacionadas