ThinkPHP+MySQL查询数据的时候计算两个经纬度之间的距离
需求,数据表中有lng(经度)lat(维度)两个字段,查询数据的时候要计算记录经纬度距离目标经纬度之间的距离。
(图片来源网络,侵删)
方法中还有根据生日计算年龄(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列用于记录两个经纬度坐标之间的距离,可该字段进行排序。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
