Lindorm Ganos 一条 SQL 计算轨迹

简介: Lindorm Ganos 针对轨迹距离计算场景提供了内置函数 ST_Length_Rows,结合原生时空二级索引和时空聚合计算下推技术,能够高效过滤数据并并行执行运算任务。该方案通过主键索引和时空索引快速过滤数据,并利用多Region并行计算轨迹点距离,适用于车联网等场景。具体步骤包括根据车辆识别代码和时间戳过滤数据、范围过滤轨迹点以及并行计算距离。使用限制包括只支持点类型列聚合运算及表中轨迹点需按顺序排列等。测试结果显示,Lindorm Ganos 在不同数据量下均能实现秒级响应。

在 Lindorm Ganos 中计算轨迹距离
针对轨迹距离计算场景,Lindorm Ganos 内置 ST_Length_Rows 函数来高效实现轨迹距离计算。利用原生时空二级索引和时空聚合计算下推,可以快速过滤不在范围内的数据、并行执行运算任务,有效解决上述问题。具体方法是:

  1. 利用主键索引快速根据车辆识别代码、时间戳对轨迹数据进行过滤。
  2. 利用时空二级索引对轨迹点进行范围过滤,剔除不在查询范围内的数据。
  3. 利用原生时空聚合计算,多 Region 并行计算轨迹点距离。Region 是分布式存储和负载的最小单元,表横向切割,根据 RowKey 分布于多个 Region 上。数据分布在多 Region 上,可以利用并行计算特性,加速运算。
    使用限制:
  4. 仅支持点类型(Point)列的聚合运算。
  5. 表中轨迹点的顺序需要用户通过主键进行保证,在车联网场景中,主键一般为车辆识别代码+时间戳。
  6. 如果过滤某个区域,仅计算区域内的点按顺序形成的轨迹距离。
  7. 当前 Lindorm GROUP BY 限制为 1000 个不同的 Key。
    时空聚合函数 ST_Length_Rows 的具体文档请参考:聚合函数
    示例
    数据集
    示例所用数据集为 T-Drive Taxi Trajectories,包含 2008 年北京一万多辆出租车一周的轨迹数据,包含 1500 万坐标点,轨迹总距离达 900 多万公里。下图展示的是车辆识别代码1-10的行驶轨迹:
    数据示例如下:
    taxi id
    date time
    longitude
    latitude
    1
    2008-02-02 15:36:08
    116.51172
    39.92123
    2
    2008-02-02 15:56:08
    116.47191
    39.90718
    3
    2008-02-02 17:10:24
    116.51627
    39.91034
    下载地址:https://www.microsoft.com/en-us/research/publication/t-drive-trajectory-data-sample/
    我们建议在建表时预先设置 Region 数,以获得更好的聚合性能。建表语句如下:
    CREATE TABLE tdrive(id INT, ts TIMESTAMP, p GEOMETRY(POINT), PRIMARY KEY(id,ts)) WITH (NUMREGIONS='4');
    NUMREGIONS参数详细用法请参见:支持的 Table_Option 列表。
    Lindorm 表结构如下,其中 id(车辆识别代码) 和 ts(时间戳) 为联合主键:
    +--------------+------------+-------------+-------------+----------------+------------+
    | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | TYPE | IS_PRIMARY_KEY | SORT_ORDER |
    +--------------+------------+-------------+-------------+----------------+------------+
    | default | tdrive | id | INT | true | ASC |
    | default | tdrive | ts | TIMESTAMP | true | ASC |
    | default | tdrive | p | GEOMETRY(POINT) | false | none |
    +--------------+------------+-------------+-----------------+------------+------------+
    查询车辆轨迹并计算里程
    • 根据 id 聚合轨迹并计算每个 id 的里程
    SELECT id,ST_LENGTH_ROWS(p) FROM tdrive WHERE id<10 GROUP BY id;
    +----+--------------------------+
    | id | ST_LENGTH_ROWS(p) |
    +----+--------------------------+
    | 1 | 441415.1379062134844505 |
    | 2 | 1672105.5085354075296573 |
    | 3 | 1336898.1989478711426478 |
    | 4 | 367018.3403825340860770 |
    | 5 | 962951.4848773751934647 |
    | 6 | 2695239.3950860189504903 |
    | 7 | 840604.443770203001504 |
    | 8 | 13.7600413799917481 |
    | 9 | 1179411.02584998403695 |
    +----+--------------------------+
    返回的结果单位为米。
    截取车辆轨迹并计算里程
    • 按 id 和时间截取部分轨迹并计算距离
    SELECT ST_LENGTH_ROWS(p) FROM tdrive WHERE id=1 AND ts<'2008-02-02 20:00:00';
    +---------------------+
    | ST_LENGTH_ROWS(p) |
    +---------------------+
    | 18135.1059201089410 |
    +---------------------+
    SELECT id,ST_LENGTH_ROWS(p) FROM tdrive WHERE id<3 AND ts<'2008-02-02 20:00:00' GROUP BY id ALLOW FILTERING;
    +----+------------------------+
    | id | ST_LENGTH_ROWS(p) |
    +----+------------------------+
    | 1 | 18135.1059201089410 |
    | 2 | 97659.8754061263592983 |
    +----+------------------------+
    • 根据空间范围截取轨迹并计算里程

//代码效果参考:http://www.mwgw.cn/sitemap/post.xml
//代码效果参考:http://www.intpipe.com/sitemap/post.xml
//代码效果参考:http://www.ningluan.com/sitemap/post.xml
//代码效果参考:https://www.yopian.com/sitemap/post.xml
//代码效果参考:http://www.92demo.com/sitemap/post.xml注意,这种过滤方式必须先对点类型列建立时空二级索引:
CREATE INDEX p_idx ON tdrive(Z-ORDER(p));
对空间范围POLYGON((116.3902 39.9162, 116.4201 39.9162,116.4201 39.9007,116.3902 39.9007, 116.3902 39.9162))(上图粉色部分)内的点进行过滤并根据id聚合,计算里程的查询语句如下:
SELECT id,ST_LENGTH_ROWS(p) FROM tdrive WHERE id<11 AND ST_Contains(ST_GeomFromText('POLYGON((116.3902 39.9162, 116.4201 39.9162,116.4201 39.9007,116.3902 39.9007, 116.3902 39.9162))'),p) GROUP BY id;
+----+------------------------+
| id | ST_LENGTH_ROWS(p) |
+----+------------------------+
| 2 | 15968.158667253130873 |
| 10 | 20535.9638149385165832 |
| 5 | 7931.576244086410756 |
| 3 | 7387.28965893438078 |
| 6 | 1668.19998193752552 |
| 9 | 2474.95521518117699 |
| 7 | 1137.2432599704443 |
+----+------------------------+
性能
在不同数据量下,在 4 核 16 GB 4 节点宽表引擎集群中,使用查询语句 SELECT id, ST_Length_Rows(p) FROM tdrive WHERE id,查询时间分别为:
点数量
单 Region 计算耗时(ms)
4 Region 计算耗时(ms)
8 Region 计算耗时(ms)
25420
449
394
340
138227
1892
1852
1605
368092
4328
4615
4275
738396
7935
8696
7982
1468717
17062
16973
16239
总结
以轨迹处理分析场景为例,我们对 Lindorm Ganos 的轨迹截取、聚合距离计算进行了测试。从上面的测试过程来看,Lindorm Ganos 可以通过 SQL 语法便捷处理轨迹距离计算场景,同时使用主键索引、时空二级索引、多 Region 对计算进行加速,秒级响应可以满足车联网领域对轨迹距离计算的需求。

相关文章
|
1天前
|
关系型数据库 分布式数据库 PolarDB
PolarDB Ganos的实时时空计算
PolarDB是阿里云自主研发的云原生关系型数据库,提供极致弹性、高性能、海量存储及安全可靠的数据库服务。PolarDB PostgreSQL版100%兼容PostgreSQL和Oracle语法,集成Ganos——新一代云原生时空数据库引擎,具备几何、栅格、轨迹等十大核心引擎能力,支持物理世界时空多模数据的混合存储与分析。本文介绍的Ganos实时电子围栏计算基于PolarDB PostgreSQL版,适用于交通物流、禁飞区管理、营销等多种场景,通过Flink实时计算实现高效的空间数据处理。
10 1
|
2月前
|
SQL 分布式计算 数据处理
SQL 能力问题之MaxCompute(ODPS)SQL有哪些特点
SQL 能力问题之MaxCompute(ODPS)SQL有哪些特点
|
4月前
|
存储 SQL 达摩院
Lindorm Ganos轨迹点
Lindorm Ganos 是阿里云推出的一款云原生超融合多模数据库,它集成了达摩院空天数据库引擎 Ganos
61 1
|
4月前
|
消息中间件 存储 Kafka
Lindorm Ganos轨迹点快速聚合能力简介
本文介绍了Ganos时空数据库在Lindorm流引擎上的全新能力与最佳实践,帮助客户解决车辆网场景中轨迹点实时聚合生成轨迹线的能力。Lindorm Ganos实现了Lindorm宽表、流、计算等引擎在时空领域的打通,支持原生时空类型与多种时空算子,支持多种不同的时空索引,不仅可用于传统的周边查询,还面向了历史轨迹的查询分析、实时地理围栏查询、点面查询等更加复杂的业务需求。
|
SQL 分布式计算 数据挖掘
玩转MaxCompute SQL! 30分钟搞定数据分析挖掘
本教程将指导开发者通过MaxCompute SQL分析,快速体验MaxCompute产品,完成开通、执行SQL语句查询数据。无需进行数据同步,可直接上手体验数据分析。
1294 7
|
存储 SQL NoSQL
NoSQL“小钢炮”,Lindorm时空引擎Ganos轨迹处理实测
Lindorm作为一款阿里云推出的云原生超融合多模数据库,包含了流引擎、宽表引擎、对象引擎、搜索引擎等。最新发布的Lindorm已经深度融合了达摩院空天数据库引擎Ganos(Lindorm Ganos),可以一站式的解决海量轨迹场景的存储和各类查询需求,本文通过对Lindorm Ganos在常用的时空场景进行测试,用过程和实际的数据展示Lindorm Ganos的具备的能力和特性。
NoSQL“小钢炮”,Lindorm时空引擎Ganos轨迹处理实测
|
SQL 关系型数据库 数据库
|
SQL 分布式计算 并行计算
用 Lindorm Ganos 一条 SQL 计算轨迹距离
Lindorm 多模数据库提供宽表、时序、搜索、文本、空间等多种数据模型,面向互联网、IoT、车联网等场景,是阿里巴巴核心业务提供关键支撑的数据库之一。Lindorm Ganos 将 Ganos 对时空数据的处理能力深度融合到 Lindorm 中,提供原生的时空数据类型和时空算子,内置时空主键索引和时空二级索引,将时空算子下推并优化了查询计划,可以很好地满足车联网业务对轨迹、位置、范围等数据处理的需求。针对轨迹距离计算场景,Lindorm Ganos 内置 ST_Length_Rows 函数来高效实现轨迹距离计算。
用 Lindorm Ganos 一条 SQL 计算轨迹距离
|
存储 SQL NoSQL
轨迹数据处理“小钢炮”,Lindorm时空引擎Ganos实测
本文在Lindorm Ganos中对常用的时空场景进行测试,用过程和实际数据展示Lindorm Ganos具备的能力和特性
轨迹数据处理“小钢炮”,Lindorm时空引擎Ganos实测
|
SQL 数据采集 分布式计算
使用Maxcomputer SQL对数据进行抽样
在大数据量分析任务中,针对全量数据进行分析挖掘会存在困难,抽样就显得格外重要了
2947 0