Calcola il secondo punto conoscendo il punto di partenza e la distanza

utilizzando un valore di latitudine e longitudine (punto A), sto tentando di calcolare un altro punto B, X metri di distanza con 0 radianti dal punto A. Quindi visualizzare i valori di latitudine e longitudine del punto B.

Esempio (Pseudo codice):

PointA_Lat = x.xxxx; PointA_Lng = x.xxxx; Distance = 3; //Meters bearing = 0; //radians new_PointB = PointA-Distance; 

Sono stato in grado di calcolare la distanza tra due punti, ma quello che voglio trovare è il secondo punto che conosce la distanza e il rilevamento.

Preferibilmente in PHP o Javascript.

Grazie

Sembra che tu stia misurando la distanza (R) in metri e il rilevamento (theta) in senso antiorario dal dovuto verso est. E per i tuoi scopi (centinaia di metri), la geometria piana dovrebbe essere abbastanza accurata. In quel caso,

 dx = R*cos(theta) ; theta measured counterclockwise from due east dy = R*sin(theta) ; dx, dy same units as R 

Se theta viene misurato in senso orario da nord a nord (ad esempio, i cuscinetti della bussola), il calcolo per dx e dy è leggermente diverso:

 dx = R*sin(theta) ; theta measured clockwise from due north dy = R*cos(theta) ; dx, dy same units as R 

In entrambi i casi, il cambiamento in gradi di longitudine e latitudine è:

 delta_longitude = dx/(111320*cos(latitude)) ; dx, dy in meters delta_latitude = dy/110540 ; result in degrees long/lat 

La differenza tra le costanti 110540 e 111320 è dovuta all’oblazione della terra (le circonferenze polari ed equatoriali sono diverse).

Ecco un esempio funzionante, utilizzando i parametri di una tua domanda successiva:

Data una posizione di partenza a longitudine di -87,62788 gradi, latitudine 41,88592 gradi, trovare le coordinate del punto a 500 metri a nord-ovest dal punto di partenza.

Se misuriamo gli angoli in senso antiorario da est a est, “nord-ovest” corrisponde a theta = 135 gradi. R è a 500 metri.

 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 

Potrebbe essere d’aiuto sapere che 3600 secondi di arco sono 1 grado (lat. O long.), Che ci sono 1852 metri in un miglio nautico e un miglio nautico è 1 secondo di arco. Ovviamente stai dipendendo dalle distanze relativamente brevi, altrimenti dovresti usare la trigonometria sferica.

Ecco una versione aggiornata usando 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 questa estensione:

 extension Double { var degreesToRadians : CGFloat { return CGFloat(self) * CGFloat(M_PI) / 180.0 } } 

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