mysql 5.7 lbs_使用mysql来实现lbs(地理位置服务)功能

现在大型的网站实现的lbs服务基本上是用mongodb的实现定位的(gps不太清楚)。对于小的应用来说,有些大材小用了,而且还大大增加了维护成本。这里用mysql来实现lbs的功能。

数据库设计层面,有两个方案

(1)字段主要包括 userId,lat,lng。分别代表用户ID、最近一次 Checkin 的经度、纬度。

lat/lng 建立复合索引。

然后通过手机的定位,得到自己的位置,比如记为 myLat,myLng。

代码如下,先做一个计算,算出 1km 所对应的经纬度范围:

double range = 180 / Math.PI * 1 / 6372.797;//里面的 1 就代表搜索 1km 之内,单位km

double lngR = range / Math.cos(myLat * Math.PI / 180.0);

double maxLat = myLat + range;

double minLat = myLat – range;

double maxLng = myLng + lngR;

double minLng = myLng – lngR;

然后执行 SQL :

SELECT * FROM checkinTable WHERE ((lat BETWEEN ? AND ?) AND (lng BETWEEN ? AND ?))

这四个问号,分别代入变量

minLat、maxLat、minLng、maxLng

然后就可以查询得到结果

但是,这样得到的结果不是有序的。

如果要排序,在客户端执行。

不建议在 SQL 层上执行,因为上述的那个 SQL 是可以用到索引进行查询的,一旦引入排序后,就会影响效率。

(2)高级用法,但是有点大材小用的感觉。

就是使用 Spatial Index(空间索引)。MySQL 5.0 之上的系统,都支持该类型的索引。

数据表可以简化为 userId 和 userLocation。 userLocation 是 Point 类型,同时建立 R-TREE 索引。

SQL 语句直接使用一个非标准的 OpenGIS 函数 DISTANCE 就可以了。

这个部分可以参考 MySQL Spatial Index Manual。如果用其他数据库,应该类似。

经测试发现用这个的方法确实实现。对于小网站来说也足够了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值