给定一个坐标和一个距离,查询数据库所有在这个范围的商店。

首先计算在这个范围的四个点,这四个点链接成一个正方形这个范围相切。

double minlat = 0;//定义经纬度四个极限值。
double maxlat = 0;
double minlng = 0;
double maxlng = 0;
//我数据保存的经纬度是string,所以要转一下类型方便计算距离。  shopParam是传参。
double longitude = Double.parseDouble(shopParam.getLongitude());
double latitude = Double.parseDouble(shopParam.getLatitude());// 先计算查询点的经纬度范围
double r = 6371;// 地球半径千米
double dis = 20;// 距离(单位:千米),查询范围 20km内的所有商铺
double dlng = 2 * Math.asin(Math.sin(dis / (2 * r))/ Math.cos(longitude * Math.PI / 180));
dlng = dlng * 180 / Math.PI;// 角度转为弧度
double dlat = dis / r;
dlat = dlat * 180 / Math.PI;
if (dlng < 0) {minlng = longitude + dlng;//拿到最大经度和最小经度maxlng = longitude - dlng;
} else {minlng = longitude - dlng;maxlng = longitude + dlng;
}
if (dlat < 0) {minlat = latitude + dlat;//拿到最大纬度和最小纬度maxlat = latitude - dlat;
} else {minlat = latitude - dlat;maxlat = latitude + dlat;
}log.info("最大经度:{},最小经度:{}",maxlng,minlng);
log.info("最大纬度:{},最小纬度:{}",maxlat,minlat);
final List<Shop> shops = Lists.newArrayList();//定义一个空 list保存范围内的店铺
final List<Shop> shopList = shopMapper.selectNearShopList();//查询所有商铺
for (Shop shop:shopList) {double _long = Double.parseDouble(shop.getLongitude());//拿到店铺的坐标,判断是否在这个范围内double _lat = Double.parseDouble(shop.getLatitude());if (_long >= minlng && _long <= maxlng && _lat >= minlat && _lat <= maxlat){shops.add(shop);//将在这个范围内的店铺添加到一个空list中。}
}
Map<Shop,Double> map = new HashMap<Shop, Double>();//定义一个空的map存储店铺
//计算范围内每个店铺距离给定坐标的距离
for (Shop _shop:shops) {Double distance = LocationUtils.getDistance(Double.parseDouble(_shop.getLatitude()),Double.parseDouble(_shop.getLongitude()),latitude,longitude);log.info("店铺名称:{},经度:{},纬度:{},距离:{}",_shop.getShopName(),_shop.getLongitude(),_shop.getLatitude(),distance);map.put(_shop,distance);//将计算出来的距离作为value,该店铺作为key
}
final List<Shop> list = Lists.newArrayList();//存储排序之后的店铺
//这里使用Java8的map根据value排序,距离最近排序,按value排序,升序
Map<Shop,Double> doubleMap = map.entrySet().stream().sorted(comparingByValue()).collect(toMap(e -> e.getKey(), e -> e.getValue(), (e1, e2) -> e2,LinkedHashMap::new));
for (Map.Entry<Shop, Double> entry:doubleMap.entrySet()) {list.add(entry.getKey());//循环map拿到key并保存到list中。
}

下面这个是上述代码中用到的LocationUtils工具类

public class LocationUtils {private static double EARTH_RADIUS = 6378.137;private static double rad(double d) {return d * Math.PI / 180.0;}/*** 通过经纬度获取距离(单位:米)* @param lat1* @param lng1* @param lat2* @param lng2* @return*/public static double getDistance(double lat1, double lng1, double lat2,double lng2) {double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)+ Math.cos(radLat1) * Math.cos(radLat2)* Math.pow(Math.sin(b / 2), 2)));s = s * EARTH_RADIUS;s = Math.round(s * 10000d) / 10000d;s = s*1000;return s;}}

这个方法是用纯Java语言实现,只是方便用来学习的,真正的企业项目不建议使用,如果数据量较小可以使用。数据量过大可以使用sql语句实现,这里就不赘述了,不同公司使用的算法各不相同。如果有什么错误欢迎留言指正,也可私信给我,欢迎转载记得贴上出处 (。 ◕ ˇ ∀ ˇ ◕)。

Java语言查询附近店铺算法相关推荐

  1. java 语言实现的随机数生成算法

    ----------------------疯狂软件java培训分享--------------------- 广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂 ...

  2. 数据结构java语言kmp_数据结构(java语言描述)模式匹配——KMP算法

    关于模式匹配算法,BF是比较号理解的,但是属于暴力匹配,资源浪费太严重. KMP算法确实比较难懂(PS:反正我是看了好久才弄明白,可能也是我理解能力太差=_=) 下面是我的一些心得. http://w ...

  3. 用Java语言编写的特殊算法

    package three; /** 字符操作* 特殊乘法* 写个算法对于两个小于1000000000的输入,求特殊乘法的结果* 特殊乘法举例:123*45 = 1*4+1*5+2*4+2*5+3*4 ...

  4. 基于Java语言的面向对象基础算法的练习

    话不多说,直接上题目: 一.编写 Car 类,属性有品牌(brand)和颜色(color),show 方法打印 所有属性. 代码如下: public static void main(String[] ...

  5. java语言实现常用算法(排序和查找)

    以下是java语言实现的常用算法. 1.冒泡排序 /** 冒泡排序* * 有1至N个数* 第一轮比较N个数,第二轮比较N-1个数,...* 每一轮根据前面一个数和后面一个数比较,如果前者大于后者,交换 ...

  6. java实现随机数生成算法_Java 语言实现的随机数生成算法

    广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者QQ咨询. [导 ...

  7. 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客

    java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...

  8. Java语言开发在线购物推荐网 购物商城推荐系统 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线购物推荐网 购物商城推荐系统 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据.人工智能.机器学习项目开发ShopRec ...

  9. Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...

最新文章

  1. SharePoint 2013 工作流之使用Visio设计篇
  2. Springboot 抛出Failed to determine a suitable driver class异常原因
  3. 洲际的merlin怎么用_天问一号是怎么拍摄地月合影的?
  4. 机器人学习--Turtelbot3学习--如何使用cartographer建图
  5. 那份让我想死的化工原理补考试卷
  6. iotop--补齐系统监视工具缺失的一环
  7. 高精度加法(简明版C语言),高精度加法(简明版C语言)
  8. kicad最小布线宽度默认是多少_超实用PCB布线技巧,菜鸟和老司机都应该知道!...
  9. ios中strong和weak的解释理解
  10. python set_Python Set联合
  11. Android10加入APEX目的
  12. Flex 中使用 FileReference 的 download 方法下载文件时的缓存刷新问题
  13. Cookie、LocalStorage 与 SessionStorage的区别
  14. oracle backup exec,通过Backup Exec实施Oracle灾难恢复
  15. 《基于深度学习的加密流量识别研究》-2022毕设笔记
  16. Unity3d在PC上竖屏运行
  17. 小程序长按识别公众号二维码-已实现
  18. 生死看淡,不服就GAN(六)----用DCGAN生成马的彩色图片
  19. semiplannar 什么是_图像识别VPU——易用的嵌入式AI支持深度学习平台介绍
  20. Openstack-T 之Neutron

热门文章

  1. uniapp uview-ui退出登录后重新登录token不是最新的解决方案
  2. LVGL_V7.7.2_快速概述
  3. 第三十七篇 场效应管模拟开关举例
  4. layui 单元格事件
  5. selenium高级自动化编程
  6. 机器视觉LED光源照明技术说明
  7. 深入理解Lua的闭包:概念和应用
  8. 电路仿真软件LTspice 使用教程
  9. 来到fsb的第24天
  10. 零基础HTML入门教程(11)--初识VSCode