Рассчитайте вторую точку, зная начальную точку и расстояние

Используя значения широты и долготы (точка A), я пытаюсь вычислить еще одну точку B, находящуюся на расстоянии X метров с радиусом 0 радиан от точки A. Затем отобразите значения широты и долготы точки B.

Пример (псевдокод):

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

new_PointB = PointA-Distance;

Мне удалось вычислить расстояние между двумя точками, но я хочу найти вторую точку, зная расстояние и направление.

Желательно в PHP или Javascript.

Спасибо

4 ответа

Решение

Похоже, вы измеряете расстояние (R) в метрах, а направление (тета) против часовой стрелки от восточного направления. И для ваших целей (сотни метров) геометрия самолета должна быть достаточно точной. В таком случае,

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

Если тета измеряется по часовой стрелке от северного направления (например, подшипники компаса), расчет для dx и dy немного отличается:

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

В любом случае, изменение в градусах долготы и широты:

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

Разница между константами 110540 и 111320 обусловлена ​​сжатием Земли (полярные и экваториальные окружности различны).

Вот рабочий пример, использующий параметры из вашего следующего вопроса:

Учитывая начальное местоположение на долготе -87,62788 градусов, широте 41,88592 градуса, найдите координаты точки в 500 метрах к северо-западу от стартового местоположения.

Если мы измеряем углы против часовой стрелки от восточного направления, "северо-запад" соответствует тета =135 градусов. R 500 метров.

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

Это может помочь, если вы знаете, что 3600 секунд дуги - это 1 градус (широта или длина), что в морской миле 1852 метра, а морская миля равна 1 секунде дуги. Конечно, вы зависите от относительно коротких расстояний, в противном случае вам придется использовать сферическую тригонометрию.

Вот обновленная версия с использованием 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

Используя это расширение:

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

Дх = грех (подшипник)
DY = COS (подшипник)
x = center.x + dist dx;
y = center.y + dist dy;

Другие вопросы по тегам