java 实现微信搜索附近人功能

来源:互联网 发布:wp8.1软件下载 编辑:程序博客网 时间:2024/05/08 03:30

最近给andorid做后台查询数据功能,有一个需求是模仿微信的查找附近人功能。 数据库中存储每个用户的经纬度信息及用户信息,通过当前用户传递过来的经纬度查询这个用户半径N公里以内的用户信息。   

数据库表结构

表信息表名Mobile_Usermu_id自增,主键mu_u_id用户表的ID 外键mu_longitud精度mu_latitude纬度(还有其他的一些信息,这里就列举4个字段足矣)



首先需要一个方法,是把传递过来的经纬度按照半径N公里扩散,找出距离中心经纬度N公里的上下左右经纬度值。效果如图


尴尬 随手画的  勿喷


以中心生成经纬度时 正上方和正下方的精度是不变的,只有纬度变化。 生成左右时道理一样,只有精度变化,纬度是不变的。

所以只需要生成上下的纬度,左右的精度就可以了。

参考了网上的文章,http://digdeeply.info/archives/06152067.html 这篇文章是用PHP实现的经纬度查询。修改成java的 代码如下

[java] view plaincopy
  1. /**  
  2.      * 生成以中心点为中心的四方形经纬度  
  3.      *   
  4.      * @param lat 纬度  
  5.      * @param lon 精度  
  6.      * @param raidus 半径(以米为单位)  
  7.      * @return  
  8.      */    
  9.     public static double[] getAround(double lat, double lon, int raidus) {    
  10.     
  11.         Double latitude = lat;    
  12.         Double longitude = lon;    
  13.     
  14.         Double degree = (24901 * 1609) / 360.0;    
  15.         double raidusMile = raidus;    
  16.     
  17.         Double dpmLat = 1 / degree;    
  18.         Double radiusLat = dpmLat * raidusMile;    
  19.         Double minLat = latitude - radiusLat;    
  20.         Double maxLat = latitude + radiusLat;    
  21.     
  22.         Double mpdLng = degree * Math.cos(latitude * (Math.PI / 180));    
  23.         Double dpmLng = 1 / mpdLng;                 
  24.         Double radiusLng = dpmLng * raidusMile;     
  25.         Double minLng = longitude - radiusLng;      
  26.         Double maxLng = longitude + radiusLng;      
  27.         return new double[] { minLat, minLng, maxLat, maxLng };    
  28.     }  

这样四周的经纬度都已经生成了。    
下一步是查询数据库中和四周经纬度匹配的数据。 如果数据量很大的话会很耗时间,而且会很消耗流量。所以需要用到分页查询 

代码如下 


[sql] view plaincopy
  1. select * from mobile_user   
  2.             where mu_latitude <> 0  
  3.             and mu_longitud > #left_lat#  
  4.             and mu_longitud < #right_lat#  
  5.             and mu_latitude > #down_lon#  
  6.             and mu_latitude < #top_lon#  
  7.             and mu_u_id <> #uid#  
  8.             order by ACOS(SIN((#lat# * 3.1415) / 180 ) * SIN((mu_latitude * 3.1415) / 180 )   
  9.             +COS((#lat# * 3.1415) / 180 ) * COS((mu_latitude * 3.1415) / 180 )   
  10.             *COS((#lon# * 3.1415) / 180 - (mu_longitud * 3.1415) / 180 ) )   
  11.             * 6380 asc limit #start#,#end#  





我用的是ibatis框架,sql里以#开始并结束的 是我传递过来的参数。  sql语句计算了每条数据和中心经纬度的距离并且以最近进行排序。  sql语句是根据下面的方法演变而来
方法是计算两个经纬度之间的直线距离。

[java] view plaincopy
  1. /**  
  2.      * 计算中心经纬度与目标经纬度的距离(米)  
  3.      *   
  4.      * @param centerLon  
  5.      *            中心精度  
  6.      * @param centerLan  
  7.      *            中心纬度  
  8.      * @param targetLon  
  9.      *            需要计算的精度  
  10.      * @param targetLan  
  11.      *            需要计算的纬度  
  12.      * @return 米  
  13.      */    
  14.     private static double distance(double centerLon, double centerLat, double targetLon, double targetLat) {    
  15.     
  16.         double jl_jd = 102834.74258026089786013677476285;// 每经度单位米;    
  17.         double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米;    
  18.         double b = Math.abs((centerLat - targetLat) * jl_jd);    
  19.         double a = Math.abs((centerLon - targetLon) * jl_wd);    
  20.         return Math.sqrt((a * a + b * b));    
  21.     }   


这样既实现了分页处理,又实现了每条数据的经纬度与中心经纬度的直线距离(以米为单位)。   
  
最后就是组成json数组返回给android使用了。  
做个笔记,欢迎补充。



文章转自:http://blog.csdn.net/qq7342272/article/details/7991714   点击打开链接 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脚上泡泡破了怎么办 脸被自己扣破了怎么办 6s安装不了软件怎么办 苹果6s特别卡怎么办 苹果手机4g网慢怎么办 大王卡玩王者卡怎么办 荣耀7c手机卡顿怎么办 华为6x手机卡顿怎么办 荣耀7c手机老卡怎么办 苹果6打王者卡怎么办 电脑玩游戏显示显卡不行怎么办 笔记本玩游戏显卡不行怎么办 笔记本玩英雄联盟有点卡怎么办 英语考试作文抄了阅读理解怎么办 qq账号被盗怎么办很久了 想玩线上德州没有渠道怎么办 手机玩久了头晕怎么办 玩3d游戏头晕恶心怎么办 win10打cf没声音怎么办 英雄联盟玩家尚未准备就绪怎么办 玩手机想吐应该怎么办 玩手机多了头晕怎么办 玩cf老是无响应怎么办 玩穿越火线好卡怎么办 绝地求生画质卡顿怎么办 手机热点玩lol卡怎么办 一加6直播触手黑屏怎么办 ipad应用商店密码忘记了怎么办 爱派忘记了密码怎么办 爱派id密码忘了怎么办 爱派密码忘了怎么办 爱派的密码忘了怎么办 苹果爱派密码忘了怎么办 鼠标无法识别的usb设备怎么办 电脑鼠标无法识别usb设备怎么办 win7电脑用户密码忘了怎么办 联想win7旗舰版开不了机怎么办 驱动都被卸载了怎么办 电脑密码忘了怎么办w7旗舰版 笔记本电脑密码忘了怎么办w7 windows一键还原了怎么办