math - meters - Calcule el segundo punto conociendo el punto de partida y la distancia
distance meters between latitude longitude (4)
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
}
}
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 á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
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.
dx = sin (teniendo)
dy = cos (teniendo)
x = center.x + dist dx;
y = center.y + dist dy;