一、MySql不使用空间函数,简单版
1.粗算,根据场景得到一个range,计算经纬度,得到的是一个矩形区域(A),不精确,但是已经有范围这个雏形了,最容易实现的方式之一。
2.使用PHP函数计算出距离,排序即可。
排序的话,自己灵活实现。很多语言都有封装排序算法,效率也挺高的。
二、Mysql不使用空间函数,优化版
这里的优化是对(一)中range的优化。根据范围半径,计算出经纬度的变化范围,得到一个比较准确的range,这里的范围(B)是圆形的(因为$radius是俩点间的距离)。
但是筛选时候的范围(C)是矩形,所以精确上来说, 圆B是矩形C的内切圆,不在圆B但是在矩形C中的点也会出现在我们的SQL结果中。但是已经比(一)要好很多了。
我见过把这个计算带入到SQL中的,一大串SQL,这种计算本来就不是SQL该有的,不推荐这样做。
三、MySql使用空间函数
在(二)中,我们得到了4个点。这个就是矩形范围,我们只要判断是否在这个矩形内就好了。其实用到mysql的空间函数可以支持任意多边形。
还支持索引优化,注意myisam才能建立空间索引。
优化程序将调查可用的空间索引是否能包含在使用某些函数的查询搜索中,如WHERE子句中的MBRContains()或MBRWithin()函数。
--19.6.2. 使用空间索引
这里的核心思想就是用一个范围判断某个点是否在这个范围内。
在数据库有一个类型为geometry的列g。
即可准确筛选出在这个范围内的点。即使后面跟ORDER