2010-02-02 5 views
21

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

Спасибо

+1

Может быть, это полезно http://www.meridianworlddata.com/Distance-Calculation.asp – stacker

ответ

38

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

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

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

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 
+0

Спасибо, Джим за пример редактирования! Я очень ценю это. Теперь я полностью понимаю эту концепцию. – pppglowacki

+0

Jimk Lewis: Я попробовал использовать вашу формулу здесь (http://stackoverflow.com/questions/8064930/google-maps-v3-circle-circle-that-i-created-do-not-match) и не получил идеальный круг, пожалуйста, смотрите! – Nyxynyx

+0

Хм, это работает в любом месте земного шара? Кажется, что они работают только в некоторых местах. Я пытаюсь построить точку на юго-востоке, а иногда я нахожусь на северо-западе. – paulwhit

-1

дх = sin (подшипник)
д = соз (подшипник)
х = center.x + расстояние дм;
y = center.y + dist
dy;

+0

Это будет работать на самолете, если вы замените sin() и cos() – stacker

+0

centerX = 41.88592 (Широта) и centerY = -87.62788 (Долгота) Мое расстояние 500 метров. Приведенный выше расчет не дает мне координат в 500 метрах прямо от моего первоначального местоположения. Расстояние находится в неправильном формате, поэтому я пытаюсь понять, что дальше. – pppglowacki

+0

Правда, это зависит от условного обозначения подшипника. если 0 «справа», а x + «справа», тогда замените sin и cos ... соглашение не было задано в вопросе, поэтому я сделал что-то наугад. –

3

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

+1

Сферический триггер - хороший момент для поднятия. Если расстояния больше чем на несколько миль, они расходятся с земным шаром и будут в воздухе. Если это имеет значение или не зависит от вашего прецедента, точности и целей. Возможно, он не работает на земном шаре, а на каком-то плоском пространстве. – Karl

+0

Карл и akallio, спасибо за вход. Im фактически работает на плоской поверхности, а расстояние составит около 500 метров. – pppglowacki

+0

, поэтому просто для подтверждения с помощью преобразования выше: 500 метров = 0,2699784 секунд дуги? – pppglowacki

2

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