Рассчитайте вторую точку, зная начальную точку и расстояние - PullRequest
26 голосов
/ 02 февраля 2010

, используя значения широты и долготы (точка 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 ]

46 голосов
/ 03 февраля 2010

Похоже, что вы измеряете расстояние (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
3 голосов
/ 03 февраля 2010

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

2 голосов
/ 24 августа 2015

Вот обновленная версия с использованием 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
    }
}
0 голосов
/ 03 февраля 2010

dx = sin (подшипник)
dy = cos (подшипник)
x = center.x + dist dx;
y = center.y + dist
dy;

...