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

23
demandé sur pppglowacki 2010-02-02 23:58:30

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
41
répondu Jim Lewis 2014-01-30 17:00:21

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.

3
répondu Arthur Kalliokoski 2010-02-02 21:18:54

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
répondu SteffenK 2015-08-25 15:20:47

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

-1
répondu Chris H 2010-02-02 21:09:18