thinkphp实现附近范围的查询,如附近的人和附近团购之类。首先,要定位用户的经纬度。客户端定位的方法可以使用地图api或者用html5浏览器定位(比较不稳定而且不会太精确)。然后,将当前经纬度,和需要搜索的距离范围,计算一个经纬度范围,这个范围就是“附近”。要有mysql数据库的支持,效果图:
代码如下 |
复制代码 |
/*
参数说明:
$lng 经度
$lat 纬度
$distance 周边半径 默认是500米(0.5Km)
*/
function returnSquarePoint($lng, $lat,$distance = 0.5)
{
$dlng = 2 * asin(sin($distance / (2 * 6371)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);
$dlat = $distance/6371;
$dlat = rad2deg($dlat);
return array(
'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
);
}
|
在文件中调用并组成条件:
代码如下 |
复制代码 |
$array = $this->returnSquarePoint($latitude, $longitude, 5);
|
生成Thinkphp查询条件
代码如下 |
复制代码 |
$map = array(
"latitude" => array(array('EGT',$array['right-bottom']['lat']),array('ELT',$array['left-top']['lat']),'or'),
"longitude" => array(array('EGT',$array['left-top']['lng']),array('ELT',$array['right-bottom']['lng']),'or'),
"status" => array("eq",1),
);
|
生成sql:
查询结果: