现在大型的网站实现的lbs服务基本仩是用mongodb的实现定位的(gps不太清楚)对于小的应用来说,有些大材小用了而且还大大增加了维护成本。这里用mysql来实现lbs的功能
以下是从“知乎”网上的一篇文章()。
数据库设计层面有两个方案
(1)字段主要包括 userId,latlng。分别代表用户ID、最近一次 Checkin 的经度、纬度
然后通过手机的定位,得到自己的位置比如记为 myLat,myLng
代码如下,先做一个计算算出 1km 所对应的经纬度范围:
然后就可以查询得到结果
但是,这样得到的结果不是有序的
如果要排序,在客户端执行
不建议在 SQL 层上执行,因为上述的那个 SQL 是可以用到索引进行查询的一旦引入排序后,就会影響效率
经测试发现用这个的方法确实实现。对于小网站来说也足够了
目前基于LBS地理位置的搜索已经应鼡非常广了的确是个很方便的东西。
我们做程序的就是要考虑如何通过这些功能来做出更符合用户的内容来。
例如微信可以通过发送地理位置来获取到当前用户的经纬度。
在网页端可以使用html5获取地理定位。
数据库中要预存自己的位置数据如何获取数据请查看相关哋图api。
假设我们数据库中已经存储大量酒店的位置信息
如上图,假设当前用户所在的位置为坐标O那么我们要查詢附近的酒店,理想的范围应该是以O为原点的圆内但是我们先不这样做,后面会讲到
我们先以O为原点,在坐标上以0.3的差值标识了4个位置其实这样就是一个正方形范围,大致应该符合我们的要求
那么我们就要从数据库中查询范围在这个正方形之内的所有酒店了。
|
这样我们的附近搜索基本完成了
如果我们要筛选出最近的10个的话,用上面的语句来查询可能会把稍远的先查出来,后面的就没有机会了那么我们得做个排序了。
如上图如果我们要获取E位置和F位置分别距离O点的长度,那麼我们就需要计算OE和OF的长度分别为多少这里我们要用到直角三角形的数学公式:C^2 = A^2 + B^2,知道A和B那么C的值也就得到了。
注意:请首先在表中建立一个字段d以作后面缓存距离使用,否则会报错
我们可以根据经纬度的差分别来获取到A和B的值SQL语句是这样的:
通过这样一步,我们嘚范围已经锁定在圆形之内了并且按照由近及远的方式进行排序(在不考虑效率的情况下)。