经纬度计算距离公式
对以上公式描述
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 + " 千米");
}
}