Calculer le deuxième point en connaissant le point de départ et la distance
En utilisant une valeur de Latitude et de Longitude (Point A), j'essaie de calculer un autre Point B, X mètres de distance portant 0 radians du point A. Ensuite, affichez les valeurs de Latitude et de Longitude du point B.
Exemple (Pseudo code):
PointA_Lat = x.xxxx;
PointA_Lng = x.xxxx;
Distance = 3; //Meters
bearing = 0; //radians
new_PointB = PointA-Distance;
J'ai pu calculer la distance entre deux Points mais ce que je veux trouver est le deuxième point connaissant la distance et le roulement.
De préférence en PHP ou Javascript.
Merci
4 réponses
Il semble que vous mesuriez la distance (R) en mètres, et que vous releviez (thêta) dans le sens antihoraire depuis l'est. Et pour vos besoins (hundereds de mètres), la géométrie plane devrait être assez précise. Dans ce cas,
dx = R*cos(theta) ; theta measured counterclockwise from due east
dy = R*sin(theta) ; dx, dy same units as R
Si le thêta est mesuré dans le sens des aiguilles d'une montre à partir du Nord (par exemple, des roulements de boussole), le calcul pour dx et dy est légèrement différent:
dx = R*sin(theta) ; theta measured clockwise from due north
dy = R*cos(theta) ; dx, dy same units as R
Dans les deux cas, le changement de degrés de longitude et de latitude est:
delta_longitude = dx/(111320*cos(latitude)) ; dx, dy in meters
delta_latitude = dy/110540 ; result in degrees long/lat
La différence entre le constantes 110540 et 111320 est due à l'oblateness de la terre (les circonférences polaires et équatoriales sont différentes).
Voici un exemple travaillé, en utilisant les paramètres d'une question ultérieure de la vôtre:
Étant donné un emplacement de départ à la longitude -87.62788 degrés, latitude 41.88592 degrés, trouver les coordonnées du point 500 mètres au nord-ouest de l'emplacement de départ.
Si nous mesurons des angles dans le sens antihoraire à partir de l'est, "nord-ouest" correspond à thêta = 135 degrés. R est 500 mètres.
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
Cela pourrait aider si vous saviez que 3600 secondes d'arc est de 1 degré (lat. ou long.), qu'il y a 1852 mètres dans un mille marin, et un mille marin est 1 seconde d'arc. Bien sûr, vous dépendez des distances relativement courtes, sinon vous devrez utiliser la trigonométrie sphérique.
Voici une version mise à jour utilisant 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
En utilisant cette extension:
extension Double {
var degreesToRadians : CGFloat {
return CGFloat(self) * CGFloat(M_PI) / 180.0
}
}
DX = sin (roulement)
dy = cos(roulement)
x = center.x + dist dx;
y = center.y + distdy;