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

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
点击直达

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

  1. mysql根据经纬度查询范围内的数据

    distance:范围 lat:纬度 lot:经度 <select id="xx" parameterType="xx" resultType=" ...

  2. mysql 根据经纬度查询规定范围内符合坐标的店铺并优化查询的sql语句

    $ lat:纬度, $ lon:经度, 优化查询:latitude < ".($ lat+1)." and latitude> ".($ lat-1).&qu ...

  3. Mysql查询时间段内数据,并处理相同日期或同类型的数据

    Mysql查询时间段内数据 表如图,表名为demo,表为某库存量的实时更新表 主要数据为:time时间数据,amount库存量数据 Mysql查询时间段内的数据可以用between方法 select ...

  4. Supermap GIS二次开发之查询面内数据是否有点数据

    Supermap GIS二次开发之查询面内数据是否有点数据 作者:谢景,撰写时间:2019-1-18 在我们进行GIS二次开发的时候,经常会需要查询某个面区域里是否有点数据,或者是面区域里面的点数据是 ...

  5. MySQL删除或清空表内数据的方法

    MySQL删除或清空表内数据的方法 一.使用MySQL清空表数据命令:truncate SQL语法为: truncate table 表名 注意: truncate该命令会直接将数据表内数据清空: t ...

  6. MySql中实现 按经纬度搜索附近的人,并按距离排序的简单实现

    按经纬度搜索附近的人,并按距离排序的简单实现. 2016年05月31日 23:26:17 阅读数:7235 按经纬度搜索附近的人,并按距离排序的简单实现 这是一种简单的实现,数据量不大的情况下还是能满 ...

  7. nodejs操作mysql查询返回的数据_nodejs连接mysql进行数据库查询返回前台数据的坑...

    之前本来想用mongodb进行数据库的操作,后来一想自己之前简单的用过mysql,就直接使用了mysql,一下午的时间一直走在nodejs查询数据然后返回给前台的这个过程,怎么说呢,在这个过程遇到了两 ...

  8. Mysql实现根据经纬度查询周围的商家,并按距离进行排序

    今天要说的是如何在Mysql中实现根据已知的经纬度查询周围的商家(或者是别的带有经纬度字段的表)并且根据距离的远近来进行排序! 废话就不多说了,直奔主题~ 首先有这么个商城表 lng代表经度,lat代 ...

  9. MySql根据经纬度查询任意距离范围内数据

    sql代码#当前位置经纬度 经度:117.215637 纬度:39.1373367 #表中经纬度字段 经度:longitude 纬度:latitude select * from( SELECT id ...

最新文章

  1. Java中的Map集合遍历总结(详尽版)
  2. [程序员创造力训练 1] 猜单词 - 关于健康
  3. rest模式get,post,put,delete简单讲解
  4. 「MySQL」 - SQL设计规范
  5. “非”天才女程序员的人生
  6. 幼儿园带括号算式口诀_这么全的小学数学速算技巧、口诀不多见,教给孩子挺不错!...
  7. 员工薪酬管理设计方案
  8. python11_Python11,文件操作
  9. sql SQL Server角色成员身份和权限简介
  10. 读《Linux运维之道》有感
  11. 使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
  12. 学习linux 服务器安全这一篇文章就够了
  13. 微信小程序 - 婚礼邀请函
  14. 基于SSH高校毕业生去向信息管理系统
  15. 微信公众平台如何给粉丝分组打标签?
  16. Mybatis Plus自动生成代码
  17. 计算机的隐藏功能文字,键盘上那些隐藏的快捷键,内有彩蛋呦!
  18. Keil5使用命令行自动复制编译文件
  19. 学习mybatis plus
  20. 《区域分析与规划高级教程》读书笔记

热门文章

  1. IO之 随机访问文件(RandomAccessFile)
  2. java中调用System.currentTimeMillis()获取当前时间来求出时间差及程序执行的时间
  3. Delta3d组件机制
  4. Dubbo-go 服务代理模型
  5. 重新认识访问者模式:从实践到本质
  6. Let‘s Fluent:更顺滑的MyBatis
  7. 知道这些用于数据科学和机器学习的GitHub存储库和Reddit主题吗?
  8. Web 前端自学很苦?来,手把手教你,拿下前端!
  9. 主动安全,新华三融合生态之力!
  10. php 实例化模型出错,实例化model出错了