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