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

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

数据库表结构:

表信息

表名 Mobile_User

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 };  
    }

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

代码如下

select * from mobile_user 
			where mu_latitude <> 0
			and mu_longitud > #left_lat#
			and mu_longitud < #right_lat#
			and mu_latitude > #down_lon#
			and mu_latitude < #top_lon#
			and mu_u_id <> #uid#
			order by ACOS(SIN((#lat# * 3.1415) / 180 ) * SIN((mu_latitude * 3.1415) / 180 ) 
			+COS((#lat# * 3.1415) / 180 ) * COS((mu_latitude * 3.1415) / 180 ) 
			*COS((#lon# * 3.1415) / 180 - (mu_longitud * 3.1415) / 180 ) ) 
			* 6380 asc limit #start#,#end#

我用的是ibatis框架,sql里以#开始并结束的 是我传递过来的参数。  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));  
    }

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

思考:

数据量大了,需要按照经纬度进行分表

鉴于一些网站采集本blog的文章,  本站原创。  http://blog.csdn.net/qq7342272   转载请注明出处。

时间: 2024-10-28 17:31:50

java 实现微信搜索附近人功能的相关文章

阿里面试题——如何实现微信“附近的人”功能?

一个面试题 如果让你实现微信的"附近的人"功能,你会怎么做? 初期实现:客户端固定时间发送经纬度(x,y)到服务器s,服务器存储每个登陆的用户的经纬度到表t中,表t按照经纬度分表,将地图分成一个个的小格子.当用户店家"附近的人"时,对用户(x,y)进行计算,最多一次查询其中的4个格子(子表),计算两点间距离获取结果(有点像桶排序).性能上可以将表t替换为内存结构,容灾即可.从实际的微信提供的功能来看,附近的人并不太多,估计是其对地图划分的格子很小.

搜狗微信搜索推出 一些人又要忙坏了

搜狗微信搜索开通了,不得不说方便了许多,用户可在搜狗搜索结果页可浏览到与查询词相关的微信公众号及全部文章.就像之前说的雅虎新闻摘要yahoo news digest,在方便大多数人的同时也方便了采集者,如果他们不加修改地直接发布的话也会造成信息的泛滥. 对于搜狗微信搜索,微信官方称:"微信公众平台搜索功能核心为,用户获取.查询微信公众平台的内容信息更简单.方便,为微信增加了一个非常好的内容查询入口." 微信称,这次与搜狗合作意义在于三点:一是公众号可以从搜索引擎获得更多流量与阅读量:其

【LBS】基于地理位置的搜索之微信 附近的人 简单实现

缘由 本周技术群有一个同学说我们该怎么实现 由近到远的基于地理位置的搜索,我创业做电商的系统做过类似这样的服务,我把我们以前的操作给大家分享下 什么是LBS LBS 全称是 Location  Based Service ,基于位置的服务.我们可以使用到这种服务,真是由于我国移动设备的大量增加,让我们加速进入了 移动互联网的时代. 由近到远的基于地理位置的搜索  其实就是 通过当前使用用户的经纬度,然后从我们自己的数据库中查出指定范围内(例如5km)的数据,按照由近到远的顺序 进行展示. 这句话

在XMPP的JAVA开源实现Openfire中,增加LBS 附近的人功能

1. XMPP协议 与 Openfire XMPP协议是IM领域的标准协议了,具体可参考  http://xmpp.org   及RFC6120,RFC6121,RFC6122等相关文档. http://xmpp.org/xmpp-protocols/ XMPP协议实现,开源的也很多,server端可参考 http://xmpp.org/xmpp-software/servers/    client可以参考 http://xmpp.org/xmpp-software/clients/    l

Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先设置一下授权回调域.这里瞬间想到之前做JSSDK的时候,也设置过一个域名.二者本质上都是设置可信域名. 当用户授权完毕之后,请求将重定向到此域名(或者子域名)下的执行者(jsp页面或者servlet等).如何设置授权回调域,请见第二节. 1.2 获取Code https://open.weixin.

微信搜索再添新招,信息到O2O转变!

“连接一切”是微信的最大目标,目前劲敌一直是百度和阿里,昨天,微信新版本的内测界面被曝光,朋友圈搜索和附近商户搜索等新功能,这一强化搜索业务的行为,无疑在信息检索和商务检索两个维度向BA发起新的攻势. 有上加好 目前曝光的微信6.1版本截图显示,新版本微信将加入4项新功能:用户可以通过附件栏发微信红包;在更换手机后,自定义表情仍保留;可以搜索最近(6个月以上)的朋友圈内容;可以搜索附近的餐馆. 据说,微信主功能之一“摇一摇”也将随之推出新功能,能够摇出企业的红包及附近商家优惠券(点击以后直接到企

Java企业微信开发_04_自定义菜单

一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列化的问题请参考上一节   Java企业微信开发_03_通讯录同步 2.创建菜单的接口 public static String create_menu_url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS

移动搜索格局已定,微信搜索恐难有大改变!

近日,微信新版本的内测界面流出,已支持朋友圈搜索和附近商户搜索.越来越多迹象表明,微信正在加强搜索功能.在取代聊天工具.移动浏览器.新闻阅读客户端等诸多功能之后,微信还是忍不住进入“搜索”这个非常核心的互联网基础设施,只不过微信搜索瞄准的不是广义搜索,而是狭义的服务搜索,而这也正是百度今年发力的重点. 2014年搜索定局,老二之争激烈 先来看看移动搜索的格局趋势.2014年说是移动搜索最受关注的一年,BAT三大巨头均已入场:百度早已多重卡位自不必说:阿里收购UC之后推出神马搜索专注移动搜索:腾讯

微信支付--申请微信支付,商户功能设置详细说明

原文链接:http://www.cnblogs.com/True_to_me/p/3565039.html 微信支付已经正式开放了,所有的"认证服务号"都可以申请.但由于关系到支付权限的申请,整个流程会比较复杂,而且有很多具体的涉及技术接口的细节一般人还真弄不明白.而且已经有商户告诉我们发现有第三方网站在教商户申请微信时让不了解真相的商户把自己的微信支付直接就绑定了第三方网站的支付接口,给商户带来了很大的麻烦.非常的不负责任.大家一定要仔细阅读下面的内容,以免绑定后才发现是绑定了别人的