php开发笔记-计算距离,通过当前位置查询周边500米范围内的数据

本文来自我的博客:http://lwxshow.com/php-search-through-the-current-location-within-500-meters-around-the-data

 

数据库结构    X 与Y 联合索引速度会快更多
以下为实现代码:自己重写,我只是实现了一下

 

 

 
  1. define(EARTH_RADIUS, 6371);//地球半径,平均半径为6371km   
  2.  /**
  3.  *计算某个经纬度的周围某段距离的正方形的四个点  
  4.  *  
  5.  *@param lng float 经度  
  6.  *@param lat float 纬度  
  7.  *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米  
  8.  *
       array 正方形的四个点的经纬度坐标  
  9.  */  
  10. function returnSquarePoint($lng$lat,$distance = 1){   
  11.   
  12.     $dlng =  2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));   
  13.     $dlng = rad2deg($dlng);   
  14.   
  15.     $dlat = $distance/EARTH_RADIUS;   
  16.     $dlat = rad2deg($dlat);   
  17.   
  18.     return array(   
  19.                 'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),   
  20.                 'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),   
  21.                 'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),   
  22.                 'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)   
  23.                 );   
  24.  }   
  25.  function rad($d)     
  26. {     
  27.     return $d * M_PI / 180.0;     
  28. }     
  29. /**
  30. * 获取两个坐标点之间的距离,单位km,小数点后2位  
  31. */  
  32. function GetDistance($lat1$lng1$lat2$lng2)     
  33. {     
  34.     $EARTH_RADIUS = 6378.137;     
  35.     $radLat1 = rad($lat1);     
  36.     $radLat2 = rad($lat2);     
  37.     $a = $radLat1 - $radLat2;     
  38.     $b = rad($lng1) - rad($lng2);     
  39.     $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));     
  40.     $s = $s * $EARTH_RADIUS;     
  41.     $s = round($s * 100) / 100;   
  42.     $s = $s*1000;     
  43.     return $s;     
  44. }   
  45.  $lng=119.941311;   
  46.  $lat=28.465285;   
  47. //使用此函数计算得到结果后,带入sql查询。   
  48. $squares = returnSquarePoint($lng$lat);   
  49. $host="localhost";    
  50. $db_user="root";    
  51. $db_pass="";    
  52. $db_name="inlishui";    
  53. $link=mysql_connect($host,$db_user,$db_pass);    
  54. mysql_select_db($db_name,$link);    
  55. mysql_query("SET names UTF8");    
  56. $result = mysql_query("select ID,X,Y from `life` where Y<>0 and Y>{$squares['right-bottom']['lat']} and Y<{$squares['left-top']['lat']} and X>{$squares['left-top']['lng']} and X<{$squares['right-bottom']['lng']}");   
  57. while($row=mysql_fetch_array($result)){ //循环的时候每次取一条记录返回的是一维数组   
  58.         $arr[] = array($row[0],$row[1],$row[2]); //在arr数组变量里每次增加数组元素   
  59. }   
  60. foreach ($arr as $key=> $v){   
  61.      $arr[$key][3]=GetDistance($lat$lng$v[2], $v[1]);   
  62. }  

代码输出结果

 
  1. array(3) { [0]=> array(4) { [0]=> string(1) "2" [1]=> string(10) "119.938508" [2]=> string(9) "28.467190" [color=#ff0000][3]=> float(350) [/color]} [1]=> array(4) { [0]=> string(1) "7" [1]=> string(10) "119.941311" [2]=> string(9) "28.465285" [color=#ff0000][3]=> float(0)[/color] } [2]=> array(4) { [0]=> string(2) "10" [1]=> string(10) "119.935642" [2]=> string(9) "28.470417" [color=#ff0000][3]=> float(800)[/color] } }  

你可能感兴趣的:(距离,LBS,lwxshow,舍得Share,php开发笔记)