这应该算是LBS最常见的一个功能了吧:
用户查看timeline时首先取得自己当前GEO(经纬度坐标),然后与数据库里的经纬度经行计算、比较后排序.
其实就是这个问题:
http://stackoverflow.com/questions/1006654/fastest-way-to-find-distance-between-two-lat-long-points
google了一下找到挺多的,请教下大家有没有跑在线上的,正确稳定的sql供参考下呢?
DELIMITER $$
DROP FUNCTION IF EXISTS `func_distance_` $$
CREATE FUNCTION `func_distance` (lat1 decimal(10,6), lng1 decimal(10,6), lat2 decimal(10,6), lng2 decimal(10,6))
RETURNS decimal(10,3) DETERMINISTIC
BEGIN
RETURN 6378.138 * 2 * ASIN(SQRT(
POWER(SIN((lat1 - abs(lat2)) * pi()/180 / 2),
2) + COS(lat1 * pi()/180 ) * COS(abs(lat2) *
pi()/180) * POWER(SIN((lng1 - lng2) *
pi()/180 / 2), 2) ));
END
最后用的是这个,好像误差有点大?
1
gangsta OP 刚才Google的时候才发现好多不知道的mysql内置函数啊:MBRContains() RADIANS() ...
|
2
zado 2015-08-06 15:49:57 +08:00
这是我做的在线上跑的: http://www.zxapi.com/last.html 我是用键值数据库来存储和检索的。先用类似 GeoHash 的编码方式对坐标编码,检索的时候按需要的精度选取合适的前缀去列举,当然因为 GeoHash 算法的原因,范围要预估大一点,然后计算每个点的距离,然后排序选取距离最小的那一部分。
|
3
zhicheng 2015-08-06 15:50:00 +08:00
新的 MySQL 和 MariaDB 已经有了 Geo 的功能了。
|