下面这个函数(PHP实现)用于计算两个地理坐标之间的距离,主要用于处理源自Google地图的坐标数据。
验证数据:[48.856667, 2.350987], [38.895113, -77.036366]
验证结果:6172.4281776242KM
01 | /** |
02 | * Calculate the distance between two coordinates. |
03 | * @param array $s, array(float:latitude, float: longitude) |
04 | * @param array $e, array(float:latitude, float: longitude) |
05 | * @return float, the distance |
06 | */ |
07 | function geo_distance( $s , $e ) { |
08 |
09 | //earth's mean radius in KM |
10 | $r = 6378.137; |
11 |
12 | $s [0] = deg2rad ( $s [0]); |
13 | $s [1] = deg2rad ( $s [1]); |
14 |
15 | $e [0] = deg2rad ( $e [0]); |
16 | $e [1] = deg2rad ( $e [1]); |
17 |
18 | $d0 = abs ( $s [0] - $e [0]); |
19 | $d1 = abs ( $s [1] - $e [1]); |
20 |
21 | $p = pow(sin( $d0 /2), 2) + cos ( $s [0]) * cos ( $e [0]) * pow(sin( $d1 /2), 2); |
22 |
23 | $ds = $r * 2 * asin(sqrt( $p )); |
24 |
25 | return $ds ; |
26 | } |
MySQL Function
01 | DELIMITER // |
02 | CREATE FUNCTION geo_distance(lat1 FLOAT , lng1 FLOAT , lat2 FLOAT , lng2 FLOAT ) RETURNS FLOAT |
03 | BEGIN |
04 |
05 | DECLARE r INT DEFAULT 6378137; |
06 | DECLARE s0 FLOAT ; |
07 | DECLARE s1 FLOAT ; |
08 | DECLARE e0 FLOAT ; |
09 | DECLARE e1 FLOAT ; |
10 |
11 | DECLARE d0 FLOAT ; |
12 | DECLARE d1 FLOAT ; |
13 |
14 | SET s0 = RADIANS(lat1); |
15 | SET s1 = RADIANS(lng1); |
16 | SET e0 = RADIANS(lat2); |
17 | SET e1 = RADIANS(lng2); |
18 |
19 | SET d0 = ABS (s0 - e0); |
20 | SET d1 = ABS (s1 - e1); |
21 |
22 | RETURN r * 2 * ASIN(SQRT(POW(SIN(d0/2),2) + COS(s0)*COS(e0)*POW(SIN(d1/2),2))); |
23 |
24 | END // |
25 |
26 | DELIMITER ; |