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

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

Спасибо


person pawelglow    schedule 02.02.2010    source источник
comment
Может быть, это полезно meridianworlddata.com/Distance-Calculation.asp   -  person stacker    schedule 03.02.2010


Ответы (4)


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

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

Если theta измеряется по часовой стрелке от правильного направления на север (например, пеленг компаса), расчет для 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
person Jim Lewis    schedule 02.02.2010
comment
Спасибо, Джим, за пример редактирования! Я очень ценю это. Теперь я полностью понимаю эту концепцию. - person pawelglow; 18.02.2010
comment
Джимк Льюис: Я пробовал использовать здесь вашу формулу (заголовок stackoverflow.com/questions/8064930/) и не получил идеального круга, пожалуйста, посмотрите! - person Nyxynyx; 09.11.2011
comment
Хм, а это работает где-нибудь на земном шаре? Кажется, работает только в некоторых местах. Я пытаюсь нанести точку на юго-восток, а иногда вместо этого оказываюсь на северо-западе. - person paulwhit; 27.04.2012
comment
@paulwhit: это приближение, которое должно хорошо работать для ситуации OP (расстояния порядка метров). Приближение не выполняется, если начальная точка находится близко к северному или южному полюсу, или если расстояние слишком велико. Итак, для крайнего примера, если вы на расстоянии 1 метра от северного полюса на долготе 0 градусов и идете 100 метров на восток (несколько кругов вокруг полюса ...), эта формула не даст правильных окончательных координат. Если ваши результаты попадают в неправильный квадрант для других сценариев, убедитесь, что вы используете правильное соглашение для измерения теты. - person Jim Lewis; 28.04.2012
comment
@paulwhit: Также нужно быть осторожным с условием долготы - местоположения к западу от нулевого меридиана могут быть выражены как долгота 75 градусов з.д., но это должно быть представлено как -75 градусов, чтобы тригонометрия работала правильно. - person Jim Lewis; 28.04.2012
comment
Я тестировал эту формулу и не работал. Лучшая идея - использовать UTM и добавление / вычитание смещения. - person Gödel77; 18.11.2014
comment
Здесь (stackoverflow.com/questions/30002372/) - это еще одна формула, она немного отличается от вашей. что лучше? - person gfan; 03.05.2015
comment
110540 и 111320, откуда эти числа? - person gfan; 03.05.2015
comment
@gfan: Один градус широты на поверхности Земли равен 110540 метрам. Один градус долготы равен 111320 метрам (на экваторе). Они разные, потому что Земля не идеальная сфера. Он выступает на экваторе, поэтому экваториальная окружность немного больше полярной. - person Jim Lewis; 03.05.2015
comment
обратите внимание на единицы; подшипник / широта / долгота в градусах - я использую np.sin / cos в радианах - единицы должны быть преобразованы в такие же, и тогда он отлично работает - person Dimitris; 20.09.2017

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

person Arthur Kalliokoski    schedule 02.02.2010
comment
Сферический триггер - хорошая точка для подъема. Если расстояния будут больше нескольких миль, они отклонятся от земного шара и будут в воздухе. Если это имеет значение или нет, зависит от вашего варианта использования, точности и целей. Возможно, он работает не над земным шаром, а над каким-то плоским пространством. - person Karl; 03.02.2010
comment
Карл и Акаллио, спасибо за вклад. На самом деле я работаю на ровной поверхности, и расстояние будет около 500 метров. - person pawelglow; 03.02.2010
comment
так что просто чтобы подтвердить, используя приведенное выше преобразование: 500 метров = 0,2699784 дуги? - person pawelglow; 03.02.2010
comment
@akallio: Морская миля - это одна угловая минута, а не угловая секунда. И это верно только для большого круга - одна морская миля к востоку или западу не соответствует 1/60 градуса долготы, за исключением экватора. - person Jim Lewis; 03.02.2010

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

dx = sin (направление)
dy = cos (направление)
x = center.x + dist dx;
y = center.y + dist
dy;

person Chris H    schedule 02.02.2010
comment
centerX = 41,88592 (широта) и centerY = -87,62788 (долгота) Мое расстояние составляет 500 метров. Приведенный выше расчет не дает мне координат в 500 метрах справа от моего исходного местоположения. Расстояние в неправильном формате, поэтому я пытаюсь выяснить это следующим образом. - person pawelglow; 03.02.2010
comment
правда, это зависит от условности подшипника. если 0 справа, а x + справа, поменяйте местами sin и cos ... соглашение не было указано в вопросе, поэтому я сделал что-то наугад. - person Chris H; 03.02.2010
comment
dx = cos (0) = 1, dy = sin (0) = 0, x = 41 + 500 * 1, y = -87 + 500 * 0 - person Chris H; 03.02.2010
comment
Если вы хотите выразить dx и dy в градусах долготы и широты, используется поправочный коэффициент cos (широта). - person Jim Lewis; 03.02.2010