计算地球上两点的距离
基础
经度 longitude 经度值必须在(-180,180]范围内,正值位于本初子午线以东。
纬度 latitude 纬度值必须在[-90,90]范围内,正值位于赤道以北。
0°纬线是指赤道,赤道是最大的纬线圈,赤道周长40076km。
地球半径约为6371km。
坐标系
不同的地图、包括mysql,使用的坐标系有所差异。
以下链接关于坐标系的内容仅可供参考
0
1
2
3
4
计算工具
mysql计算两点距离
st_distance_sphere可以传入地球半径,mysql默认地球半径6370986m。
select st_distance_sphere(point(0, 0), point(180, 0))/pi() from dual;
-- 6370986
select floor(st_distance_sphere(point(121.31689050066859, 31.20492648496468), point(121.28008992458321, 31.20559947351123))) distance from dual;
-- 3500
select floor(st_distance_sphere(point(121.31689050066859, 31.20492648496468), point(121.28008992458321, 31.20559947351123), 6370986)) distance from dual;
-- 3500
select st_distance_sphere(point(121.31689050066859, 31.20492648496468), point(121.28008992458321, 31.20559947351123)) distance from dual;
-- 3500.7799743652954
select st_distance_sphere(point(121.31689050066859, 31.20492648496468), point(121.28008992458321, 31.20559947351123), 6370986) distance from dual;
-- 3500.7799743652954
java代码
How to calculate the distance between 2 locations
import java.util.*;
import java.lang.*;
import java.io.*;
class DistanceCalculator
{
public static void main (String[] args) throws java.lang.Exception
{
// 2.175183951096676 Miles
System.out.println(distance(31.20492648496468, 121.31689050066859, 31.20559947351123, 121.28008992458321, "M") + " Miles\n");
// 3.5006192405937293 Kilometers
System.out.println(distance(31.20492648496468, 121.31689050066859, 31.20559947351123, 121.28008992458321, "K") + " Kilometers\n");
// 1.8889297431323535 Nautical Miles
System.out.println(distance(31.20492648496468, 121.31689050066859, 31.20559947351123, 121.28008992458321, "N") + " Nautical Miles\n");
}
private static double distance(double lat1, double lon1, double lat2, double lon2, String unit) {
if ((lat1 == lat2) && (lon1 == lon2)) {
return 0;
}
else {
double theta = lon1 - lon2;
double dist = Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(theta));
dist = Math.acos(dist);
dist = Math.toDegrees(dist);
dist = dist * 60 * 1.1515;
if (unit.equals("K")) {
dist = dist * 1.609344;
} else if (unit.equals("N")) {
dist = dist * 0.8684;
}
return (dist);
}
}
}
版权声明:本文所有权归作者! 商业用途转载请联系作者授权! 非商业用途转载,请标明本文链接及出处!
赞成、反驳、不解的小伙伴,欢迎一起交流!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?