最近给andorid做后台查询数据功能,有一个需求是模仿微信的查找附近人功能。 数据库中存储每个用户的经纬度信息及用户信息,通过当前用户传递过来的经纬度查询这个用户半径N公里以内的用户信息。
数据库表结构
mu_id | 自增,主键 |
mu_u_id | 用户表的ID 外键 |
mu_longitud | 精度 |
mu_latitude | 纬度 |
(还有其他的一些信息,这里就列举4个字段足矣)
首先需要一个方法,是把传递过来的经纬度按照半径N公里扩散,找出距离中心经纬度N公里的上下左右经纬度值。效果如图
随手画的 勿喷
以中心生成经纬度时 正上方和正下方的精度是不变的,只有纬度变化。 生成左右时道理一样,只有精度变化,纬度是不变的。
所以只需要生成上下的纬度,左右的精度就可以了。
参考了网上的文章,http://digdeeply.info/archives/06152067.html 这篇文章是用PHP实现的经纬度查询。修改成java的 代码如下
/**
* 生成以中心点为中心的四方形经纬度
*
* @param lat 纬度
* @param lon 精度
* @param raidus 半径(以米为单位)
* @return
*/
public static double[] getAround(double lat, double lon, int raidus) {
Double latitude = lat;
Double longitude = lon;
Double degree = (24901 * 1609) / 360.0;
double raidusMile = raidus;
Double dpmLat = 1 / degree;
Double radiusLat = dpmLat * raidusMile;
Double minLat = latitude - radiusLat;
Double maxLat = latitude + radiusLat;
Double mpdLng = degree * Math.cos(latitude * (Math.PI / 180));
Double dpmLng = 1 / mpdLng;
Double radiusLng = dpmLng * raidusMile;
Double minLng = longitude - radiusLng;
Double maxLng = longitude + radiusLng;
return new double[] { minLat, minLng, maxLat, maxLng };
}
这样四周的经纬度都已经生成了。
下一步是查询数据库中和四周经纬度匹配的数据。 如果数据量很大的话会很耗时间,而且会很消耗流量。所以需要用到分页查询
代码如下
@RequestMapping(params = "doGetQuserNearList")
@ResponseBody
public JSONObject doGetQuserNearList( HttpServletRequest request) {
JSONObject jsonObject=new JSONObject();
String km=request.getParameter("km");//搜索范围 这里以米为单位
String useridString=request.getParameter("userid");
String precision=request.getParameter("precision");
String latitude=request.getParameter("latitude");
String rows=request.getParameter("rows");
String page=request.getParameter("page");
try {
if("".equals(useridString)||useridString==null){
jsonObject.put("status", "0");
jsonObject.put("msg", "用户id不能为空");
return jsonObject;
}
Session session= memberService.getSession();
Query query=null;
org.hibernate.SQLQuery sqlQuery= session.createSQLQuery("select * from q_member where latitude <> 0 "
+ "and _precision > :left_lat "
+ "and _precision < :right_lat "
+ "and latitude > :down_lon "
+ "and latitude < :top_lon "
+ "and id <> :userid "
+" order by ACOS(SIN((:lat * 3.1415) / 180 ) * SIN((latitude * 3.1415) / 180 )+COS((:lat * 3.1415) / 180 )*COS((latitude * 3.1415) / 180 )*COS((:lon * 3.1415) / 180 - (_precision * 3.1415) / 180 ) ) * 6380 asc limit :start,:size");
double[] lalon=Location.getAround(Double.valueOf(latitude), Double.valueOf(precision), Integer.valueOf(km));
sqlQuery.setParameter("left_lat", lalon[1]);
sqlQuery.setParameter("right_lat", lalon[3]);
sqlQuery.setParameter("down_lon", lalon[0]);
sqlQuery.setParameter("top_lon", lalon[2]);
sqlQuery.setParameter("lat", latitude);
sqlQuery.setParameter("lon", precision);
sqlQuery.setParameter("start", Integer.valueOf(page)-1);
sqlQuery.setParameter("size", Integer.valueOf(rows));
sqlQuery.setParameter("userid", useridString);
java.util.List<MemberEntity> memberEntities=sqlQuery.addEntity(MemberEntity.class).list();
//循环计算相对距离
for(MemberEntity memberEntity:memberEntities){
memberEntity.setDistance(Location.distance(Double.valueOf(latitude), Double.valueOf(precision), Double.valueOf(memberEntity.getLatitude()), Double.valueOf(memberEntity.getPrecision())));
}
jsonObject.put("status", "1");
jsonObject.put("msg", memberEntities);
} catch (Exception e) {
e.printStackTrace();
message = "获取失败";
jsonObject.put("status", "0");
jsonObject.put("msg", message);
throw new BusinessException(e.getMessage());
}
return jsonObject;
}
我用的是Hibernate框架, sql语句计算了每条数据和中心经纬度的距离并且以最近进行排序。 sql语句是根据下面的方法演变而来
方法是计算两个经纬度之间的直线距离。
/**
* 计算中心经纬度与目标经纬度的距离(米)
*
* @param centerLon
* 中心精度
* @param centerLan
* 中心纬度
* @param targetLon
* 需要计算的精度
* @param targetLan
* 需要计算的纬度
* @return 米
*/
private static double distance(double centerLon, double centerLat, double targetLon, double targetLat) {
double jl_jd = 102834.74258026089786013677476285;// 每经度单位米;
double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米;
double b = Math.abs((centerLat - targetLat) * jl_jd);
double a = Math.abs((centerLon - targetLon) * jl_wd);
return Math.sqrt((a * a + b * b));
}
这样既实现了分页处理,又实现了每条数据的经纬度与中心经纬度的直线距离(以米为单位)。
相关推荐
本资源介绍了一个基于微信小程序的食疗微信小程序的设计与实现。该小程序旨在帮助用户了解食物与健康之间的关系,提供个性化的饮食建议,以达到改善身体健康的目的。设计方面,我们采用了简洁明了的用户界面,方便...
风格有了还要规划出我们的功能区域,在这里面主要还是重视功能的实现,一个功能都没有实现的小程序也就没什么真实的意义存在了。 景区解读管理 在后台布局设置上,我们往往会用到一些。菜单树以及操作区域来进行...
结合商家经营需求,商家可以通过平台的后台实现信息的上传,主要包括了汉堡分类管理、汉堡信息管理、订单管理、支付管理等流程化功能,借助后台功能模块按照菜品分类实现汉堡信息的上传,同时还包括了汉堡库存、价格...
基于微信小程序的校园易平台的设计与实现 开发语言 微信小程序开发语言+Java+SpringBoot 在微信小程序上完成各种校园生活需求的发布与解决,其主要模块包括: 首页:校园新闻、通知公告、学生事务等一些列与学生...
,微信个人号开发API接口协议,可实现微信99%功能。收发朋友圈、查看朋友圈、朋友圈互动点赞、评论、 好友列表、各类微信消息收发、群发、发文件、增删好友、微信转账、红包、分享小程序、名片、 清粉、微信建群、拉...
java项目之基于微信小程序的校园失物招领系统的设计与实现(源码+说明文档+演示视频) 游客: 只可以查看查询失物/招领信息,不可以发布或删除失物/招领信息。可以查看已完成信息。 当点击发布→提示登录 当点击...
非微信ipad协议、非mac协议,非安卓协议,api可实现微信99%功能; 无需扫码登录、可收发朋友圈、查看朋友圈、朋友圈互动点赞、评论、 好友列表、微信消息收发、发文本消息、图片消息、名片消息、动图表情、发文件、…...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
适用于 微信小程序 等 JSAPI 支付场景。使用简单,封装签名过程,不用理解太多的逻辑,直接使用。 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续...
基于微信小程序的校园易平台的设计与实现 开发语言 微信小程序开发语言JavaSpringBoot 在微信小程序上完成各种校园生活需求的发布与解决,其主要模块包括: 首页:校园新闻、通知公告、学生事务等一些列与学生相关...
新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用maven或gradle引用本项目即可使用本SDK提供的各种功能,详情可参考 或本项目中的部分单元测试代码;另外微信开发新手请务必阅读的常见问题部分...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
主要实现的业务是让客户在线下单(填写本寄件人的一系列信息和收件人的一系列信息以及附加的必要信息等), 运费时效查询(可输入寄件地区和收件地区以及货物的重量查出大致需要的运费,更加的方便用户),能够实时跟踪 ...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
开发技术:微信小程序客户端 + Java后台服务器端 + mysql数据库 随着每年高校毕业季的到来。在每年毕业季,高校的毕业学生都会有很多出售二手货物的需求,而在校其他同学又希望可以买到廉价的商品。现在学院校内的...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...