thinkphp實現附近範圍的查詢,如附近的人和附近團購之類。php
首先,要定位用戶的經緯度。客戶端定位的方法可使用地圖api或者用html5瀏覽器定位(比較不穩定並且不會太精確)。html
而後,將當前經緯度,和須要搜索的距離範圍,計算一個經緯度範圍,這個範圍就是「附近」。計算這個「附近」的示例以下:html5
/** * * @param $latitude 緯度 * @param $longitude 經度 * @param $raidus 半徑範圍(單位:米) * @return multitype:number */ public function getAround($latitude,$longitude,$raidus){ $PI = 3.14159265; $degree = (24901*1609)/360.0; $dpmLat = 1/$degree; $radiusLat = $dpmLat*$raidus; $minLat = $latitude - $radiusLat; $maxLat = $latitude + $radiusLat; $mpdLng = $degree*cos($latitude * ($PI/180)); $dpmLng = 1 / $mpdLng; $radiusLng = $dpmLng*$raidus; $minLng = $longitude - $radiusLng; $maxLng = $longitude + $radiusLng; return array (minLat=>$minLat, maxLat=>$maxLat, minLng=>$minLng, maxLng=>$maxLng); }
而後,把得到的經緯度距離,組裝成sql。thinkPHP對sql條件有很好的封裝,超級便捷git
$array = $this->getAround($lat, $lng, 2000); $condition['latitude'] = array(array('EGT',$array['minLat']),array('ELT',$array['maxLat']),'and');//(`latitude` >= minLat) AND (`latitude` <=maxLat) $condition['longitude'] = array(array('EGT',$array['minLng']),array('ELT',$array['maxLng']),'and');//(`longitude` >= minLng) AND (`longitude` <= maxLng)