Calcule el segundo punto conociendo el punto de partida y la distancia

usando un valor de Latitud y Longitud (Punto A), estoy tratando de calcular otro Punto B, X metros de distancia teniendo 0 radianes desde el punto A. Luego, visualizo los valores de Latitud y Longitud del punto B.

Ejemplo (Pseudo código):

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

Pude calcular la distancia entre dos puntos, pero lo que quiero encontrar es el segundo punto que conoce la distancia y el rumbo.

Preferiblemente en PHP o Javascript.

Gracias

Parece que estás 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 el sentido de las agujas del reloj desde el norte hacia el norte (por ejemplo, los rodamientos de la 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, el cambio en grados 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 al achatamiento de la tierra (las circunferencias polares y ecuatoriales son diferentes).

Aquí hay un ejemplo trabajado, usando los parámetros de una pregunta posterior suya:

Dado un lugar de inicio en la longitud -87.62788 grados, latitud 41.88592 grados, encuentre las coordenadas del punto a 500 metros al noroeste de la ubicación de inicio.

Si estamos midiendo angularjs 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 

Podría ser útil si supiera que 3600 segundos de arco tienen 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.

Aquí hay una versión actualizada que usa 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 } } 

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

    Intereting Posts