HybridDB for MySQL的分析引擎支持SQL语法的空间检索能力,借助于引擎底层强大的空间索引,可以做到百亿数据毫秒级响应。以下是几个具体的例子。
建表
CREATE TABLE test2 (
user_id BIGINT,
city VARCHAR,
poi GEO2D delimiter_tokenizer ','
)
DISTRIBUTE BY HASH (user_id)
ENGINE = 'CSTORE'
INDEX_ALL='Y';
写入数据
insert into test2 values(1, 'HZ', '116.3972, 39.9096');
insert into test2 values(2, 'BJ', '120.1313, 40.2727');
insert into test2 values(3, 'SH', '116.4041, 39.9863');
mysql> select * from test2 order by user_id;
+---------+------+------------------+
| user_id | city | poi |
+---------+------+------------------+
| 1 | HZ | 116.3972,39.9096 |
| 2 | BJ | 120.1313,40.2727 |
| 3 | SH | 116.4041,39.9863 |
+---------+------+------------------+
3 rows in set (0.02 sec)
空间查询
点查询的语法:
geo_in_points(col_name, 'longitude1 latitude1, longitude2 latitude2, ...');
# 返回包含这些点数据
举例如下:
mysql> select * from test2 where geo_in_points(poi, '120.1313 40.2727');
+---------+------+------------------+
| user_id | city | poi |
+---------+------+------------------+
| 2 | BJ | 120.1313,40.2727 |
+---------+------+------------------+
1 row in set (0.04 sec)
圆形查询的语法:
geo_in_circle(col_name, 'longitude latitude', radiusInMeters);
- 一个经纬度坐标点和半径长度确定一个圆
(‘longitude latitude’, radiusMeters)
。 - 半径长度单位是米。
- 使用WGS-84坐标系统将地球建模为椭球,且圆形为球面。
举例如下:
mysql> select * from test2 where geo_in_circle(poi, '116.4 39.91', 10000) and city='HZ';
+---------+------+------------------+
| user_id | city | poi |
+---------+------+------------------+
| 1 | HZ | 116.3972,39.9096 |
+---------+------+------------------+
1 row in set (0.03 sec)
多边形查询的语法:
geo_in_polygon(col_name, 'longitude1 latitude1, longitude2 latitude2, ...');
- 一系列经纬度坐标点确定一个多边形
(‘longitude latitude’…)
。 - 按照顺时针传入坐标点形成Polygon,点数不少于4个。
- Polygon形成闭环,即第一个坐标点和最后一个坐标点相同。
- Polygon中的边不能相交,否则不能得到正确结果;
- Polygon不能跨越180度经线,如果跨越180度经线,需要分成2个Polygon。
计算距离的语法:
geo_distance(str1, str2);
geo_distance(col, str2);
geo_distance(str1, col);
- str1的格式是:"经度$delemiter纬度",其中delemiter可以为任意字符串。
- 计算方法:先计算弧度、通过弧度算角度,最后再根据角度和半径计算距离。
- 其中计算弧度采用Cosines Law,采用Cosines Law计算距离的原因,请参见此处。
- 其中半径使用地球平均半径,关于地球半径的详细信息请参见Earth radius。
举例如下:
mysql> select *,geo_distance(poi, '116.3972 39.9096') as distance from test2;
+---------+------+------------------+----------+
| user_id | city | poi | distance |
+---------+------+------------------+----------+
| 2 | BJ | 120.1313,40.2727 | 320536 |
| 1 | HZ | 116.3972,39.9096 | 0 |
| 3 | SH | 116.4041,39.9863 | 8558 |
+---------+------+------------------+----------+
3 rows in set (0.01 sec)
注意
空间查询经纬度列的参数,统一采用WKT格式(即用经纬度用空格分库)。