现在的位置: 首页 > 综合 > 正文

mysql函数-根据经纬度坐标计算距离

2018年04月18日 ⁄ 综合 ⁄ 共 2124字 ⁄ 字号 评论关闭
  在实际的Web开发中,越来越多的碰到一些特定领域的专业算法,比如本文提到的根据两点经纬度计算距离的方法。 
通常的两种计算: 
1。要算的距离是椭球面的距离 
    设第一点A的经纬度为(LonA, LatA),第二点B的经纬度为(LonB, LatB),按照0度经线的基准,东经取经度的正值(Longitude),西经取经度负值(-Longitude),北纬取90-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。那么根据三角推导,可以得到计算两点距离的如下公式: 
C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB) 
Distance = R*Arccos(C)*Pi/180 
    这里,R和Distance单位是相同,如果是采用6371.004千米作为半径,那么Distance就是千米为单位,如果要使用其他单位,比如mile,还需要做单位换算,1千米=0.621371192mile 
如果仅对经度作正负的处理,而不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应用意义)的处理,那么公式将是: 
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB) 
Distance = R*Arccos(C)*Pi/180 

2。google地图提供的方法(PHP版本) 
Php代码  收藏代码
  1. class Distance{  
  2. const EARTH_RADIUS = 6378.137; // earth radius (const) kilometer  
  3.   
  4.     /** 
  5.      * 
  6.      *  Example: 
  7.      *      $precision = 49; 
  8.      *      ini_set("precision", $precision); 
  9.      *      echo pi(); //will output 3.141592653589793115997963468544185161590576171875 
  10.      * 
  11.      *      1 kilometer = 0.621371192 mile 
  12.      * 
  13.      *  @param double d 
  14.      *  @return double data 
  15.      */  
  16.     private function rad( $d )  
  17.     {  
  18.         return $d * M_PI / 180.0;  
  19.     }  
  20.   
  21.     /** 
  22.      * 
  23.      *  Example : get_distance(44.2112,-88.4175,34.5082,-82.6498) 
  24.      *  Get Distance between two point : longitude,latitude(lat1,lng1 => lat2,lng2 ) 
  25.      * 
  26.      *  @param double d 
  27.      *  @return double data 
  28.      * 
  29.      */  
  30.     public function get_distance( $lat1$lng1$lat2$lng2$base = 1000 )  
  31.     {  
  32.         $radLat1 = floatval$this->rad($lat1) );  
  33.         $radLat2 = floatval$this->rad($lat2) );  
  34.         $a = $radLat1 - $radLat2;  
  35.         $b = $this->rad($lng1) - $this->rad($lng2);  
  36.   
  37.         $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));  
  38.   
  39.         $s = $s * self::EARTH_RADIUS;  
  40.         $s = round($s * 10000) / 10000;  
  41.   
  42.         return $s;  
  43.     }  
  44. }  



    第一种方法计算繁琐,我们通常采用的还是第二种方法。但是,无论是第一种还是第二种如果直接用编程语言来转换的话,会非常耗时,因为,我们通常不得不将全部结果查出,然后再逐个计算过滤以得到结果集,如果需要排序,那将更加耗时。 

    一个优化的方法就是采用SQL函数,具体的Mysql Function请参见附件,注意其中的括号,默认单位是公里,如果要转换成英里,请参考本文中PHP Code注释部分自行修改。

转至:http://lesorb.iteye.com/blog/1945755


抱歉!评论已关闭.