ThinkPHP实现经纬度范围查询

thinkphp实现附近范围的查询,如附近的人和附近团购之类。

首先,要定位用户的经纬度。客户端定位的方法可以使用地图api或者用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条件有很好的封装,超级便捷

$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)

 

posted @ 2015-02-15 18:11  村长叫我返去扒龙船  阅读(4020)  评论(0编辑  收藏  举报