Mysql or Mongodb LBS快速实现方案
前两篇文章:
查找附近的xxx 球面距离以及Geohash方案探讨 (http://www.wubiao.info/372)
微信、陌陌 架构方案分析 (http://www.wubiao.info/401)
探讨了,LBS查找附近的XXX;其中包括了,Mysql自定义存储函数方案,以及通过GeoHash、redis自建索引方案。
============================================================================================
今天分享两种,利用GeoHash封装成内置数据库函数的简易方案;
A:Mysql 内置函数方案,适合于已有业务,新增加LBS功能,增加经纬度字段方可,避免数据迁移
B:Mongodb 内置函数方案,适合中小型应用,快速实现LBS功能,性能优于A(推荐)
============================================================================================
方案A: (MySQL Spatial)
1、先简历一张表:(MySQL 5.0 以上 仅支持 MyISAM 引擎)
1
2
3
4
5
6
7
8
9
|
CREATE
TABLE
address (
address
CHAR
(80)
NOT
NULL
,
address_loc POINT
NOT
NULL
,
PRIMARY
KEY
(address)
);
|
空间索引:
1
|
ALTER
TABLE
address
ADD
SPATIAL
INDEX
(address_loc);
|
插入数据:(注:此处Point(纬度,经度) 标准写法)
1
2
3
|
INSERT
INTO
address
VALUES
(
'Foobar street 12'
, GeomFromText(
'POINT(30.620076 104.067221)'
));
INSERT
INTO
address
VALUES
(
'Foobar street 13'
, GeomFromText(
'POINT(31.720076 105.167221)'
));
|
查询: 查找(30.620076,104.067221)附近 10 公里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SELECT
*
FROM
address
WHERE
MBRContains
(
LineString
(
Point
(
30.620076 + 10 / ( 111.1 / COS(RADIANS(104.067221))),
104.067221 + 10 / 111.1
|