根据经纬度坐标 计算两点的球面距离

地球半径取6378.138千米,输出distance单位米。

SQL写法:

复制代码
select 
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            latitude1 * PI() / 180 - latitude2 * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS(latitude1 * PI() / 180) * COS(latitude2 * PI() / 180) 
            * POW(     SIN(     (     longitude1 * PI() / 180 - longitude2 * PI() / 180     ) / 2   ),    2   ) ) ) * 1000 ) AS distance from table where id = 28;
复制代码

执行结果:

 

 

Java程序写法:

复制代码
public double getDistance(double lon1, double lat1, double lon2, double lat2) {

        // 地球半径
        double EARTH_RADIUS = 6378.138;
        
        //经纬度转换成弧度
        lat1 = ConvertDegreesToRadians(lat1);
        lon1 = ConvertDegreesToRadians(lon1);
        lat2 = ConvertDegreesToRadians(lat2);
        lon2 = ConvertDegreesToRadians(lon2);

        //差值
        double vLon = Math.abs(lon1 - lon2);
        double vLat = Math.abs(lat1 - lat2);

        double h = HaverSine(vLat) + Math.cos(lat1) * Math.cos(lat2) * HaverSine(vLon);

        double distance = 2 * EARTH_RADIUS * Math.asin(Math.sqrt(h));

        return distance;
    }

    // HaverSine公式
    public double HaverSine(double x)
    {
        double v = Math.sin(x / 2);
        return v * v;
    }
    
    // 将角度换算为弧度
    public static double ConvertDegreesToRadians(double degrees)
    {
        return degrees * Math.PI / 180;
    }
复制代码

 

 
posted @   果冻迪迪  阅读(1353)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示