ThinkPHP+MySQL查询数据的时候计算两个经纬度之间的距离

2024-05-13 1661阅读

需求,数据表中有lng(经度)lat(维度)两个字段,查询数据的时候要计算记录经纬度距离目标经纬度之间的距离。

ThinkPHP+MySQL查询数据的时候计算两个经纬度之间的距离
(图片来源网络,侵删)

方法中还有根据生日计算年龄(YEAR(CURDATE()) - YEAR(birthday)) AS age

    public function get_lists(){
        $request = $this->request->get();
//获取前端传来的目标经纬度
        if(empty($request['lng']) || empty($request['lat'])){
            $this->error('位置信息错误');
        }
        $where = [];
        $lists = PurposeModel::alias('p')
            ->join('user u','p.user_id = u.id')
            ->join('resume r','p.user_id = r.user_id')
            ->join('category c','p.category_id = c.id')
            ->where($where)
            //根据生日计算年龄(YEAR(CURDATE()) - YEAR(birthday)) AS age 根据经纬度计算距离
            ->field('p.user_id,r.name,u.avatar,(YEAR(CURDATE()) - YEAR(birthday)) AS age,r.sex,c.name as category_name
                        ,p.gongzhong,p.work_begin,p.work_end,p.rest_begint,p.rest_end,p.city,p.address,'.getDistanceBuilder($request['lat'], $request['lng']))
            ->paginate();
        $this->success('获取成功',$lists);
    }

在common.php中添加下面的方法

if (!function_exists('getDistanceBuilder')) {
    /**
     * 数据库查询的时候计算两点距离,命名为 distance 字段
     * @param string $lat 维度
     * @param string $lng 经度
     * 返回的距离字段 distance 单位是米
     * p.lat是我的表别名和维度字段名
     * p.lng是我的表别名和经度字段名
     * 字段名要根据自己的表的别名进行修改
     * @return string
     */
    function getDistanceBuilder($lat, $lng) {
        return "ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN((". matchLatLng($lat) . " * PI() / 180 - p.lat * PI() / 180) / 2), 2) + COS(". matchLatLng($lat). " * PI() / 180) * COS(p.lat * PI() / 180) * POW(SIN((". matchLatLng($lng). " * PI() / 180 - p.lng * PI() / 180) / 2), 2))) * 1000) AS distance";
    }
}
if (!function_exists('matchLatLng')) {
    function matchLatLng($latlng) {
        $match = "/^\d{1,3}\.\d{1,30}$/";
        return preg_match($match, $latlng) ? $latlng : 0;
    }
}

代码就可以实现在查询结果中增加distance列用于记录两个经纬度坐标之间的距离,可该字段进行排序。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]