我一直在试图解决两个拉特伦坐标之间的关系,但我很难理解这个概念。
我去过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)让我很困惑。
如果我最初的lat lon是:
纬度= -33.8830555556 经度= 151.216666667
我的目的地lat和lon是:
纬度= 22.25 经度= 114.1667
哪些变量需要匹配哪个纬度和长度?
dLon变量是纵向指的是两点之间的距离吗?
非常感谢!
答案 0 :(得分:3)
根据JavaScript代码,lat1
是初始点的纬度,lat2
是目标点的纬度。
请注意,所有纬度和经度必须以弧度为单位;使用math.rad()
进行转化。
Lua中的数学库也称为math
,而不是Math
。
答案 1 :(得分:1)
试试这个
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
答案 2 :(得分:0)
这是我已经完成的功能,可以完美运行。在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