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 radian 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, c'est le deuxième point connaissant la distance et le relèvement.
De préférence dans PHP ou Javascript.
Je vous remercie
Il semble que vous mesuriez la distance (R) en mètres et le cap (thêta) dans le sens antihoraire à partir du plein est. Et pour vos besoins (des centaines de mètres), la géométrie plane doit être suffisamment 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 thêta est mesuré dans le sens des aiguilles d'une montre à partir du nord (par exemple, les relèvements au compas), 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 en 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 les constantes 110540 et 111320 est due à l'aplatissement de la Terre (les circonférences polaire et équatoriale sont différentes).
Voici un exemple concret, 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, la latitude 41,88592 degrés, trouvez 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 inverse des aiguilles d'une montre à partir de l'est, "nord-ouest" correspond à thêta = 135 degrés. R est de 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 correspondent à 1 degré (lat. Ou long.), Qu'il y a 1852 mètres dans un mille nautique et qu'un mille nautique équivaut à 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
}
}