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列用于记录两个经纬度坐标之间的距离,可该字段进行排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/610555.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的fork与进程地址空间

目录 前言 一、进程地址空间 二、fork的值返回 三、高清图链接 总结 前言 在博主的《进程状态解析》一文中,在讨论进程创建时,提到了一个系统调用接口fork,它在使用过程中表现出对于父子进程不一致的返回结果,而且似乎还具有…

深入学习指针2

前言 hello,我又来了,今天有我继续带领大家深入的学习指针,通过上次的学习,我们已经了解到了指针的基本概念,指针如何使用,指针使用的益处,以及一些相关的概念,那今天我们就继续深入的学习&am…

Docker笔记(七)使用Docker部署Spring Boot项目

本文介绍如何使用Docker打包并部署Spring Boot多模块项目。 其中本文涉及的Docker的私库是用Nexus3搭建的。 使用Docker部署Spring Boot项目有三种方式 (1)使用 spring-boot-maven-plugin内置的build-image. (2)使用 Google 的 j…

STM32CubeMX软件使用(超详细)

1、Cube启动页介绍 2、芯片选择页面介绍 3、输入自己的芯片型号,这里以STM32U575RIT6举例 4、芯片配置页码介绍 5、芯片外设配置栏详细说明 6、点击ClockConfiguration进行时钟树的配置,选择时钟树后可以选择自己想使用的时钟源,也可以直接输…

MySQL数据库——基础事务操作-BEGIN-COMMIT-ROLLBACK

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,sex char(2) DEFAU…

MySQL企业级开发重点之事物和索引

事物 -- 解散学工部 delete from tb_dept where id 1;-- 删除部门下的员工 delete from tb_emp where dept_id 1; 介绍和操作 我们应该将两个语句写成一个语句 -- 开启事物 start transaction ;-- 解散学工部 delete from tb_dept where id 3;-- 删除部门下的员工 delete fr…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中,有时需要设置为“第X页共X页”这种格式,使用Word中的域功能可实现,同时,在某些情况下,可能还需要减去封面的页码,接下来为具体步…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前,先了解一下声波的概念以及超声波和声波之间的关系 什么是声波? 声波是物体机械振动状态(或能量)的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式,这种振动状…

JAVA文件的简单操作

文件IO(Input和Output) 文件的输入和输出是人为规定的,那么什么是输入?什么是输出捏?在这里统一已CPU为基准 例如:将文件由内存写入硬盘就是输出,有硬盘写入内存就是输入。可以总结为&#xff…

C语言—深入理解指针(3)

1.字符指针变量 一般使用: 另一种使用方法: “hello world”是一个常量字符串,不能被修改。 上述代码是将字符串中的首字符‘h’赋值给指针pstr,用%s打印字符串的时候,只需要提供首字符的地址就行。(如果…

LoadRunner性能测试基本步骤

前言 本文旨在指导初学者使用LoadRunner进行基础的性能测试。 我们在接到一个性能测试任务的时候,需要从以下几点考虑:我们的测试对象是什么,测试要求是什么,测试环境怎么部署的,业务规模如何,哪些业务点是…

这是一关于DSC相关的文档

这是一关于DSC相关的文档 上面这幅图清晰的展示了somewhat flat的像素图示

CRMEB 开源/标准版商城系统客服配置教程

管理后台/设置/系统设置/商城配置/客服端配置 有系统客服/拨打电话/跳转链接可选,系统客服为系统自带的客服系统,拨打电话为用户点击联系客服为拨打客服电话的方式,跳转链接为可以跳转自己开发的客服系统或者第三方的客服系统或者企业微信的…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习,其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统,cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件,大家也可以直接看 ectd-releases 界面选择…

开源交互审计系统:功能强大、安全好用【送源码】

在当今信息化时代,网络安全越来越受到重视。传统的远程控制工具,如RDP、SSH、VNC等,虽然方便易用,但存在安全隐患,容易被黑客利用。很多时候我们都需要做一些防护的处理来来保障网络安全。 今天了不起来分享一款开源好…

OSPF链路状态数据库

原理概述 OSPF是一种基于链路状态的动态路由协议,每台OSPF路由器都会生成相关的LSA,并将这些LSA通告出去。路由器收到LSA后,会将它们存放在链路状态数据库LSDB中。 LSA有多种不同的类型,不同类型的LSA的功能和作用是不同的&…

LearnOpenGL(十一)之光源

一、投光物 将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 二、平行光 当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行,我们可以称这些光为平行光。当我们使用一个假设光源处于无限远处的模型时,它就被称为定向…

django显示网页步骤

显示网页步骤 小白的django学习笔记 2024/5/6 8:30 文章目录 显示网页步骤创建输入框(文本、单选、多选)效果如何在django中显示网页写函数配置地址运行,要选择这个工程名的,使用socket复制ip,后面在加上名字,成功&…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说,一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件,凭借其卓越的性能和丰富的功能,让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

react+antd --- 日期选择器,动态生成日期表格表头

先看一下效果---有当前月的日期 技术: 1: react 2:antd-UI库 -- table 3:moment--时间处理库 代码效果: import { Button, DatePicker, Table } from antd; import { useEffect, useState } from react; import moment from moment;function Club() {const [selecte…
最新文章