解决方案-LBS用户位置GEO附近人/店铺

news2025/7/20 13:18:39

在这里插入图片描述

附近人

  • 附近人列表功能
    • mysql
    • redis GEO
    • thinkphp

附近人列表功能

方案优势缺点
Mysql外接正方形逻辑清晰,实现简单,支持多条件筛选效率较低,不适合大数据量,不支持按距离排序
Mysql+Geohash借助索引有效提高效率,支持多条件筛选不支持按距离排序,存在数据库瓶颈
Redis+Geohash效率高,集成便捷,支持距离排序不适合复杂对象存储,不支持多条件查询

mysql

轻量级  1w 以内 

经纬度  --->  四个临界点

redis GEO

地理位置操作


GEOADD   将指定的地理空间位置   经度纬度 名称  存储到指定key

GEORADIUS   以给定的经纬度为中心   找出某一半径内元素




thinkphp


// 假设您已经获取了用户的经纬度和需要搜索的距离范围
$lng = $_GET['lng']; // 用户的经度
$lat = $_GET['lat']; // 用户的纬度
$distance = $_GET['distance']; // 需要搜索的距离范围,单位为千米

// 计算经纬度范围
$earth = 6378.137; // 地球半径
$pi = 3.1415926535898; // 圆周率
$lng_min = $lng - rad2deg($distance / $earth / cos(deg2rad($lat)));
$lng_max = $lng + rad2deg($distance / $earth / cos(deg2rad($lat)));
$lat_min = $lat - rad2deg($distance / $earth);
$lat_max = $lat + rad2deg($distance / $earth);

// 查询商品表,根据距离排序,取前10条数据
$goods = Db::name('goods')
    ->field("*, (2 * $earth * asin(sqrt(pow(sin($pi * ($lat - lat) / 360), 2) + cos($pi * $lat / 180) * cos(lat * $pi / 180) * pow(sin($pi * ($lng - lng) / 360), 2)))) as distance")
    ->where('lng', 'between', [$lng_min, $lng_max])
    ->where('lat', 'between', [$lat_min, $lat_max])
    ->order('distance', 'asc')
    ->limit(10)
    ->select();

// 返回推荐商品的数据
return json($goods);


<html>
<head>
    <meta charset="utf-8">
    <title>商品推荐</title>
    <style>
        .goods {
            display: flex;
            flex-wrap: wrap;
            justify-content: space-around;
            margin: 20px;
        }
        .item {
            width: 200px;
            height: 300px;
            border: 1px solid #ccc;
            margin: 10px;
            padding: 10px;
            box-sizing: border-box;
        }
        .item img {
            width: 180px;
            height: 180px;
        }
        .item h3 {
            font-size: 16px;
            margin: 10px 0;
        }
        .item p {
            font-size: 14px;
            color: #666;
        }
    </style>
</head>
<body>
    <div class="goods"></div>
    <script>
        // 假设您已经获取了用户的经纬度和需要搜索的距离范围
        var lng = 120.15; // 用户的经度
        var lat = 30.28; // 用户的纬度
        var distance = 10; // 需要搜索的距离范围,单位为千米

        // 发送Ajax请求,获取推荐商品的数据
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://localhost/goods?lng=' + lng + '&lat=' + lat + '&distance=' + distance);
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                var data = JSON.parse(xhr.responseText);
                // 渲染商品列表
                var goods = document.querySelector('.goods');
                goods.innerHTML = '';
                for (var i = 0; i < data.length; i++) {
                    var item = document.createElement('div');
                    item.className = 'item';
                    item.innerHTML = `
                        <img src="${data[i].image}" alt="${data[i].name}">
                        <h3>${data[i].name}</h3>
                        <p>价格:${data[i].price}元</p>
                        <p>距离:${data[i].distance.toFixed(2)}千米</p>
                    `;
                    goods.appendChild(item);
                }
            }
        };
        xhr.send();
    </script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

密码学三 btc 钱包 节点 挖矿 51%攻击 双花攻击

03-BTC-数据结构_哔哩哔哩_bilibili 哈希指针并解释 比特币的每个区块都包含一个区块头和区块体两部分。 在区块头中,有一个字段是用于存储前一个区块的哈希值,我们把这个存储前一个区块哈希值的字段称为“哈希指针”。 这个哈希指针的作用是将本区块指向前一个区块,连接起整…

Library projects cannot set applicationId. applicationId is set to

Library projects cannot set applicationId. applicationId is set to com.xxx.library_cache in default config. 删掉即可

RTSP/Onvif安防视频平台EasyNVR级联至EasyNVS系统不显示通道,是什么原因?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 我们在此前的文章中也介绍过关于EasyNVR级联EasyNVS上云网关综合管理平台的内容&#xff…

Kotlin之Hello,World

一、新建Kotlin项目 二、设置Gradle为本地目录 #下载地址 https://gradle.org/releases/ 配置阿里云镜像 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } mavenCentral()}buil…

模型量化笔记--对称量化和非对称量化

1–量化映射 量化映射的通用公式为: r S ( q − Z ) r S(q - Z) rS(q−Z) 其中r表示量化前数据的真实值&#xff0c;S表示缩放因子&#xff0c;q表示量化后的数值&#xff0c;Z表示零点 2–非对称量化 非对称量化需要一个偏移量Z来完成零点的映射&#xff0c;即量化前的零…

Facebook注册失败?速看最新注册指南

我们都知道单个代理地址注册多个社媒账号&#xff0c;基本第二天都会进入到一个风控状态&#xff0c;要申诉或者封号&#xff0c;批量注册需要用不同的地址进行注册&#xff0c;下面是需要准备到的环境和材料以及注册的全流程。 一、环境需求 1、接码平台 这个网络上有非常多…

【QT】界面布局-登陆窗口

记录页面布局-登陆窗口的流程 &#xff08;1&#xff09;继承QWidget &#xff08;2&#xff09;设置标签 &#xff08;3&#xff09;单行文本编辑 &#xff08;4&#xff09;按钮 开始设置布局&#xff0c; 法1&#xff1a;使用Horizontal layout&#xff0c;但是不方便 法2…

WebSocket: 实时通信的新维度

介绍&#xff1a; 在现代Web应用程序中&#xff0c;实时通信对于提供即时更新和交互性至关重要。传统的HTTP协议虽然适合请求-响应模式&#xff0c;但对于需要频繁数据交换的场景并不理想。而WebSocket技术的出现填补了这个空白&#xff0c;为Web开发者们带来了一种高效、实时的…

联邦学习+梯度+梯度剪枝

联邦学习需要参与者在每一次的本地训练后&#xff0c;上传所更新的模型参数并与其他参与者共享&#xff0c;而参数更新中仍有可能包含所有者的敏感信息 解决方案&#xff1a; 加密方法&#xff08;安全多方计算、同态加密&#xff09;通过将明文编码为密文的方式&#xff0c;…

MySql分区介绍和Range案例

MySql分区介绍和Range案例 什么是表分区&#xff1f; 通俗地讲表分区是将一个大表&#xff0c;根据条件分割成若干个小表。mysql5.1开始支持数据表分区。 如&#xff1a;某用户表的记录超过了600万条仓储信息&#xff0c;那么就可以根据入库日期将表分区&#xff0c;也可以根…

爬取某网站计算机类图书

网页链接&#xff1a; https://www.ptpress.com.cn/shopping/search?tagsearch&orderstrhot&leve11-75424c57-6dd7-4d1f-b6b9-8e95773c0593 一、为了完成爬取数据&#xff0c;需要进行以下步骤 1.在浏览器中打开页面&#xff0c;选择"计算机" 2.可以看到…

2023年淘宝天猫京东双11红包领取口令入口怎么领取使用淘宝天猫京东双十一红包?

2023年淘宝/天猫、京东双十一红包领取活动即将开始&#xff01; 使用下面提供的淘宝/天猫、京东双11红包口令可以领取淘宝天猫、京东2023年双十一红包&#xff1b; 一、2023年淘宝/天猫双11红包活动时间与规则 1.1、淘宝/天猫双11红包领取时间 2023年10月24日20:00开始至11月…

Numpy(三)Numpy的函数与排序

Numpy&#xff08;三&#xff09;Numpy的函数与排序 一、通用函数 *通用函数使得Numpy数组操作用于数组中的每一个函数。它通常用C语言实现&#xff0c;可以提升执行效率。 1.1数学运算函数 1.1.1算数运算函数&#xff1a;通常使用的加、减、乘、除、乘方等数学运算符号 ①…

HCIA --- VLAN实验配置

一、各交换机上配置&#xff1a; 1、各交换机上创建VLAN 2、交换机上的各个接口划分到对应的VLAN中 3、将与交换机、路由器相连的接口创建trunk干道 SW1&#xff1a; [sw1]vlan batch 2 to 3 批量创建VLAN2-3 [sw1]interface Ethernet0/0/1 单独将某个接口划分到对应…

【Release】Photoshop ICO file format plug-in 3.0

【Introduction】 The Photoshop ICO plug-in is a file format plug-in developed for Photoshop, which allows Photoshop to directly read and write ICO format files. Because Photoshop has powerful pixel bitmap editing functions, it has many users and a good us…

Kotlin注释

一、设置注释样式 按需配置 二、单行多行注释 fun main() {// 单行注释println("单行注释") //单行注释/** 多行注释* */println("多行注释") }

<el-drawer>中在添加弹窗,遮罩层被覆盖

添加这个属性 <el-dialog :append-to-body"true"> </el-dialog>

nginx.2——优化和防盗链

1、隐藏版本号 bug多。更新版本速度比较快&#xff0c;所以一旦版本号暴露出去&#xff0c;有可能给对方提供攻击的漏洞。 方法一 vim /usr/local/nginx/conf/nginx.conf 开server_tokens on; 关server_tokens off; 在http大模块中修改&#xff0c;不再server中&#xf…

腾讯云最新优惠活动入口整理分享

腾讯云作为国内知名的云计算服务提供商&#xff0c;一直以来都为广大的个人用户和企业用户提供优质、稳定、安全的云服务。为了帮助大家更好地利用腾讯云&#xff0c;下面为大家整理分享一些腾讯云的最新优惠活动入口&#xff0c;希望能够为大家带来一些帮助和便利。 一、腾讯云…

误删除数据恢复?恢复数据,这3个方法足够!

“我已经遇到很多次数据误删除的情况了&#xff01;每次都要重写文件。但是这次的文件比较紧急&#xff0c;重写肯定来不及了&#xff0c;想问问大家有没有什么误删除数据恢复的方法呀&#xff1f;” 在使用电脑时&#xff0c;很多用户都不可避免会出现误删数据的情况。面对重要…