SpringBoot(五)Java基于MySQL实现附近的人

v阅读目录 v准备工作 v附近的人 v按距离远近排序 v博客总结 v博客前言 “附近的人”这个功能估计都不陌生,与之类似的功能最开始是在各大地图应用上接触过,比如搜附近的电影院,附近的超市等等。然而真正让附近的人火遍大江南北的应该是微信"附近的人"这个功能,记得微信刚出的时候,坊间还有一句"寂寞女聊玩微信,寂寞男人搜附近"的说法。 回到顶部 v准备工作 创建测试数据库 复制代码 CREATE TABLE `userposition` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `city` varchar(20) NOT NULL, `position` varchar(128) NOT NULL, `longitude` decimal(18,15) NOT NULL, `latitude` decimal(18,15) NOT NULL, PRIMARY KEY (`id`) )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; insert into `userposition` values(1,'北京市','回龙观新村中区', 116.310771,40.06263); insert into `userposition` values(2,'北京市','金域华府', 116.310127,40.064379); insert into `userposition` values(3,'北京市','融泽嘉园中区', 116.311962,40.064822); insert into `userposition` values(4,'北京市','回龙观新村东区', 116.312541,40.063246); insert into `userposition` values(5,'北京市','上地东里', 116.314168,40.033075); 复制代码 测试数据中的经度和纬度可以用高德地图或者百度地图提取。 回到顶部 v附近的人 原理 先算出某个坐标位置周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。 思路 首先算出“给定坐标附近1000米”这个范围的坐标范围。 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围去搜索数据库。圆形内为要求的搜索范围,方形内为我们能间接得到的结果范围。 SpringBoot(五)Java基于MySQL实现附近的人 先来求东西两侧的的范围边界。在haversin公式中令φ1 = φ2,可得 SpringBoot(五)Java基于MySQL实现附近的人 Java实现 复制代码 /** * 查找附近的人 * @param radii 半径距离(单位km) * @param lon 经度 * @param lat 纬度 * @return */ @GetMapping("/nearby") public List getVicinity(double radii, double lon, double lat){ double r = 6371;//地球半径千米 double dis = radii; double dlng = 2*Math.asin(Math.sin(dis/(2*r))/Math.cos(lat*Math.PI/180)); dlng = dlng*180/Math.PI;//角度转为弧度 double dlat = dis/r; dlat = dlat*180/Math.PI; double minlat =lat-dlat; double maxlat = lat+dlat; double minlng = lon -dlng; double maxlng = lon + dlng; return userService.getVicinity(BigDecimal.valueOf(minlng), BigDecimal.valueOf(maxlng), BigDecimal.valueOf(minlat), BigDecimal.valueOf(maxlat)); } 复制代码 mybatis 复制代码 复制代码 复制代码 List getvicinity(@Param("minlng") BigDecimal minlng, @Param("maxlng") BigDecimal maxlng, @Param("minlat") BigDecimal minlat, @Param("maxlat") BigDecimal maxlat); 复制代码 测试效果 在地图中找到回龙新村的经纬度,然后测试。 SpringBoot(五)Java基于MySQL实现附近的人 SpringBoot(五)Java基于MySQL实现附近的人 回到顶部 v按距离远近排序 Java代码 复制代码 /** * 附近的人排序 * @param lon 经度 * @param lat 纬度 * @return */ @GetMapping("/nearbysort") public List getVicinitySort(double lon, double lat){ return userService.getvicinitysort(BigDecimal.valueOf(lon), BigDecimal.valueOf(lat)); } 复制代码 mybatis代码 复制代码 复制代码 复制代码 List getvicinitysort(@Param("longitude") BigDecimal longitude, @Param("latitude") BigDecimal latitude); 复制代码 测试效果 SpringBoot(五)Java基于MySQL实现附近的人 补充,如果需要按距离排序,并返回距离的字段。可以按如下方式实现。 复制代码 SELECT *, ROUND( 6378.138 * 2 * ASIN( SQRT( POW( SIN( ( $latitude * PI() / 180 - latitude * PI() / 180 ) / 2 ), 2 ) + COS($latitude * PI() / 180) * COS(latitude * PI() / 180) * POW( SIN( ( $longitude * PI() / 180 - longitude * PI() / 180 ) / 2 ), 2 ) ) ) * 1000 ) AS distance FROM userposition ORDER BY distance ASC 复制代码 回到顶部 v博客总结 如果数据量大的话,还可以考虑基于Redis实现附近的人。 其他参考资料: 根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法__算法 https://yq.aliyun.com/ziliao/230566 mysql 下 计算 两点 经纬度 之间的距离 https://www.cnblogs.com/sandea/p/4673297.html MYSQL创建一个function用来计算经纬度距离 http://xigua366.iteye.com/blog/2242818 您可以考虑给头头来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx. 微信打赏 微信账号 i7toutou 支付宝打赏 支付宝账号 datou431@qq.com 作  者:请叫我头头哥 出  处:http://www.cnblogs.com/toutou/ 关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力! https://www.cnblogs.com/toutou/p/9771386.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信