在軌跡分析場景中,通常需要對軌跡點進行計算和處理,得到軌跡規律和運動趨勢。如果業務中存在大量的冗余軌跡點,可能會導致計算成本的增加。您可以通過Lindorm時空函數完成軌跡抽稀,過濾掉冗余的軌跡點,提取特征數據并保留軌跡規律,同時降低計算成本。
場景描述
隨著移動互聯網的發展和移動終端的普及,我們日常生活中產生了大量的移動對象軌跡數據,這些數據的存儲成為了新的挑戰。為應對這一挑戰,Lindorm寬表引擎提供了空間數據類型和Ganos服務,支持將位置信息以POINT空間數據類型、FLOAT經緯度形式存儲在寬表引擎中,您還可以使用時空函數或通過構建索引,優化查詢性能。
以下是一個軌跡分析場景中,使用時空函數優化查詢的示例:
某物聯網平臺客戶使用Lindorm存儲軌跡數據,需要實時將軌跡顯示在大屏中,為減少前端渲染計算量,需要按照指定規則,根據不同的精度需求對軌跡進行抽稀,抽稀前后結果如下圖所示。
技術實現
Lindorm Ganos時空服務提供了ST_Resample
聚合函數,可以通過指定抽稀算法實現不同效果的軌跡抽稀,減少數據傳輸和前端渲染的計算量。
ST_Resample
函數共支持三種空間抽稀(降采樣)算法:
Visvalingam-Whyatt算法:指定容差,遞歸解出軌跡上連續三點組成的三角形的面積最大值,保留所有面積大于容差的點。
Douglas-Peucker (DP) 算法:指定容差,遞歸解出兩點連線與兩點之間的各個頂點的垂直距離最大值,保留所有垂直距離大于容差的點。
Topology Preserving DP算法:保留軌跡線串拓撲結構的Douglas-Peucker算法。
ST_Resample
聚合函數也支持按照時間間隔來抽稀,詳細介紹,請參見ST_Resample。
前提條件
已將客戶端IP地址添加至Lindorm白名單。如何添加,請參見設置白名單。
已開通Lindorm Ganos時空服務。如何開通,請參見開通時空服務(免費)。
步驟一:建表并寫入測試數據
創建表gps_points,包含三個列:設備ID列account_id、數據采集時間列collect_time、POINT類型軌跡點列gps_point。
CREATE TABLE gps_points (account_id VARCHAR, collect_time TIMESTAMP, gps_point GEOMETRY(POINT), PRIMARY KEY(account_id, collect_time));
寫入測試數據。
INSERT INTO gps_points(account_id, collect_time, gps_point) VALUES('001', '2023-11-10 11:00:30', ST_MakePoint(113.665431, 34.773)), ('001', '2023-11-10 11:00:31', ST_MakePoint(113.665432, 34.773)), ('001', '2023-11-10 11:00:32', ST_MakePoint(113.665433, 34.773)), ('001', '2023-11-10 11:00:33', ST_MakePoint(113.665434, 34.774));
步驟二:抽稀查詢
使用Ganos聚合函數ST_Resample
,可以實現僅通過一條SQL語句就獲取到抽稀結果。
以下示例指定了軌跡點對象列 (gps_point)、時間列 (collect_time),獲取account_id為001的設備在指定時間段內采集到的軌跡點,并指定抽稀算法和降采樣距離閾值。
SELECT ST_Resample(gps_point, collect_time,'{"downsample_distance": 0.0001, "simplifier": "vw"}') as resampled_traj FROM gps_points WHERE collect_time >= '2023-11-10 00:00:00' and collect_time <= '2023-11-11 00:00:00' and account_id='001';
返回結果如下:
+---------------------------------------------------------+
| resampled_traj |
+---------------------------------------------------------+
| [{"x":113.665431,"y":34.773,"t":"2023-11-10 |
| 11:00:30.0"},{"x":113.665434,"y":34.774,"t":"2023-11-10 |
| 11:00:33.0"}] |
+---------------------------------------------------------+
返回值為降采樣后按時間排序的軌跡點序列,類型為STRING,格式為[{\"x\":經度,\"y\":緯度,\"t\":時間}, {\"x\":經度,\"y\":緯度,\"t\":時間}, ...]
。
性能表現
當表中的行數達到10億級別,查詢的軌跡時間范圍可能從幾小時到數天不等。
下表統計了數據集行數為10億以上時,不同時間維度,相同時間范圍內使用ST_Resample函數和不使用ST_Resample函數的返回點數:
查詢時間范圍 | 使用ST_Resample函數 | 不使用ST_Resample函數 |
查詢時間范圍 | 使用ST_Resample函數 | 不使用ST_Resample函數 |
1小時 | 9 | 405 |
1天 | 37 | 829 |
10天 | 118 | 8539 |
可以看出,當查詢數據范圍較大時,使用ST_Resample
函數進行查詢時返回點數顯著減少。對比不使用ST_Resample
函數,使用ST_Resample
函數后可以減少數據計算成本,簡化數據計算方式。
- 本页导读 (1)
- 場景描述
- 技術實現
- 前提條件
- 步驟一:建表并寫入測試數據
- 步驟二:抽稀查詢
- 性能表現