手机端跟Web服务器端计算附近人或商家算法

手机端和Web服务器端计算附近人或商家算法

类似微信的搜索附近的人的功能 在 服务端的实现   

 

前提:根据两个点的经度和纬度计算两点之间的距离,公式见  http://en.wikipedia.org/wiki/Haversine_formula 


思路 1)每个用户在服务器端都会保留最后的经度和纬度和时间
查找时,根据当前用户的经度和纬度 对 服务器端 每个用户的经度和纬度 进行计算,有人把上述公式做成mysql 函数放在 sql语句中调用


CREATE DEFINER=`root`@`localhost` FUNCTION `distance`(lat1 float,lng1 float,lat2 float,lng2 float) RETURNS float
BEGIN
set @num=
2 * 6371 * ASIN(SQRT(POW(SIN(PI() * (lat1 - lat2) / 360), 2) + COS(PI() * lat1 / 180)
* COS(lat2* PI() / 180) * POW(SIN(PI() * (lng1 - lng2) / 360), 2)));
RETURN @num;
END
可参见 http://hi.baidu.com/jlzan1314/blog/item/26f47251611698551038c2de.html 及 http://blog.csdn.net/alexjames_83/article/details/4261403


很显然,这种方法计算量巨大,实际应用中除非数量很小,否则可以排除


思路2)基准线预先计算法
每个用户在服务器端都会保留最后的经度j1 和纬度w1 的同时 保留对经度基准线的相对距离 dj1 和纬度基准线的相对距离 dw1
经度基准线可以是中国最东边的经度  纬度基准线可以是中国最北边的纬度  


当前用户对经度基准线的相对距离 dj2 =230km 和纬度基准线的相对距离 dw2=350km
查找时sql语句可以这么写(1.5公里内的用户)
select * from user where dj1>(230-1.5) and dj1<(230+1.5) and  dw1>(230-1.5) and dw1<(230+1.5)
相当于获得当前用户 周围正方形1.5公里区域的用户


此外通过将冷热数据分开存放及 分块存放 用户地理数据应该能有效的提高查询速度