MySQL 坐标批量计算及优化

news2024/10/7 2:22:03

文章目录

      • 1、坐标计算
      • 2、优化

现在有一个需求,就是找出距离某用户最近的一些点,一种实现方法就是调用地图的api来计算筛选,另外一种就是在数据库中计算,考虑到地图api有并发量限制,所以选用数据库计算的方式。


1、坐标计算

在MySQL中计算坐标点距离,mysql5.6 提供了st_distance函数,mysql5.7及以上提供了 st_distance_sphere 函数,可以直接查询两个经纬度之间相距多少米。

st_distance_sphere 函数的计算结果要比 st_distance 函数结果更精确。

现数据库表中数据如下:

在这里插入图片描述

例:计算出坐标点(102.683894, 25.038415)与表中所有坐标的距离。

select latitude,longitude,
  TRUNCATE(st_distance_sphere(point(102.683894, 25.038415),point(longitude,latitude)),2) as distance
from h_info_coordinate
where state=1
ORDER BY distance;

这里用 TRUNCATE(x,2)保留了两位小数,距离单位米,结果如下

在这里插入图片描述

如果要筛选3000米以内,则这样写

select latitude,longitude,
  TRUNCATE(st_distance_sphere(point(102.683894, 25.038415),point(longitude,latitude)),2) as distance
from h_info_coordinate
where state=1
HAVING distance > 0 and distance < 3000
ORDER BY distance;

2、优化

上面对于一般的计算量来说没什么问题,但是当数据量达到一定量级以后效率就会下降,对于这种情况,我们其实可以预先在坐标上下功夫,减少不必要的计算,因为实际开发中最大的应用场景是找出一定范围内的点。

我们首先来看经纬度,经度划分为360度,纬度划分为180度。

在这里插入图片描述

1度纬度之间的距离是多少公里?

纬度是平行的,因此理论上,不管在地球哪个地方,1度纬度的距离都是固定的不变的。然而地球的是略呈椭圆形,当我们从赤道到北极和南极时,度数之间产生微小的变化。
在赤道,1度纬度的距离为110.567公里,在南北极点,1度纬度的距离为111.699公里。

所以我们可以看做是:1度纬度为111公里


1度经度之间的距离是多少公里?

与纬度不同,经度之间的距离因你在地球上的位置而异。因为地球是个球体,所以肯定赤道相距最远,两极会聚成一点。

在两极极点地区,1度经度之间的距离为0,它们已经变成了一个点;在北纬40度或南纬40度处,1度经度之间的距离为85公里;赤道最长为111.321公里;

在这里插入图片描述

综上所述,我们可以大致筛选我们需要计算的坐标,纬度一度111公里,而经度看所处地区,也可以直接按最大值111公里来筛选,所以比如我们要计算50公里范围内的坐标,则经纬度可以上下浮动大致0.5度(实际度数50/111=0.45),如下

select latitude,longitude,
  TRUNCATE(st_distance_sphere(point(102.683894, 25.038415),point(longitude,latitude)),2) as distance
from h_info_coordinate
where state=1
and latitude > '25.038415' - 0.5 
and latitude < '25.038415' + 0.5
and longitude > '102.683894' - 0.5 
and longitude < '102.683894' + 0.5
ORDER BY distance;

这样,需要计算的坐标变少了,效率自然提高了。



更多技术干货,请持续关注程序员大佬超。
原创不易,转载请注明出处。

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

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

相关文章

Python实现HBA混合蝙蝠智能算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

成功升级scikit-image的版本,从老版本0.13.0到0.17.2

成功升级scikit-image的版本&#xff0c;从老版本0.13.0到0.17.2 之前参考其他博客升级scikit-image的版本没有成功&#xff0c;这次参考scikit-image的github官网&#xff0c;顺利实现了升级。 scikit-image的github官网中关于安装的介绍页 https://github.com/scikit-imag…

Dubbo入门实战最全攻略(基于 Spring Boot 实现)

Dubbo应用 RPC通信 Apache Dubbo 3构建在 HTTP/2 协议之上&#xff0c;具有更好的穿透性与通用性 &#xff0c; 支持基于 IDL 的服务定义 集成了业界主流的大部分协议&#xff0c;使得用户可以在 Dubbo 框架范围内使用这些通信协议 &#xff0c; 这些协议包括 rest、hessian…

【动态规划】三步问题

&#x1f9c1;题目描述&#xff1a; 示例&#xff1a; &#x1f9c0;(1)题目解析&#xff1a; 小孩每一次可以走1,2,3步&#xff0c;那么形成不同的排列组合&#xff0c;会有很多种上楼梯方式。 &#x1f9c0;(2)算法原理&#xff1a; &#x1f951;[1]状态表示 根据题目要…

【C++杂货铺】构造函数和析构函数

文章目录 一、类的六个默认成员函数二、构造函数三、析构函数 一、类的六个默认成员函数 &#x1f4d6;默认成员函数 用户没有显式实现&#xff0c;编译器会自动生成的成员函数&#xff0c;称为默认成员函数。 构造函数&#xff1a;完成对象的初始化工作。析构函数&#xff…

容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档

一、Docker docker是一种开源的应用容器引擎&#xff0c;可以将应用程序和依赖打包成一个可移植的镜像&#xff0c;然后发布到任何支持docker的平台上&#xff0c;也可以实现虚拟化。docker的核心概念有三个&#xff1a;镜像&#xff08;image&#xff09;、容器&#xff08;co…

QT中QTimer的循环时间与槽函数执行时间以及在事件循环中触发,不同时间的结果分析

目录 当循环时间小于槽函数时间时&#xff1a; 当循环间隔时间大于槽函数时间时&#xff1a; 当存在两个定时器器&#xff0c;其中一个还是间隔100ms&#xff0c;另一个间隔1000ms&#xff1a; 当两个定时器的循环周期大于槽函数执行时间时 当在主程序中添加一个for循环…

怎么把视频转为gif动态图,3个方法轻松转换!

如何将视频转换为GIF动态图呢&#xff1f;相信许多人在日常聊天中喜欢使用各种有趣的表情包。每当互联网上出现一些有趣的热门视频时&#xff0c;我们也往往会看到许多相关的GIF表情包。那么我们应该如何将自己的视频或者一些有趣的视频制作成GIF动态图呢&#xff1f;下面我就为…

从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)

目录 1. AVL树的概念 2. AVL树结点和树的定义 3. AVL树的插入&#xff08;未包含旋转&#xff09; 4. AVL树的旋转 4.1 右右_左单旋 4.2 左左_右单旋 4.3 左右双旋 4.4 右左双旋 5. AVL树的验证 6. AVL树的删除(了解)和性能 7. AVL树插入验证完整代码 8. AVL树笔试…

下载pdm遇到的坑:Could not find a version that satisfies the requirement pdm

pip install pdm遇到的问题&#xff1a; Could not find a version that satisfies the requirement pdm (from versions: ) No matching distribution found for pdm检查了版本后发现&#xff0c;python版本在3.6&#xff0c;pdm不支持该版本 换成python3.7版本&#xff0c;则…

【力扣算法14】之 15. 三数之和 python

文章目录 问题描述示例1示例2示例 3提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] num…

python编程语言之数据类型进阶操作

数值常用操作 python常用关于数值&#xff0c;数学常用的模块&#xff1a;math&#xff08;数学&#xff09;&#xff0c;random&#xff08;随机&#xff09;&#xff0c;numpy&#xff08;科学计算&#xff09;&#xff0c;pandas&#xff08;数据读写&#xff0c;数据分析&…

Yalmip入门教程(3)-约束条件的定义

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 之前的博客简单介绍了约束条件的定义方法&#xff0c;接下来将对其进行详细介绍。 首先简单复习一下&#xff1a; 1.定义约束条件可以使用矩阵拼接…

如何通过nvm管理多个nodejs版本

随着前端项目的越来越多&#xff0c;不同项目使用的nodejs版本可能不一样&#xff0c;导致在切换不同项目时需要更换不同的nodejs版本&#xff0c;非常麻烦。本次推荐使用nvm进行多个nodejs版本的统一管理。 1、nvm的下载 nvm全称Node Version Manager&#xff0c;即Node版本管…

科技政策 | 2023年广东省省级企业技术中心(第22批)认定开始啦!

原创 | 文 BFT机器人 原文链接&#xff1a; http://gdii.gd.gov.cn/zwgk/tzgg1011/content/post_4218083.html 各企业请注意&#xff0c;2023年广东省省级企业技术中心&#xff08;第22批&#xff09;认定已经开始了&#xff0c;广东省工业和信息化厅接收资料截止时间为2023年…

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳,持续更新中 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01;得益于各位朋友的支持和关注&#xff0c;我的专栏《Java基础…

Python实战项目——物流行业数据分析(二)

今天我们对物流行业数据进行简单分析&#xff0c;数据来源&#xff1a;某企业销售的6种商品所对应的送货及用户反馈数据 解决问题&#xff1a; 1、配送服务是否存在问题 2、是否存在尚有潜力的销售区域 3、商品是否存在质量问题 分析过程&#xff1a; 依旧先进行数据处理 一…

vue Duplicate keys detected: ‘‘. This may cause an update error. found in

错误原因&#xff1a; 在使用v-for的时候&#xff0c;都要必须加上一个唯一的key值&#xff0c;key的值写成一样的了。所以就导致了警告。尽量不要使用index下标作为key值 换成后台数据返回的id或者i*随机数作为key值就好

linux中快速定位软件安装位置

linux中快速定位软件安装位置步骤如下&#xff1a; 根据进程的名字定位进程ID ps -ef | grep redis通过进程id查找软件安装位置 ll -l /proc/100788/cwd原理说明&#xff1a; linux中进程启动后&#xff0c;会在/proc/目录下新建进程工作目录; 目录规范为&#xff1a;/proc/…

寻找下一个生成式 AI 独角兽,亚马逊云科技创业加速器火热招募中!

生成式AI让人工智能技术又一次破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。它正在掀起新一轮的科技革命&#xff0c;为人类带来前所未有的颠覆性的影响&#xff0c;而诸多创业者也应势而上&#xff0c;寻求创新机遇。生成式AI可以创造全新的客户体验、提高企业内…