

1 /**
2 * 将角度转化为弧度
3 */
4 public static double radians(double d)
5 {
6 return d * Math.PI / 180.0;
7 }
8 /**
9 * 根据两点经纬度坐标计算直线距离
10 * <p>
11 * S = 2arcsin√sin²(a/2)+cos(lat1)*cos(lat2)*sin²(b/2) ̄*6378.137
12 * <p>
13 * 1. lng1 lat1 表示A点经纬度,lng2 lat2 表示B点经纬度;<br>
14 * 2. a=lat1 – lat2 为两点纬度之差 b=lng1 -lng2 为两点经度之差;<br>
15 * 3. 6378.137为地球赤道半径,单位为千米;
16 *
17 * @param lng1 点1经度
18 * @param lat1 点1纬度
19 * @param lng2 点2经度
20 * @param lat2 点2纬度
21 * @return 距离,单位千米(KM)
22 * @see <a href="https://zh.wikipedia.org/wiki/%E5%8D%8A%E6%AD%A3%E7%9F%A2%E5%85%AC%E5%BC%8F">半正矢(Haversine)公式</a>
23 */
24 public static double getDistanceFrom2LngLat(double lng1, double lat1, double lng2, double lat2)
25 {
26 //将角度转化为弧度
27 double radLng1 = radians(lng1);
28 double radLat1 = radians(lat1);
29 double radLng2 = radians(lng2);
30 double radLat2 = radians(lat2);
31
32 double a = radLat1 - radLat2;
33 double b = radLng1 - radLng2;
34
35 return 2 * Math.Asin(Math.Sqrt(Math.Sin(a / 2) * Math.Sin(a / 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Sin (b / 2) * Math.Sin (b / 2))) * 6378.137;
36 }
1 SELECT
2 *,
3 6378.138 * 2 * ASIN(
4 SQRT(
5 POW(
6 SIN(
7 (
8 '.$lat.' * PI() / 180 - lat * PI() / 180
9 ) / 2
10 ), 2
11 ) + COS('.$lat.' * PI() / 180) * COS(lat * PI() / 180) * POW(
12 SIN(
13 (
14 '.$lng.' * PI() / 180 - lng * PI() / 180
15 ) / 2
16 ), 2
17 )
18 )
19 ) *1000 AS distance
20 FROM
21 distance
22 ORDER BY
23 distance ASC