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)
时间: 2024-10-14 05:25:45

ThinkPHP实现经纬度范围查询的相关文章

thinkphp 用户登录,查询,大小写区分

mysql查询默认不区分大小写,这在用户登录验证等情况下明显行不通.不过可以加一个关键字,binary,用二进制查询的方式. 而在thinkphp中没有这个查询条件,只好用原生sql查询实现. publicfunction loginCheck(){ $username = I('param.username'); $password = I('param.password'); // echo "<center>".$username." ".$pas

thinkphp分页时保持查询条件

thinkphp 查询数据时需要分页显示时,会出现只有第1页是按查询条件查到的数据,而其他页面都恢复了,我们想要的结果却是:在翻页时,查询条件保持不变. 原因是:在分页跳转的时候,没有将查询条件作为分页参数传递到下一页.原来翻页的时候,存储在REQUEST变量中的参数并未被传递到下一页,因为表单的 method = “post”,而点击进入下一页时,很明显form表单被重置了,所以打印REQUEST变量也是空的. thinkphp RBAC的示例代码中给出了: PHP $p = new Page

【php】thinkphp以post方式查询时分页失效的解决方法

好久没有写博客了,最近说实话有点忙,各个项目都需要改bug.昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢博客园大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题,也是因为刚入手thinkphp.在做项目的过程中,因为需要非常多的查询条件,如果以get方式提交表单的话,会因为url长度限制而报错,所以必须使用post方式提交表单数据,但是在分页的过程中,遇到了问题,因为thinkphp自带的分页是以a标签的形式,进行下一页的,这样查询条件就没有传入后台,导致

微信如何根据经纬度坐标查询具体地理位置

微信如何根据经纬度坐标查询具体地理位置 好多人会问为什么微信高级接口获取的坐标信息位置不准,主要原因不是微信获取的不准,而是微信获取的是gps坐标,如果你直接用百度或google的api去解析的话肯定会出现误差的. 首先你需要吧gps位置转换成google或者百度的坐标,然后在通过转换后的坐标去获取准确的地理位置. 方法一:gps转换成google或者百度坐标,转换gps的接口 http://map.yanue.net/gps.html 方法二:gps转换成百度坐标 function getgp

thinkphp 同一字段不同查询条件实现

搞定了 另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起,例如:$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or'); 最后的查询条件是:(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')

Thinkphp回顾之(四)查询方法深入学习

本次讲的查询方法主要有:表达式查询,模糊查询,between语句,in语句,区间查询,统计数据,普通方式查询,但大多数都只是引入数组而已,明白了第一个,其他的也就差不多全明白了,唯一要注意的是在后台中notlike中间没空格,而not in,not between中间必须有空格才能有效,不要与后面的前台标签搞混了,话不多说,直接上代码 public function showone(){ echo "欢迎你".$_GET['name'];//在页面上直接就可以Index/show/na

ThinkPHP中 按条件查询后列表显示

最近在项目中遇到了需要根据下拉框的条件筛选出符合条件的数据,然后进行列表显示的问题. 在ThinkPHP中进行列表显示的传统过程:通过在后台控制器中查询出数据,然后通过$this->assign()来实现控制器数据向页面的传递,在页面中通过<foreach>或<volist>标签来进行数据的解析,(注:在通过标签进行数据的解析时需要以“$”符号的形式). 在进行条件查询时,需要通过jquery中ajax的方式将条件GET到后台控制器,后台控制器中接收数据,然后根据条件进行查询

thinkphp left join关联查询

使用sql查询:SELECT a.*,b.gs_schoolnamecn,b.gs_schoolnameen FROM tsh_greenaction a  LEFT JOIN tsh_greenschool b on a.greenschoolid=b.id 使用thinkphp连贯操作: $model=M('greenaction'); $list=$model->alias('a')->join(' LEFT JOIN tsh_greenschool b on a.greenschool

ThinkPHP 分页中带入查询(搜索)条件

parameter 属性赋值 例如要检索用户表中状态为 1 (status=1) 并且电子包含 163 的用户,当提交表单时(注意表单是 GET 方式提交),形成的 URL 地址大致如下: http://www.5idev.com/index.php/Index/search/status/1/email/163 在搜索操作(search)中主要代码如下: public function search(){ $Dao = M("User"); // 构造查询条件 $condition[