mysql根据经纬度查询范围内数据,并根据距离排序

最近接到一个新需求,要根据经纬度查询指定范围内的数据,并且根据距离进行排序,网上找了找相关实现方法,记录一下。

java代码如下

public final class DistanceUtils {/*** 地球半径,单位 km*/private static final double EARTH_RADIUS = 6378.137;/*** 根据经纬度,计算两点间的距离** @param longitude1 第一个点的经度* @param latitude1  第一个点的纬度* @param longitude2 第二个点的经度* @param latitude2  第二个点的纬度* @return 返回距离 单位千米*/public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {// 纬度double lat1 = Math.toRadians(latitude1);double lat2 = Math.toRadians(latitude2);// 经度double lng1 = Math.toRadians(longitude1);double lng2 = Math.toRadians(longitude2);// 纬度之差double a = lat1 - lat2;// 经度之差double b = lng1 - lng2;// 计算两点距离的公式double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));// 弧长乘地球半径, 返回单位: 千米s =  s * EARTH_RADIUS;return s;}public static void main(String[] args) {double d = getDistance(116.308479, 39.983171, 116.353454, 39.996059);System.out.println(d);}
}

返回的单位是千米,如果想返回米,可以修改地球半径的单位从千米到米,并且由于该结果是double类型的,所以还可以借助Math.round方法进行四舍五入为long类型,然后精确到米:

// ......
// 弧长乘地球半径(6378137)
s =  s * EARTH_RADIUS;
// 返回类型: long,单位: 米
return Math.round(s * 10000) / 10000;

MySQL实现,我是采用的这种方法,实现起来更简单

测试表结构如下CREATE TABLE `markers` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,`name` VARCHAR( 60 ) NOT NULL ,`address` VARCHAR( 80 ) NOT NULL ,`lat` FLOAT( 10, 6 ) NOT NULL ,`lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;

当然存储引擎可以是InnoDB。

需要用到st_distance函数
MySQL其实在很早就提供了这种存储经纬度及相关运算的功能,这种数据类型叫做空间数据类型,而对应的索引被称为空间索引,但由于MySQL之前的版本对InnoDB支持的并不是太好,所以使用的并不多。不过MySQL5.6和MySQL5.7对此进行了优化,添加了st_distance等相关函数来支持经纬度相关的计算。

SELECTs.*, (st_distance(point(lng, lat), point(-122.083235, 37.38714) ) * 111195) AS distance
FROMmarkers s
ORDER BYdistance

搭配下面根据距离计算经纬度范围代码,拼接上sql条件即可

 /*** 根据范围计算经纬度** @param longitude 纬度* @param latitude 经度* @param dis 范围 单位为千米* @return 结果*/public static Map<String, Double> calcLatitudeAndLongitude(double longitude, double latitude, double dis) {double dlng = 2 * Math.asin(Math.sin(dis / (2 * EARTH_RADIUS)) / Math.cos(latitude * Math.PI / 180));//角度转为弧度dlng = dlng * 180 / Math.PI;double dlat = dis / EARTH_RADIUS;dlat = dlat * 180 / Math.PI;//最小纬度double minlat = latitude - dlat;//最大纬度double maxlat = latitude + dlat;//最小经度double minlng = longitude - dlng;//最大经度double maxlng = longitude + dlng;HashMap<String, Double> hashMap = new HashMap<>();hashMap.put("minlng", minlng);hashMap.put("maxlng", maxlng);hashMap.put("minlat", minlat);hashMap.put("maxlat", maxlat);return hashMap;}

参考链接:
https://blog.csdn.net/qq_35071164/article/details/90602501
点击直达

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

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

相关文章

JobDataMap 更新_04

第2篇讲述了怎样给job传递参数或者随机数&#xff0c;但是&#xff0c;这个随机数不会更新&#xff0c;举个例子&#xff0c;执行第一次job的时 随机数3 &#xff0c;执行第2次job&#xff0c;随机数仍然是3&#xff0c;因为执行每一次job都会实例化job实例对象 JobDataMap更新…

高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用

在消息队列中&#xff0c;当消费者去消费消息的时候&#xff0c;无论是通过 pull 的方式还是 push 的方式&#xff0c;都可能会出现大批量的消息突刺。如果此时要处理所有消息&#xff0c;很可能会导致系统负载过高&#xff0c;影响稳定性。但其实可能后面几秒之内都没有消息投…

32岁程序员,补偿N+2:“谢谢裁我,让我翻倍!” 网友:榜样!

2019年的冬天&#xff0c;“冷”的有些频繁。12月19日&#xff0c;《马蜂窝被曝裁员40% UGC模式变现难&#xff1f;》爆火&#xff0c;据悉马蜂窝将裁员40%&#xff0c;交易中心成了“重灾区”&#xff0c;赔偿N2&#xff0c;留下的除搜索推荐、内容中心等核心部门外&#xff0…

TableStore:爬虫数据存储和查询利器

TableStore是阿里云自研的在线数据平台&#xff0c;提供高可靠的存储&#xff0c;实时和丰富的查询功能&#xff0c;适用于结构化、半结构化的海量数据存储以及各种查询、分析。 爬虫数据特点 在众多大数据场景中&#xff0c;爬虫类型的数据非常适合存储在TableStore。主要是…

PageHelper分页时超过最大数量的页数仍然返回数据,PageHelper分页失效

最近使用PageHelper来进行分页查询&#xff0c;发现一个问题&#xff1a;明明查询出来的总数只有5个&#xff0c;分页的时候每页10个&#xff0c;按理说只有第一页返回会有数据&#xff0c;第二页开始就没有数据了&#xff0c;但是实际情况却是第二页返回的数据与第一页一致&am…

三七女生节,解密阿里女程序员们的代码诗!

女生节快要到了&#xff0c;小编火速在阿里的程序员群体中发掘出了一群才华横溢的程序媛&#xff01;今天就和大家分享下&#xff0c;阿里背后写代码、修bug的女生们&#xff01; 巾帼不让须眉&#xff0c;如今越来越多的女性同胞参与到IT行业&#xff0c;这个行业因为她们的参…

Trigger触发器_05

什么是Trigger触发器&#xff1f; 定时任务按照什么方式去执行&#xff0c;按照Trigger设定好的方式去执行。比如说&#xff1a;按照每5秒执行一次 Trigger触发器的公共属性 jobKey属性&#xff1a;当Trigger触发时被执行job的身份 startTime属性&#xff1a;设定Trigger第一次…

python find方法的复杂度_python内置的方法的时间复杂度

下列字典的平均情况基于以下假设&#xff1a;1. 对象的散列函数足够撸棒(robust)&#xff0c;不会发生冲突。2. 字典的键是从所有可能的键的集合中随机选择的。小窍门&#xff1a;只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度&#xff0c;但会对常数项产生显…

云+X案例展 | 传播类:九州云 SD-WAN 携手上海电信,助力政企客户网络重构换新颜...

戳蓝字“CSDN云计算”关注我们哦&#xff01;本案例由九州云投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击阅读原文丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“…

利用blink+MQ实现流计算中的超时统计问题

案例与解决方案汇总页&#xff1a;阿里云实时计算产品案例&解决方案汇总 一. 背景介绍 菜鸟的物流数据本身就有链路复杂、实操节点多、汇总维度多、考核逻辑复杂的特点&#xff0c;对于实时数据的计算存在很大挑战。经过仓配ETL团队的努力&#xff0c;目前仓配实时数据已覆…

excel导出java.lang.ArrayIndexOutOfBoundsException: 0 POI导出excel报错数组下标越界0

好久没写博客了&#xff0c;最近是有点懒了。。。 最近项目遇到个问题&#xff0c;用poi导出excel&#xff0c;本地和测试服务器都没问题&#xff0c;线上所有的导出都不能用&#xff0c;排查过JKD版本和配置文件都没问题&#xff0c;百思不得其解&#xff0c;最终问了朋友考虑…

Spring Schema整合Quartz_01

文章目录一、实现思路二、第一种实现方式2.1. 新建web项目2.2. 导入依赖2.3. 创建一个job类2.4. 创建配置文件2.5. 配置web.xml2.6.运行web服务&#xff0c;观察Quartz定时任务三、第二种实现方式3.1. 创建job类3.2. 修改spring-config.xml3.3. 运行web服务&#xff0c;观察Qua…

使用Grab的实验平台进行混沌实验编排

背景 对每个用户来说&#xff0c;Grab是一个可以叫车&#xff0c;叫外卖或付款的一个APP。对工程师来说&#xff0c;Grab是一个有许多服务并通过RPC交互的分布式系统&#xff0c;有时也可以叫做微服务架构。在数千台服务器上运行的数百个服务每天都有工程师在上面进行变更。每…

c++ 麦克风 录音 wav_小米有品上线新品,手机麦克风得到史诗级加强

手机里面是自带录音功能的&#xff0c;所以很多朋友都喜欢用手机来记录会议等内容&#xff0c;但是手机自带的麦克风用来录音并不合适&#xff0c;要么声音小&#xff0c;要么录下来的都是杂音&#xff0c;难道非要买一个专用的录音笔或者麦克风吗&#xff1f;其实没有那个必要…

云+X案例展 | 民生类: “中企通信 × TutorABC”共创全球数字教育科技新里程

本案例由中企通信投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。TutorABC荣获IDC 【讯…

ESB接口调用异常汇总

文章目录一、ESB接口前置知识1. ESB接口简述2. 生成的代码组成部分二、常见的异常汇总2.1. 场景1&#xff1a;不能解析某域名2.2. 场景2&#xff1a;调用服务连接超时三、调用服务前异常3.1. 异常描述3.2. CXF相关的jar和jdk的rt.jar中冲突3.3. 异常现象3.4. 异常日志3.5. 异常…

基于实时计算(Flink)与高斯模型构建实时异常检测系统

案例与解决方案汇总页&#xff1a;阿里云实时计算产品案例&解决方案汇总 1. 概述 异常检测&#xff08;anomaly detection&#xff09;指的是对不符合预期模式或数据集&#xff08;英语&#xff1a;dataset&#xff09;中其他项目的项目、事件或观测值的识别。实际应用包括…

hive 中某个字段等于0_快速了解hive

作者丨HappyMint文章选摘&#xff1a;大数据与人工智能这是作者的第7篇文章本文主要针对从事大数据分析和架构相关工作&#xff0c;需要与hive打交道但目前对hive还没有进行深层次了解的小伙伴&#xff0c;希望本文会让你对hive有一个快速的了解。内容主要包括什么是hive、为什…

利用blink CEP实现流计算中的超时统计问题

案例与解决方案汇总页&#xff1a;阿里云实时计算产品案例&解决方案汇总 一. 背景介绍 如<利用blinkMQ实现流计算中的延时统计问题>一文中所描述的场景&#xff0c;我们将其简化为以下案例&#xff1a; 实时流的数据源结构如下&#xff1a; 物流订单号支付时间仓接…

PPT素材网

PPT素材推荐 官网&#xff1a;http://www.1ppt.com/ 背景色采用这个&#xff0c;模板才用这个 简洁微立体创业融资计划书PPT模板免费下载 http://www.1ppt.com/article/33315.html