iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎么使用Java+MySQL实现附近功能
  • 772
分享到

怎么使用Java+MySQL实现附近功能

javamysql 2023-05-30 19:05:50 772人浏览 泡泡鱼
摘要

小编给大家分享一下怎么使用Java+MySQL实现附近功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在移动互联网广泛发展的今天,APP开发成为许多企业进入

小编给大家分享一下怎么使用Java+MySQL实现附近功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言

在移动互联网广泛发展的今天,APP开发成为许多企业进入移动互联网的首选,笔者开发了众多的APP,发现很多app都有这样一个功能,那就是获取附近的人,怎么样来获取附近的人呢?其实很简单,就是要时刻记录用户的坐标(经纬度)信息到数据库中,然后根据当前用户的坐标,搜索数据库中,和当前坐标位置在 一定范围内的所有用户。

其实对于那种地理位置不会变的两个主体之间的距离,最好是直接将结果静态化。也就是直接写死在配置里。

比如,找自己家附近的地铁站。

这种情况下,一般而言“家”这个主体是不会轻易“跑来跑去”的。每次查询都计算一次距离没什么意义。最好是直接将距离持久化后直接查询。

另一种情况:

获取APP用户所在位置附近的地铁站

这种情况下,用户的地理位置是变动的。所以每次都得实时计算实际距离。

实现思路

将地球当做一个标准的球体,使用球面距离公式来计算球面两点间大圆的弧长。

球面距离

public static double getDistance2(double long1, double lat1, double long2, double lat2) { lat1 = rad(lat1); lat2 = rad(lat2); double a = lat1 - lat2; double b = rad(long1 - long2); double sa2 = Math.sin(a / 2.0); double sb2 = Math.sin(b / 2.0); return 2 * EARTH_MEAN_RADIUS_KM * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));}

知道两点之间的经纬度就可以。

当然,这种计算不得不放在数据库里,然后根据距离排序返回。将上面的公式带入到sql里就可以。

附近地铁站示例

建地铁站示例表

CREATE TABLE station( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NULL COMMENT '地铁站名', lng DOUBLE NULL COMMENT '经度', lat DOUBLE NULL COMMENT '维度');

SQL示例

SET @targetLat = 31.175702;SET @targetLng = 121.519095;SELECT s.id , s.name , s.lng , s.lat , ROUND( 6378.138 * 2 * ASIN(  SQRT(  POW(   SIN( ( @targetLat * PI() / 180 - s.lat * PI() / 180 ) / 2 ) , 2 )  +  COS( @targetLat * PI( ) / 180 ) * COS( s.lat * PI( ) / 180 )  * POW( SIN( ( @targetLng * PI() / 180 - s.lng * PI() / 180 ) / 2 ) , 2 )  ) ) * 1000 ) AS distanceFROM station sORDER BY distance ASC , s.idLIMIT 20;

其中的targetLat 和 targetLng 就是用户的地理位置。

这样的确可以达到目的。但是,这是对所有数据先计算了一次和用户的距离后再排序。

地铁站的数量太大的时候这种操作可就不太优雅了。不仅不够优雅,而且效率是很吓人的。

优化

其实,可以在计算距离之前就将很多数据先过滤掉。

没必要在 计算上海地铁站距离的时候将美国的地铁站距离也计算一遍吧。

这在大多数应用中都可以先将一些不需要的数据过滤掉。

比如在数据是区分城市的情况下就可以将SQL改为下面这样:

SET @targetLat = 31.175702;SET @targetLng = 121.519095;SET @cityId=605;SELECT s.id , s.name , s.lng , s.lat , ROUND( 6378.138 * 2 * ASIN(  SQRT(  POW(   SIN( ( @targetLat * PI() / 180 - s.lat * PI() / 180 ) / 2 ) , 2 )  +  COS( @targetLat * PI( ) / 180 ) * COS( s.lat * PI( ) / 180 )  * POW( SIN( ( @targetLng * PI() / 180 - s.lng * PI() / 180 ) / 2 ) , 2 )  ) ) * 1000 ) AS distanceFROM station swhere city_id=@cityId # 先将待计算的数据过滤的一部分ORDER BY distance ASC , s.idLIMIT 20;

上面的改进就是先将待计算的数据在计算之前就剔除大部分。找一个长沙地铁站,没有必要在上海先找一遍吧。

当然,这种情况比较特殊一点,因为你事先能知道用户所处的城市。

另一种改进就是:

以用户所在位置为圆心,画一个半径为R的圆,然后反推出这个圆圈的外接四边形的经纬度范围。在计算距离之前先将外接四边形经经纬度之外的数据过滤掉。

指定一个理想的半径R,先过滤掉不可能符合条件的数据。

反推外接四边形范围

public static Tuple4<Double> calcBoxByDistFromPt(double lng, double lat, double radius) { SpatialContext context = SpatialContext.GEO; Rectangle rectangle = context.getDistCalc()//  .calcBoxByDistFromPt(//   context.makePoint(lng, lat), //   radius * com.spatial4j.core.distance.DistanceUtils.KM_TO_DEG, context, null//  ); return new Tuple4<>(rectangle.getMinX(), rectangle.getMaxX(), rectangle.getMinY(), rectangle.getMaxY());}

这里用到的工具Maven坐标如下:

<dependency> <groupId>com.spatial4j</groupId> <artifactId>spatial4j</artifactId> <version>0.5</version></dependency>

此时的SQL可以改成这样:

SET @targetLat = 31.175702;SET @targetLng = 121.519095;SELECT s.id , s.name , s.lng , s.lat , ROUND( 6378.138 * 2 * ASIN(  SQRT(  POW(   SIN( ( @targetLat * PI() / 180 - s.lat * PI() / 180 ) / 2 ) , 2 )  +  COS( @targetLat * PI( ) / 180 ) * COS( s.lat * PI( ) / 180 )  * POW( SIN( ( @targetLng * PI() / 180 - s.lng * PI() / 180 ) / 2 ) , 2 )  ) ) * 1000 ) AS distanceFROM station sWHERE ( s.lng BETWEEN ${lng1} AND ${lng2} ) AND ( s.lat BETWEEN ${lat1} AND ${lat2} )ORDER BY distance ASC , s.idLIMIT 20;

上面的 lng1,lng2,lat1,lat2 就是外接四边形的范围。

以上是“怎么使用Java+Mysql实现附近功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么使用Java+MySQL实现附近功能

本文链接: https://www.lsjlt.com/news/220423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用Java+MySQL实现附近功能
    小编给大家分享一下怎么使用Java+MySQL实现附近功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在移动互联网广泛发展的今天,APP开发成为许多企业进入...
    99+
    2023-05-30
    java mysql
  • 使用redis实现附近的人功能
    目录前言工具一、测试数据二、基本命令三、javaApi前言 Redis自3.2版本开始提供了GEO(geograph)功能,支持地理位置相关操作,以实现诸如附近的人这类依赖于地理位置...
    99+
    2024-04-02
  • Redis如何实现“附近的人”功能
    这篇文章给大家分享的是有关Redis如何实现“附近的人”功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL...
    99+
    2024-04-02
  • 微服务 SpringBoot 整合 Redis GEO 实现附近商户功能
    文章目录 ⛄引言♨️广播站一、Redis GEO 数据结构用法⛅GEO基本语法、指令⚡使用GEO存储经纬度、查询距离 二、SpringBoot 整合Redis 导入 店铺数据 到GEO三、...
    99+
    2023-09-09
    redis 微服务 spring boot java 内存调优
  • Java 中的附件上传功能怎么利用HttpURLConnection实现
    本篇文章给大家分享的是有关Java 中的附件上传功能怎么利用HttpURLConnection实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 中HttpURLCon...
    99+
    2023-05-31
    java httpurlconnection ava
  • Win10中怎么使用就近共享功能
    这篇文章主要介绍Win10中怎么使用就近共享功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!第一步、如何设置就近共享打开Win10设置,点击体验共享,窗口右侧,我可以从以下项共享或接收内容这个选项可以选择希望能够与...
    99+
    2023-06-27
  • 使用java怎么实现一个ATM功能
    使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言...
    99+
    2023-06-14
  • 怎么使用java代码实现分页功能
    要使用Java代码实现分页功能,你可以按照以下步骤进行操作:1. 首先,确定每页要显示的数据量(例如,每页显示10条数据)。2. 获...
    99+
    2023-09-16
    java
  • vue中百度地图定位及附近搜索功能使用步骤
    目录1.地图初始化相关2.获取当前定位3.根据当前定位地址附近搜索建议1.地图初始化相关 文档:lbs.baidu.com/index.phpt… 申请账号 =>...
    99+
    2024-04-02
  • 怎么用C++实现推箱子功能附加回撤
    本篇内容介绍了“怎么用C++实现推箱子功能附加回撤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编码环境:VS2019 利用 链栈...
    99+
    2023-06-25
  • 怎么用java实现打印功能
    要使用Java实现打印功能,可以使用Java的打印API来完成。下面是一个简单的示例代码,演示了如何使用Java打印API实现打印功...
    99+
    2023-10-24
    java
  • 怎么使用Java+EasyExcel实现文件上传功能
    这篇“怎么使用Java+EasyExcel实现文件上传功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Java+E...
    99+
    2023-07-05
  • 使用Java怎么实现一个记事本功能
    今天就跟大家聊聊有关使用Java怎么实现一个记事本功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。源码: import java.awt.*; import java.awt.ev...
    99+
    2023-05-31
    java ava
  • java+mysql怎么实现登录和注册功能
    本篇内容主要讲解“java+mysql怎么实现登录和注册功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java+mysql怎么实现登录和注册功能”吧!1、首先是账号密码输入框和按钮:登录:&...
    99+
    2023-06-30
  • Java使用easyExcel实现导入功能
    今天带来的是esayExcel的简单使用小结,一个高效的Excel的处理框架 临时接到领导要求需要做一个Excel导入功能,于是发挥我的特长——面向百度编程。...
    99+
    2022-11-13
    Java easyExcel 导入Excel
  • 怎么使用redis实现session功能
    这篇文章主要介绍怎么使用redis实现session功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们来简单介绍下redis。Redis(Remote Dictionary Se...
    99+
    2024-04-02
  • jQuery.cookie.js怎么实现记录最近浏览过的商品功能
    这篇文章主要介绍jQuery.cookie.js怎么实现记录最近浏览过的商品功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:1、jquery.cookie.js jque...
    99+
    2024-04-02
  • 使用java怎么实现一个邮箱群发功能
    使用java怎么实现一个邮箱群发功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。邮箱实体import java.io.Serializable;&n...
    99+
    2023-05-30
    java
  • 使用Java怎么实现一个网页截屏功能
    使用Java怎么实现一个网页截屏功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:package awtDemo;import j...
    99+
    2023-05-30
    java
  • 使用JAVA怎么实现一个红包分发功能
    本篇文章为大家展示了使用JAVA怎么实现一个红包分发功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码import java.util.Arrays;import java....
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作