web-dev-qa-db-fra.com

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 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

28
pppglowacki

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
46
Jim Lewis

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.

3
Arthur Kalliokoski

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
    }
}
2
SteffenK