计算两个经纬度之间的直线距离
前言
今天使用美团外卖时,发现可以按照距离对商家进行排序,就想研究一下地图上的两个点之间的距离是如何计算出来的。
原理
假设地球上有A(ja,wa),B(jb,wb)两点,根据经纬度计算球面距离的公式为
复制R 地球半径
arccos 反余弦函数
cos 余弦函数
sin 正弦函数
ja,jb A和B的经度
wa,wb A和B的纬度
公式的具体推导过程可以参考美团的这篇文章
实现
复制public class TestGetDistance {
//地球半径
private final static double EARTH_RADIUS = 6367;
public static void main(String[] args) {
System.out.println(getDistanceBetween(39.941, 116.45, 39.94, 116.451));//140.02855253140535
System.out.println(getDistanceBetween(39.96, 116.45, 39.94, 116.40));//4804.42115294124
System.out.println(getDistanceBetween(39.96, 116.45, 39.94, 117.30));//72444.54071515072
System.out.println(getDistanceBetween(39.26, 115.25, 41.04, 117.30));//263508.55921885674
}
/**
* 计算两个经纬度之间的距离
*
* @param lat1 第一个点的维度
* @param lon1 第一个点的精度
* @param lat2 第二个点的维度
* @param lon2 第二个点的精度
*/
public static double getDistanceBetween(double lat1, double lon1, double lat2, double lon2) {
lat1 = rad(lat1);
lon1 = rad(lon1);
lat2 = rad(lat2);
lon2 = rad(lon2);
//两点间距离 km,如果想要米的话,结果*1000就可以了
double d = EARTH_RADIUS * Math.acos(
Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1) + Math.sin(lat1) * Math.sin(lat2));
return d * 1000;
}
private static double rad(double d) {
return d * Math.PI / 180.0;
}
}
参考
地理空间距离计算优化
如何获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)
请问如何计算两个经纬度之间的距离?
百度地图Api 根据两个坐标点计算距离
经纬度查询两点距离
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构