依据基于SED距离的DouglasPeucker算法(二维+时间)将trajectory对象按一定规则进行简化压缩。
语法
trajectory ST_CompressSed(trajectorytraj,float8dist);
参数
参数名称 | 描述 |
traj | 原始轨迹。 |
dist | 时间同步距离(SED)偏移阈值,指定后可以保留轨迹空间上的整体趋势。 |
描述
计算轨迹点的时间同步距离(SED),用距离值与阈值比较对轨迹进行有损压缩,返回压缩后的轨迹对象。
RDP算法只考虑了二维的轨迹,即将所有点都放在平面上。而这在时空轨迹(可以视为一个三维的折线)上,会造成如下问题:
轨迹在一个点停留很久,在三维上,形成一条与t轴平行的长直线,而在二维上这段直线则变成一个点,依据二维的RDP算法,必会将此直线的起点和终点舍去一个,破坏三维上的结构。
因此,在有时间戳时,我们时常使用 Sychronized Euclidean Distance(SED,同步时间欧式距离)取代上述的垂直欧式距离。
同步时间距离的定义是:对于起点和终点分别是(xs,ys,ts), (xe,ye,te)
的直线和一点(xm,ym,tm)
,(其中ts<=tm<=te
),先通过插值在直线上找到tm时刻的点(xm', ym', tm)
,之后再计算(xm,ym)
到(xm', ym')
的距离。
说明
对于不需要考虑驻留时间因素,只需要考虑二维轨迹形状的情形,可以使用ST_Compress。
示例
select st_compressSED(traj, 0.001) as traj from traj_test;
traj
-------------------------------------------------------------
{"trajectory":{"version":1,"type":"STPOINT","leafcount":12,"start_time":"2017-01-15 09:06:39","end_time":"2017-01-15 21:18:30","spatial":"LINESTRING(-179.48077 51.72814,-179.42595 51.80094,-179.39734 51.83398,-179.37474 51.86568,-179.18826 52.10105,-179.16482 52.12996,-179.14599 52.15132,-177.76666 52.85042,-177.47319 52.90084,-177.31238 52.92697,-177.03751 52.97394,-176.68481 53.03327)","timeline":["2017-01-15 09:06:39","2017-01-15 09:34:40","2017-01-15 09:47:38","2017-01-15 09:59:09","2017-01-15 11:30:09","2017-01-15 11:42:00","2017-01-15 11:50:28","2017-01-15 18:01:00","2017-01-15 18:56:22","2017-01-15 19:26:10","2017-01-15 20:15:49","2017-01-15 21:18:30"],"attributes":{"leafcount":12,"sog":{"type":"float","length":8,"nullable":false,"value":[10.5,11.0,10.6,11.2,9.1,9.7,9.9,12.3,12.0,12.2,12.8,12.7]},"cog":{"type":"float","length":8,"nullable":false,"value":[23.3,28.5,29.2,27.1,26.8,30.1,30.0,74.2,81.3,73.4,74.2,72.9]},"heading":{"type":"float","length":8,"nullable":false,"value":[22.0,27.0,24.0,29.0,27.0,26.0,27.0,69.0,72.0,71.0,72.0,73.0]}}}}
(1 row)
文档内容是否对您有帮助?