PHP/Lerv通过经纬度计算距离获取附近商家

实际开发中,常常需要获取用户附近的商家,思路是

  • 获取用户位置(经纬度信息)
  • 在数据库中查询在距离范围内的商家

注: 本文章内计算距离所使用地球半径统一为 6378.138 km

public function mpa_list($latitude,$longitude,$distance)
    {
        // $latitude = 34.306465;
        // $longitude = 109.050952;
        // $distance = 5;
        //1.计算最大最小经纬度范围
        $range  = 180 / pi() * $distance / 6378.138; //搜索 N km 之内
        $lngR   = $range / cos($latitude * pi() / 180);
        $maxLat = $latitude + $range; //最大纬度
        $minLat = $latitude - $range; //最小纬度
        $maxLng = $longitude + $lngR; //最大经度
        $minLng = $longitude - $lngR; //最小经度
        //2.查找经纬度符合条件的商家
        $list = Village::select("id","title","longitude","latitude")
                ->whereBetween('latitude', [$minLat, $maxLat])
                ->whereBetween('longitude', [$minLng, $maxLng])
                ->where('status', 1)
                ->get();
        //3.计算距离
        foreach ($list as &$item){
            $item['distance'] = $this->getDistanceBy2Point([$longitude, $latitude], [$item['longitude'], $item['latitude']]);
        }
        if($list){
            $list = $list->toArray();
        }
        //4.排序
        $list = $this->arraySort($list, 'distance');

        return $list;
    }

二维数组排序方法

// 二维数组排序方法
    public static function arraySort($arr, $field, $sort = SORT_ASC){
        $key = array_column($arr, $field);
        array_multisort($key, $sort, $arr);
        return $arr;
    }

根据经纬度计算两点距离

    /**
     * 根据起点坐标和终点坐标测距离
     * @param  [array]   $from     [起点坐标(经纬度),例如:array(118.012951,36.810024)]
     * @param  [array]   $to     [终点坐标(经纬度)]
     * @param  [bool]    $km        是否以公里为单位 false:米 true:公里(千米)
     * @param  [int]     $decimal   精度 保留小数位数
     * @return [string]  距离数值
     */
    public static function getDistanceBy2Point($from, $to, $km = true, $decimal = 2){
        sort($from);
        sort($to);
        $EARTH_RADIUS = 6378.138; // 地球半径系数
        $distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000;
        if($km && $distance > 1000){
            return round($distance / 1000, 2) . 'km';
        }
        return round($distance, $decimal) . 'm';
    }

实际测试:我这边的测试数据比较少,我就用了50公里范围之内的。因为我的数据库里面只添加了连个测试商家,大家将就看一下,理解了就行了。

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

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

相关文章

基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能

笔记/朱季谦 在写React前端逻辑时,经常遇到可以切换不同条件的列表查询功能,例如下边截图这样的,其实,这块代码基本都一个逻辑,可以一次性将实现过程记录下来,待以后再遇到时,直接根据笔记复用…

阿里云4核8G服务器优惠价格表,最低价格501.90元6个月、983.80元1年

阿里云4核8G服务器优惠价格表,云服务器ECS计算型c7实例4核8G配置3M带宽40GB ESSD云盘(系统盘)叠加使用优惠券后价格501.90元6个月、983.80元1年,现在购买经济型e、通用算力型u1、计算型c7和计算型c8a与c8i实例4核8G配置均有优惠&a…

怎么查看虚拟机的网关

1、点击编辑,再选择虚拟网络编辑器 2、选择VMnet8,点击NAT设置 3、查看网关IP

互联网行业以前是以前,现在是现在

目前互联网行业呈现出多个趋势与现状: 移动互联网普及:随着智能手机的普及,移动互联网已经成为主流,各种APP带来更加方便的服务,这也意味着PC端的互联网服务逐渐被取代。 数字化转型:各个行业都在进行数…

腾讯云轻量数据库试用初体验

腾讯云轻量数据库1核1G开箱测评,轻量数据库服务采用腾讯云自研的新一代云原生数据库TDSQL-C,轻量数据库兼100%兼容MySQL数据库,实现超百万级 QPS 的高吞吐,128TB海量分布式智能存储,虽然轻量数据库为单节点架构&#x…

【Go语言实战】(26) 分布式搜索引擎

Tangseng 基于Go语言的搜索引擎 github地址:https://github.com/CocaineCong/tangseng 详细介绍地址:https://cocainecong.github.io/tangseng 这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hh…

安全知识普及:了解端点检测与响应 (EDR)对企业的重要性

文章目录 EDR 的含义和定义EDR 是如何运作的?收集端点数据将数据发送到 EDR 平台分析数据标记可疑活动并做出响应保留数据以供日后使用 为什么 EDR 对企业至关重要大多数企业都有可能遭受各种网络攻击。有些攻击可以完全绕开企业的防御远程办公让员工缺乏足够的保护…

EOCR电机保护器的日常维护与保养技巧

EOCR是由施耐德韩国公司生产的电动机保护系列产品,由电子器件和互感器等部件组成,在正常状态下使用都有各自的机械寿命和电气寿命,若操作不当或异常条件下会加速电器元件的老化,缩短保护器的使用寿命,所以电机保护器的正确使用和正…

如何安装运行Wagtail,并结合cpolar内网穿透实现公网访问网站界面

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…

openCV教程(三)

文章目录 1 车辆统计项目1.1 背景减除1.2 车辆统计2 特征点检测和匹配2.1 harris角点检测2.2 shi-tomasi角点检测2.3 SIFT关键点检测2.4 SURF特征检测2.5 ORB特征检测3 特征匹配3.1 暴力特征匹配3.2 FLANN特征匹配3.3 图像查找3.3.1 单应性矩阵4 模版匹配4.1 模版匹配4.2 匹配多…

Mybatis和MybatisPlus:数据库操作工具的对比

目录 什么是mybatis 什么是mybatisplus MyBatis-Plus:为简化数据库操作而生的强大工具 一、MyBatis-Plus的背景和概述 二、MyBatis-Plus的主要特点 三、如何使用MyBatis-Plus mybatis-Plus的优势 什么是Hibernate Hibernate:Java开发者的数据持久…

数字化转型的终局

(1)数字化转型 我手头有一本书叫《提升》,是IBM市场部所属的商业价值研究院在2011年出版的图书。 在书的第三章《数字化转型》一章中第68页提出了”数字化转型“能力: 1、业务模式创新-客户和社区协作-跨渠道整合-数字化供应链 2、…

人工智能的广泛应用与影响

目录 前言1 智能手机与个人助手2 医疗保健3 自动驾驶技术4 金融领域5 教育与学习6 智能家居与物联网7 娱乐与媒体8 环境保护结语 前言 人工智能(Artificial Intelligence,AI)是当今科技领域的璀璨明星,它不仅在技术创新方面掀起了…

【机器学习】036_权重衰退

一、范数 定义:向量的范数表示一个向量有多大(分量的大小) L1范数: 即向量元素绝对值之和,用符号 ‖ v ‖ 1 表示。 公式: L2范数: 即向量的模,向量各元素绝对值的平方之和再…

基于springboot实现智能热度分析和自媒体推送平台系统项目【项目源码】计算机毕业设计

基于springboot实现智能热度分析和自媒体推送平台演示 系统开发平台 在该自媒体分享网站中,Eclipse能给用户提供更多的方便,其特点一是方便学习,方便快捷;二是有非常大的信息储存量,主要功能是用在对数据库中查询和编…

如果在手机没有root的情况下完成安卓手机数据恢复

您是否不小心从安卓设备中删除了重要数据? 担心如何取回您的照片、视频和文档? 有时您可能会不小心删除重要数据并使用安卓 root方法取回文件。 许多用户不喜欢根植他们的安卓设备,因为这是一种复杂的方法。 在本指南中,我们将向您…

【寒武纪(10)】linux arm aarch 是 opencv 交叉编译与使用

文章目录 1、直接找github 别人编译好的2、自主编译参考 3使用CMake检查 参考 1、直接找github 别人编译好的 测试很多,找到一个可用的。 https://github.com/dog-qiuqiu/libopencv 它用了超级模块! OpenCV的world模块也称为超级模块(supe…

【Java基础】Java导Excel攻略

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

HALCON根据需要创建自定义函数

任务要求: 创建函数myfun(a,b,c),输入浮点数a,b的值,计算c a b,将计算结果返回。 操作步骤: 1)打开HDevelop程序 2)打开函数菜单,选择“创建新函数”&#xff0c…

存储配置和挂载方式

存储配置 Iscsi简介 iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。 iSCSI 启动器有三种实现方式:可以完全基于硬件实现,比如 iSCSI H…