根据经纬度计算距离
SQL 计算距离
SELECT
*,
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
'.$lat.' * PI() / 180 — lat * PI() / 180
) / 2
), 2
) + COS('.$lat.' * PI() / 180) * COS(lat * PI() / 180) * POW(
SIN(
(
'.$lng.' * PI() / 180 — lng * PI() / 180
) / 2
), 2
)
)
) *1000 AS distance
FROM
distance
ORDER BY
distance ASC
Javascript 计算距离
function getDistance(lat1, lng1, lat2, lng2) {
let radLat1 = toRadians(lat1);
let radLat2 = toRadians(lat2);
let deltaLat = radLat1 — radLat2;
let deltaLng = toRadians(lng1) — toRadians(lng2);
let dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
return dis * 6378.137;
function toRadians(d) { return d * Math.PI / 180;}
}
getDistance(39.54, 116.23, 38.85, 115.48) //100.43073284694667 //单位:公里
Java 计算距离
private static final double EARTH_RADIUS = 6378137;//赤道半径
private static double rad(double d){
return d * Math.PI / 180.0;
}
public static double GetDistance(double lon1,double lat1,double lon2, double lat2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 — radLat2;
double b = rad(lon1) — rad(lon2);
double s = 2 *Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2)+Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s * EARTH_RADIUS;
return s; //单位:米
}
Python 计算距离
from math import sin, asin, cos, radians, fabs, sqrt
def haversine(lon1, lat1, lon2, lat2): # 经度1, 纬度1, 经度2, 纬度2 (十进制度数)
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 — lon1
dlat = lat2 — lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径, 单位:为公里
return c * r * 1000
# 38352.523132 (m为单位:)
print haversine(113.973129, 22.599578, 114.3311032, 22.6986848)