轨迹时空数据存储对比分析
背景
最近有一批车辆的轨迹数据需要用postgresql管理起来。数据格式相对比较简单,就是一堆csv文件,每行一个点,包括x,y,t和其他的一些速度,方向属性信息。
方案对比
能想到的最简答的方法就是把csv映射到数据库的表结构,然后把x,y 够构建成一个坐标点。这样存储上最简单,但是没法进行分析操作。有没有更好的方法呢?
说到使用postgresql管理空间数据,立马就会想到大名鼎鼎的postgis。搜了一下,postgis还真有轨迹分析功能:http://postgis.net/docs/manual-2.5/reference.html#Operators 专门有Temporal Support的一章,有四个函数用于具有时态信息的几何数据(轨迹数据)的分析。pg大神也写过一篇介绍的文章http://mysql.taobao.org/monthly/2018/06/10/。 具体的方法就是把M值作为时间信息,计算和分析的时候就按照M值来作为时间计算(真正需要M值的时候怎么办??)
最后刚在网上看到了阿里云刚推出的时空数据库ganos(https://help.aliyun.com/document_detail/107501.html?spm=a2c4g.11186623.6.1133.6a4f24d8LvtXpQ)。ganos有个专门的模块支持移动对象数据库,从文档来看功能还是挺全面的。
功能对比
如果轨迹还是使用点的方式进行管理,实在是有点low,直接pass掉。剩下两种方案,postgis和ganos。就以一个最简单的时空相交查询来比较下这个两个方案。
公司正好买了阿里云的云数据库,刚好可以拿来测试下:
数据类型
创建表时postgis必须指定为LinestringM数据类型,而ganos使用的是trajectory这个数据类型,比postgis更为直观。
-- postgis
CREATE TABLE traj_postgis
{
...
track geometry(LineStringM)
);
-- ganos
CREATE TABLE
traj_ganos(
...
track trajectory
);
插入数据
postgis和ganos都需要把轨迹点组合为线段。好吧,这个也不是什么难事,按天组合就好,最大的问题是postgis需要把时间戳转为M值!!! 这个实在是很不方便也很不直观。相比而言,ganos的sql清楚多了。
-- postgis m 值
INSERT INTO traj_postgis(...,track)
VALUES (...,ST_GeometryFromText('LINESTRINGM (121.574898 31.195130 1195319307,121.573458 31.197597 1195319312, ...) ',4326));
-- ganos
INSERT INTO traj_ganos(..., track)
VALUES(..., ST_MakeTrajectory('STPOINT'::leaftype,ST_GeomFromText('LINESTRING(121.574898 31.195130 1195319307,121.573458 31.197597, ...)',4326), ARRAY['2007-11-1717:08:27