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格式(即用经纬度用空格分库)。