全部產品
Search
文件中心

ApsaraDB RDS:ST_StayPoint

更新時間:Feb 28, 2024

尋找軌跡的全部駐留點。駐留點是移動對象長期停留的點。

文法

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('STPOINT'::leaftype,'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)', '2000-01-01', '2000-01-01'::timestamp+ '1 day'::interval* (ST_NPoints('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)')-1), '{}') 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
 

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('STPOINT'::leaftype,'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)', '2000-01-01', '2000-01-01'::timestamp+ '1 day'::interval* (ST_NPoints('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)')-1), '{}') AS traj) tj;
 st_astext          | point                                      | length 
--------------------+--------------------------------------------+--------
 POINT(10.25 10.25) | 010100000000000000008024400000000000802440 | 6 days
 POINT(2 2)         | 010100000000000000000000400000000000000040 | 5 days