Расчет расстояния / пеленга между двумя координатами широты

Я пытался определить азимут между двумя координатами широты, но у меня возникли проблемы с пониманием концепции.

Я был на http://www.movable-type.co.uk/scripts/latlong.html и смогли изменить код расстояния для работы с lua, однако код подшипника в абзацах ниже меня немного смутил.

local y = Math.sin(dLon) * Math.cos(lat2)
local x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon)
local brng = Math.atan2(y, x).toDeg()

Именование переменных (lat1, lat2, dLon) сбило меня с толку.

Если моя начальная широта:

Широта = -33,8830555556 Долгота = 151,216666667

а широта и долгота пункта назначения:

Широта = 22,25 Долгота = 114,1667

Какие переменные должны соответствовать широте и долготе?

Относится ли переменная dLon к расстоянию между двумя точками в продольном направлении?

Огромное спасибо!


person user2609216    schedule 28.08.2013    source источник


Ответы (3)


На основе кода JavaScript lat1 - это широта начальной точки, а lat2 - это широта конечной точки.

Обратите внимание, что все значения широты и долготы должны быть указаны в радианах; используйте math.rad() для преобразования.

Также математическая библиотека в Lua называется math, а не Math.

person lhf    schedule 29.08.2013
comment
Спасибо, что понял, это имеет смысл. - person user2609216; 29.08.2013

Попробуй это

local function geo_distance(lat1, lon1, lat2, lon2)
  if lat1 == nil or lon1 == nil or lat2 == nil or lon2 == nil then
    return nil
  end
  local dlat = math.rad(lat2-lat1)
  local dlon = math.rad(lon2-lon1)
  local sin_dlat = math.sin(dlat/2)
  local sin_dlon = math.sin(dlon/2)
  local a = sin_dlat * sin_dlat + math.cos(math.rad(lat1)) * math.cos(math.rad(lat2)) * sin_dlon * sin_dlon
  local c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
  -- 6378 km is the earth's radius at the equator.
  -- 6357 km would be the radius at the poles (earth isn't a perfect circle).
  -- Thus, high latitude distances will be slightly overestimated
  -- To get miles, use 3963 as the constant (equator again)
  local d = 6378 * c
  return d
end

Координаты вводятся в градусах, поэтому geo_distance(30.19, 71.51, 31.33, 74.21) = ~287km

person Dave Dopson    schedule 17.01.2014

Вот функция, которую я сделал и отлично работает. Тяжело протестировано в X-Plane Flight Simulator. В конце есть деление радиуса Земли на 1852, поэтому функция возвращает расстояние в морских милях.

function GC_distance_calc(lat1, lon1, lat2, lon2)

--This function returns great circle distance between 2 points.
--Found here: http://bluemm.blogspot.gr/2007/01/excel-formula-to-calculate-distance.html
--lat1, lon1 = the coords from start position (or aircraft's) / lat2, lon2 coords of the target waypoint.
--6371km is the mean radius of earth in meters. Since X-Plane uses 6378 km as radius, which does not makes a big difference,
--(about 5 NM at 6000 NM), we are going to use the same.
--Other formulas I've tested, seem to break when latitudes are in different hemisphere (west-east).

local distance = math.acos(math.cos(math.rad(90-lat1))*math.cos(math.rad(90-lat2))+
    math.sin(math.rad(90-lat1))*math.sin(math.rad(90-lat2))*math.cos(math.rad(lon1-lon2))) * (6378000/1852)

return distance

end
person Ilias Tselios    schedule 20.07.2018