根据经纬度获取两点之间的距离(php&mysql)

php 根据坐标点计算周围1公里内的 四个坐标点

    /**
     * 获取距离四个坐标
     * @param $lon
     * @param $lat
     * @param int $distance 默认1KM的距离
     * @return array
     */
    public function getDistance($lon, $lat, $distance = 1)
    {
        $range = 180 / pi() * $distance / 6378.137;
        $lngR = $range / cos($lat * pi() / 180);
        $data = array();
        $data["maxLat"] = $lat + $range;
        $data["minLat"] = $lat - $range;
        $data["maxLng"] = $lon + $lngR;//最大经度
        $data["minLng"] = $lon - $lngR;//最小经度
        return $data;
    }


php

01 //根据经纬度计算距离,单位公里(1000米)
02 function getdistance($lng1,$lat1,$lng2,$lat2){
03     //将角度转为狐度
04     $radLat1=deg2rad($lat1);
05     $radLat2=deg2rad($lat2);
06     $radLng1=deg2rad($lng1);
07     $radLng2=deg2rad($lng2);
08     $a=$radLat1-$radLat2;//两纬度之差,纬度<90
09     $b=$radLng1-$radLng2;//两经度之差纬度<180
10     $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137;
11     return $s;
12 }


mysql函数
view source
print ?
01 DELIMITER $$ 
02     
03 CREATE DEFINER=`root`@`%` FUNCTION `GETDISTANCE`(lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLERETURNS double 
04     
05 READS SQL DATA 
06     
07 DETERMINISTIC 
08     
09 BEGIN 
10     
11 DECLARE RAD DOUBLE
12     
13 DECLARE EARTH_RADIUS DOUBLE DEFAULT 6378137; 
14     
15 DECLARE radLat1 DOUBLE
16     
17 DECLARE radLat2 DOUBLE
18     
19 DECLARE radLng1 DOUBLE
20     
21 DECLARE radLng2 DOUBLE
22     
23 DECLARE DOUBLE
24     
25 SET RAD = PI() / 180.0; 
26     
27 SET radLat1 = lat1 * RAD; 
28     
29 SET radLat2 = lat2 * RAD; 
30     
31 SET radLng1 = lng1 * RAD; 
32     
33 SET radLng2 = lng2 * RAD; 
34     
35 SET s = ACOS(COS(radLat1)*COS(radLat2)*COS(radLng1-radLng2)+SIN(radLat1)*SIN(radLat2))*EARTH_RADIUS; 
36     
37 SET s = ROUND(s * 10000) / 10000; 
38     
39 RETURN s; 
40     
41 END$$ 
42     
43 DELIMITER ;
调用方法
1 SELECT *,latitude,longitude,GETDISTANCE(latitude,longitude,30.663262,104.071619) AS distance FROM  mb_shop_ext where 1 HAVING distance<1000 ORDER BY distance ASC LIMIT 0,10

你可能感兴趣的:(php,mysql)