debugging - 为什么这个用于 lat/long 的 Lua Haversine 代码不起作用?
问题描述
我正在尝试创建一个半正弦“距离计算器”,我可以在其中输入两个纬度/经度坐标,并通过使用半正弦公式给出它们之间的距离。它在 Lua 中,代码如下:
local R = 6371000 -- metres
local lat1 = la1 * math.pi/180
local lat2 = la2 * math.pi/180
local dlat = (lat2 - lat1) * math.pi/180
local dlong = (long2 - long1) * math.pi/180
local a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(lat1) * math.cos(lat2) * math.sin(dlong/2) * math.sin(dlong/2)
local c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
local d = R * c -- in metres
d = d / 1000 -- in kilometers
print(d)
我已经针对使用此公式的多个在线距离检查器对其进行了测试,并且始终相差很大。而且,我从这里获取了代码,然后将其更改为 Lua:https ://www.movable-type.co.uk/scripts/latlong.html
知道为什么这不起作用吗?谢谢你。
解决方案
假设您只是省略了设置坐标的线,您的问题是您乘以dlat
,math.pi/180
尽管lat1
和lat2
已经是弧度,而不是度数。local dlat
应该是lat2 - lat1
。
以下是代码的改进变体:
local function haversine (lat1, lat2, long1, long2) -- in radians.
local cos, sin = math.cos, math.sin
local dlat, dlong = lat2 - lat1, long2 - long1
return sin (dlat / 2) ^ 2 + cos (lat1) * cos (lat2) * sin (dlong / 2) ^ 2
end
local function distance (p1, p2) -- in degrees.
local pi, arcsin, sqrt = math.pi, math.asin, math.sqrt
local d2r = pi / 180
local R = 6371000 -- in metres
local lat1, lat2 = p1[1] * d2r, p2[1] * d2r
local long1, long2 = p1[2] * d2r, p2[2] * d2r
local a = haversine (lat1, lat2, long1, long2)
return 2 * R * arcsin (sqrt (a)) / 1000 -- in km
end
local Moscow, Novokuznetsk = {55.7558, 37.6173}, {53.7596, 87.1216}
print (distance (Moscow, Novokuznetsk)) -- 3126 km as reported by https://www.distancefromto.net/distance-from-moscow-to-novokuznetsk-ru.
distance
并haversine
转移到功能,- from 的功能
math
已本地化,以使外观和性能更整洁, - 为性能预先计算度数到弧度的转换率,
^
用于发电,- 反正切替换为反正弦,以简化公式。
推荐阅读
- typescript - 打字稿中可选参数的语义
- elasticsearch - elasticsearch 术语聚合不正确
- java - 如何在使用 Graph sdk 创建上传会话时指定冲突行为
- go - CGO_ENABLED 如何影响动态与静态链接?
- powershell - 你可以在powershell中对函数返回进行内联操作吗?
- angular - dx-scheduler ANGULAR - 如何在调度程序中使用 angular 实现分页
- node.js - 使用 AWS ECS 运行 Node.Js 应用程序映像时如何访问 PM2 日志
- python-3.x - 无法在 TensorFlow 2.0 中打开源文件:'../common/maskApi.c'
- javascript - 使用 SetInterval 调用特定方法
- parsing - Dart - 如何从“;”解析字符串 和 :