其实, 对于针对于 "附近的人" 这个功能的做法有很多种, 网站有很多文章也说过, 有直接套公式的(用圆来划分范围), 用正方形的.
我的数据库是MySQL数据库, 而MySQL里面刚刚好又有一个空间检索的空能, POINT. 不是所有的版本都有, 版本高一些才会有, 我这里的版本是MySQL 5.1.61.
就是把当前的经纬度当做平面里的一个中心点. 外面再画一个正方形, a = 2 * distant . 知道了这个, 稍微懂一点几何的会知道, 这个是有偏差的. 他会在1 ~ 根号2出现误差, 但是这个对于业务来说, 不需要那么精确的, 还是可以接受的.
列举一个简单的例子说明:
第一步: 建立sql
CREATE TABLE shop ( shop_id INT (3) PRIMARY KEY, location POINT, shop_na VARCHAR (100), shop_info VARCHAR (300) ) ;
ALTER TABLE shop ADD SPATIAL INDEX(Location);
SELECT * FROM shop ; SELECT *, ASTEXT(location) FROM shop TRUNCATE TABLE shop ; INSERT INTO shop VALUES (1,GEOMFROMTEXT('POINT(1 1)'),'三相1','吃饭的好地方1'); INSERT INTO shop VALUES (2,GEOMFROMTEXT('POINT(2 2)'),'三相2','吃饭的好地方2'); INSERT INTO shop VALUES (3,GEOMFROMTEXT('POINT(3 2)'),'三相3','吃饭的好地方3'); INSERT INTO shop VALUES (4,GEOMFROMTEXT('POINT(2 1)'),'三相4','吃饭的好地方4');如图:
SELECT ASTEXT(location) FROM shop WHERE MBRCONTAINS(GEOMFROMTEXT('POLYGON((0 0, 10 0, 10 10,0 10,0 0))'), location) ;
SELECT *, ASTEXT(location) FROM shop WHERE MBRCONTAINS(GEOMFROMTEXT('POLYGON((2 0,4 0,4 3,2 4,2 0))'), location) ORDER BY GLENGTH(LINESTRING(location,GEOMFROMTEXT('POINT(2 1)'))) ;
SELECT ASTEXT(location) FROM shop WHERE INTERSECTS(GEOMFROMTEXT('POLYGON((2 0,4 0,4 3,2 4,2 0))'), location) ;
注意: 查询出来结果包含临界点!