经纬度计算结果是否对应地图距离?Rails Geocoder能否计算memcached存储点位距离
经纬度距离计算及Rails Geocoder使用问题解答
经纬度计算结果与地图直线距离的对应关系
通过标准球面/椭球面坐标公式计算得到的经纬度距离,就是你需要的地图大圆直线距离,和通用地图工具展示的无道路直线距离完全一致。
直接计算经纬度数值差值是否可行
完全不可行。经纬度是球面坐标而非平面直角坐标,1经度对应的实际地表距离会随纬度升高不断缩短:赤道区域1经度对应约111km,南北纬60度区域仅对应约55km,极点位置趋近于0,直接用经纬度数值差计算得到的结果不具备实际距离参考性,也无法正确排序最近点位。
计算逻辑注意事项
如果自行实现计算逻辑,需要注意以下要点:
- 优先选用Haversine公式,是行业通用的球面距离计算方案,误差控制在0.5%以内,可满足绝大多数普通业务需求
- 对精度要求更高的场景可改用Vincenty公式,基于地球椭球模型计算,误差更小但计算量略高
- 所有经纬度数值需要先转换为弧度再代入公式计算,禁止直接使用角度单位计算
- 点位数量较大时可先做粗筛:比如先筛选纬度在起始点±指定范围内的点位,再做精确距离计算,减少不必要的算力消耗
Rails Geocoder的支持情况
完全支持脱离ActiveRecord的纯坐标距离计算,可直接调用工具类方法实现:
- 两点直线距离直接调用
Geocoder::Calculations.distance_between方法,传入两个[纬度, 经度]格式的数组即可,示例代码:# 计算北京到上海的直线距离,单位为公里 distance = Geocoder::Calculations.distance_between([39.9042, 116.4074], [31.2304, 121.4737], units: :km) - 方法底层默认使用Haversine公式,可通过配置切换为Vincenty公式获得更高精度
- 你从memcached中取出所有点位坐标后,直接遍历调用该方法计算距离后排序,即可得到最近点位,全程不需要调用ActiveRecord相关接口
内容的提问来源于stack exchange,提问作者ibpix
相关产品推荐
相关产品推荐

