计算地球上两点的距离

基础

经度 longitude 经度值必须在(-180,180]范围内,正值位于本初子午线以东。
纬度 latitude 纬度值必须在[-90,90]范围内,正值位于赤道以北。
0°纬线是指赤道,赤道是最大的纬线圈,赤道周长40076km。
地球半径约为6371km。

坐标系

不同的地图、包括mysql,使用的坐标系有所差异。
以下链接关于坐标系的内容仅可供参考
0
1
2
3
4

计算工具

geodatasource
YoviSun工具集

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);
		}
	}
}

参考


版权声明:本文所有权归作者! 商业用途转载请联系作者授权! 非商业用途转载,请标明本文链接及出处!
赞成、反驳、不解的小伙伴,欢迎一起交流!

posted @   码文采  阅读(215)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示