java和sql计算两点经纬度距离的两种方式

一、java

public class GeoUtil {
     private static final double EARTH_RADIUS = 6371393; // 平均半径,单位:m
        
        /**
         * 通过AB点经纬度获取距离
         * @param longitude1 A点(经)
         * @param latitude1 A点(纬)
         * @param longitude2 B点(经)
         * @param latitude2 B点(纬)
         * @return 距离(单位:米)
         */
        public static double getDistance(Double longitude1,Double latitude1, Double longitude2,Double latitude2) {
            Point2D pointA = new Point2D.Double(longitude1, latitude1);
            Point2D pointB = new Point2D.Double(longitude2,latitude2);
            // 经纬度(角度)转弧度。弧度用作参数,以调用Math.cos和Math.sin
            double radiansAX = Math.toRadians(pointA.getX()); // A经弧度
            double radiansAY = Math.toRadians(pointA.getY()); // A纬弧度
            double radiansBX = Math.toRadians(pointB.getX()); // B经弧度
            double radiansBY = Math.toRadians(pointB.getY()); // B纬弧度
     
            // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
            double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
                    + Math.sin(radiansAY) * Math.sin(radiansBY);
            double acos = Math.acos(cos); // 反余弦值
            return EARTH_RADIUS * acos; // 最终结果
        }
        
        public static void main(String[] args) {
            // 北京 天安门
            Point2D pointTAM = new Point2D.Double(116.403882, 39.915139);
            // 广州 越秀公园
            System.out.println(getDistance(116.403882, 39.915139,113.272422,23.147387));
            //1887KM
        }
}

二、sql()

1、赤道半径

select 1, 6378137*2*ASIN(SQRT(POWER(SIN((39.915139-23.147387)*ACOS(-1)/360),2)
+COS(39.915139*ACOS(-1)/180)*COS(23.147387*ACOS(-1)/180)
*POWER(SIN((116.403882-113.272422)*ACOS(-1)/360),2))) AS distance
from user 
-- 1889719.8835222987 6378137 地球赤道半径6378.137千米

2、平均半径
-- 1887721.7654363303 6371393 平均半径约6371千米
SELECT  
          1, (  
           6371393 * acos (  
              cos ( radians(39.915139) )  
              * cos( radians( 23.147387 ) )  
              * cos( radians( 116.403882 ) - radians(113.272422) )  
              + sin ( radians(39.915139) )  
              * sin( radians( 23.147387 ) )  
            )  
          ) AS distance  
FROM user a
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值