mysql语句,根据传入的经纬度,查询距离最近的地点和距离

经纬度计算距离公式

在这里插入图片描述

对以上公式描述

1.Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度;
2.a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
3.6378.137为地球半径,单位为千米;
4.计算出来的结果单位为千米,若将半径改为米为单位则计算的结果单位为米。
5.计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下。

参数说明:

longitude:经度
latitude:纬度
地球半径:6378.137(千米)

sql

SELECT
	*,
	6378.138 * 2 * ASIN(
	SQRT(
	POW( SIN( ( '#{latitude}' * PI( ) / 180 - latitude * PI( ) / 180 ) / 2 ), 2 ) + COS( '#{latitude}' * PI( ) / 180 ) * COS( latitude * PI( ) / 180 ) * POW( SIN( ( '#{longitude}' * PI( ) / 180 - longitude * PI( ) / 180 ) / 2 ), 2 ) 
	) 
	) AS distance 
FROM
	t_gas_station 
ORDER BY
	distance ASC

举例

SELECT
	*,
	6378.138 * 2 * ASIN(
	SQRT(
	POW( SIN( ( '116.310317' * PI( ) / 180 - latitude * PI( ) / 180 ) / 2 ), 2 ) + COS( '116.310316' * PI( ) / 180 ) * COS( latitude * PI( ) / 180 ) * POW( SIN( ( '39.956074' * PI( ) / 180 - longitude * PI( ) / 180 ) / 2 ), 2 ) 
	) 
	) AS distance 
FROM
	s_administrative_divisions 
ORDER BY
	distance ASC
SELECT  
    (6371 * acos(  
        cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lng2) - radians(lng1)) +  
        sin(radians(lat1)) * sin(radians(lat2))  
    )) AS distance  
FROM (  
    SELECT   
        39.9042 AS lat1,  -- 第一个点的纬度  
        116.4074 AS lng1,  -- 第一个点的经度  
        40.0042 AS lat2,  -- 第二个点的纬度  
        116.3074 AS lng2   -- 第二个点的经度  
) AS coordinates;

java实现方式

public class DistanceCalculator {

    private static final int EARTH_RADIUS_KM = 6371; // 地球半径,单位:千米

    /**
     * 将角度转换为弧度
     * @param angle 角度值
     * @return 弧度值
     */
    private static double toRadians(double angle) {
        return Math.toRadians(angle);
    }

    /**
     * 使用Haversine公式计算两点之间的距离
     * @param lat1 第一个点的纬度
     * @param lon1 第一个点的经度
     * @param lat2 第二个点的纬度
     * @param lon2 第二个点的经度
     * @return 两点之间的距离,单位:千米
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        double dLat = toRadians(lat2 - lat1);
        double dLon = toRadians(lon2 - lon1);

        lat1 = toRadians(lat1);
        lat2 = toRadians(lat2);

        double a = Math.pow(Math.sin(dLat / 2), 2)
                + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS_KM * c;

        return distance;
    }

    public static void main(String[] args) {
        double lat1 = 35.25936; // 第一个点的纬度
        double lon1 = 118.94701; // 第一个点的经度
        double lat2 = 36.22337; // 第二个点的纬度
        double lon2 = 125.94682; // 第二个点的经度

        double distance = calculateDistance(lat1, lon1, lat2, lon2);
        System.out.println("两点之间的距离是: " + distance + " 千米");
    }
}

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值