客户端LBS, 寻找附近的人服务端接口做法

其实, 对于针对于 "附近的人" 这个功能的做法有很多种, 网站有很多文章也说过, 有直接套公式的(用圆来划分范围), 用正方形的.

我的数据库是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) ;



注意: 查询出来结果包含临界点! 







转载于:https://my.oschina.net/vernon/blog/170259

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值