查找轨迹的全部驻留点。驻留点是移动对象长期停留的点。
语法
SETOF trstaypoint ST_StayPoint(trajectory traj, interval resample_int, float dr, interval dt, float thres);
TABLE(point geometry, length interval) ST_stayPointSpatialClustered(trajectory traj, interval resample_int, float dr, interval dt, float thres, float merger)
参数
参数名称 | 描述 |
---|---|
traj | 轨迹对象。 |
resample_int | 轨迹重采样的时间间隔。重采样可以让轨迹的采样点更加均匀。时间间隔越小,驻留点的计算越精确,但计算更慢。当不需要重采样时,可以将此值设置为很大,例如'100000 day'。更多信息,请参见ST_Resample。 |
dr | 空间容差。按照轨迹的SRID所对应的单位进行计算。例如,对SRID=0的轨迹,按照欧式距离计算,对SRID=4326的轨迹,按照米计算。 |
dt | 时间容差。应该略长于单次驻留的时间。 |
thres | 当一个点周边(空间距离小于dr,时间差小于dt)的轨迹采样点数量超过thres时,认为其是驻点。当连续多个点都被识别为驻点时,会找到周边点数最多的点作为最终的驻点。 |
merger | 将距离小于merger的两个不同时间的驻点合并为一个。 |
返回值类型trstaypoint是包含3列的复合类型,三列分别如下:
列名 | 列类型 | 说明 |
---|---|---|
point | geometry | 驻点的位置。 |
startt | timestamp | 开始驻留的时间(按第一个被识别为驻点的点计算)。 |
endt | timestamp | 结束驻留的时间(按最后一个被识别为驻点的点计算)。 |
描述
本函数识别一条轨迹的驻点。例如,如果我们认为在500米范围内停留30分钟以上算作驻留,则可以选取resample_int为5分钟,dr为250米,dt为40分钟,而thres为7(30分钟处以5分钟,再加1)进行识别。
对于有多次往返线路的轨迹,可以使用ST_stayPointSpatialClustered函数,将空间上相近的驻点进行聚合,并得到总的驻点和停留时间。这些驻点可能对应着移动对象经常停留的地点,如加油站、停车场等。
示例
SELECT ST_AsText((ST_StayPoint(traj, '12 hour', 3, '3 day', 3)).point),(ST_StayPoint(traj, '12 hour', 3, '3 day', 3)).*
FROM (SELECT ST_MakeTrajectory('LINESTRING(1 1, 2 2, 3 3, 10 10, 11 11, 12 12, 13 13, 3 3, 2 2, 2 2, 3 3, 8 8,10 10,9 9,8 8)') AS traj) tj;
st_astext | point | startt | endt
----------------+--------------------------------------------+---------------------+---------------------
POINT(1 1) | 0101000000000000000000F03F000000000000F03F | 2000-01-01 00:00:00 | 2000-01-03 00:00:00
POINT(11 11) | 010100000000000000000026400000000000002640 | 2000-01-04 00:00:00 | 2000-01-07 00:00:00
POINT(3 3) | 010100000000000000000008400000000000000840 | 2000-01-08 00:00:00 | 2000-01-11 00:00:00
POINT(9.5 9.5) | 010100000000000000000023400000000000002340 | 2000-01-12 00:00:00 | 2000-01-15 00:00:00
(4 rows)
SELECT ST_AsText((ST_stayPointSpatialClustered(traj, '12 hour', 3, '3 day', 3, 3)).point), (ST_stayPointSpatialClustered(traj, '12 hour', 3, '3 day', 3, 3)).*
FROM (SELECT ST_MakeTrajectory('LINESTRING(1 1, 2 2, 3 3, 10 10, 11 11, 12 12, 13 13, 3 3, 2 2, 2 2, 3 3, 8 8,10 10,9 9,8 8)') AS traj) tj;
st_astext | point | length
--------------------+--------------------------------------------+--------
POINT(10.25 10.25) | 010100000000000000008024400000000000802440 | 6 days
POINT(2 2) | 010100000000000000000000400000000000000040 | 5 days
(2 rows)