其实, 对于针对于 "附近的人" 这个功能的做法有很多种, 网站有很多文章也说过, 有直接套公式的(用圆来划分范围), 用正方形的.
我的数据库是MySQL数据库, 而MySQL里面刚刚好又有一个空间检索的空能, POINT. 不是所有的版本都有, 版本高一些才会有, 我这里的版本是MySQL 5.1.61.
就是把当前的经纬度当做平面里的一个中心点. 外面再画一个正方形, a = 2 * distant . 知道了这个, 稍微懂一点几何的会知道, 这个是有偏差的. 他会在1 ~ 根号2出现误差, 但是这个对于业务来说, 不需要那么精确的, 还是可以接受的.
列举一个简单的例子说明:
第一步: 建立sql
如果需要用到
POINT , 表应该
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) ;
注意: 查询出来结果包含临界点!