Подтвердить что ты не робот

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

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

Спасибо

4b9b3361

Ответ 1

Кажется, вы измеряете расстояние (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

Ответ 2

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

Ответ 3

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

Ответ 4

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