全部產品
Search
文件中心

PolarDB:基於GanosBase軌跡模型:運輸車輛到達性分析

更新時間:Dec 05, 2024

本文介紹了時空資料庫GanosBase軌跡模型在運輸車輛位置分析中的應用情境。GanosBase通過在資料庫中原生內建移動對象的儲存、檢索與分析能力,打造全球首個移動對象資料庫,為交通、物流、出行、生活服務類客戶提供海量軌跡資料的分析挖掘能力。

能力介紹

關於軌跡模型

軌跡模型是時Null 物件中的一個重要模型,旨在支援對行人、汽車、船隻、飛機等移動對象的處理與分析。

軌跡資料在應用中可以從兩種視角進行分析。一種視角是將軌跡視為離散的點集,從而對其進行操作。另一種視角是將軌跡視為一條連續的線,表示為隨時間變化的空間折線。這兩種表示方法各有適用的範圍。連續的軌跡線對採樣頻率不敏感,可作為折線進行各類空間運算。相較之下,離散的軌跡點對採樣方式和採樣頻率的敏感性更高,但在演算法上更加友好和簡單。常見的相似性計算、軌跡切分等函數通常基於對點的操作。

軌跡常用操作

在實際使用中,常常出現需要滿足特定條件的軌跡採樣點的情況。例如:

  • 即時資料的儲存

    搭載GPS的汽車、共用單車等交通工具,其軌跡點的產生頻率極為迅速,可能每1至5秒就會產生一個新的採樣點。在即時檢測情境中,即時軌跡點具有重要的應用價值。然而,當軌跡點數量過多時,個別點所提供的資訊實際上有限,但卻佔用了大量的儲存空間。因此,需要去除一些軌跡點,以盡量保留軌跡資訊的前提下,降低儲存空間的佔用。

  • 軌跡資料的預先處理

    在實際情境中,由於多種原因,採樣資料往往存在不準確的情況。非人為因素包括定位系統的誤差、訊號傳遞品質的不穩定以及裝置的損壞等。人為因素則包括手動關閉採樣或在未進行採樣時移動物體等。在這些情況下,通常需要對軌跡上的特殊點進行特殊處理,諸如漂移點、駐留點和跳躍點。

  • 軌跡特徵提取

    在業務應用中,許多情況下不僅需要直接使用軌跡,還需提取軌跡的一些特徵資訊。最基礎的特徵資訊包括長度、點數、時間範圍等,而高階特徵則涵蓋軌跡之間的相似性、密度聚類的聚簇位置等。在許多高階特徵的計算中,通常採用離散的近似演算法,如動態時間規整(DTW)、最小連續子序列(LCSS)、編輯距離(EDR)等。這類演算法對前述的軌跡簡化和採樣不準確問題往往較為敏感,使用經過簡化的軌跡或採樣不均勻的軌跡可能導致結果的顯著差異。因此,通常需要對軌跡進行重採樣,以使得點與點之間的時間或空間差值趨於均勻。

案例情境

情境概述

交通運輸公司每日管理著大量的運輸車輛。這些車輛配備了GPS系統,能夠每隔數秒擷取即時位置資訊。同時,車輛位置資訊與車輛狀態資訊、運輸單資訊等業務資料進行關聯,為後續開展深度軌跡分析與挖掘奠定基礎。主要應用情境包括:

  • 軌跡儲存查詢與展示:運輸車輛的軌跡資料主要包括運輸單、經度、緯度和時間這四個欄位,推送頻率為每5秒產生一個資料點。在正常情況下,一個公司每天有數百至數千輛車同時在途,預計每天會寫入千萬級的軌跡資料。在擷取軌跡資料後,需要進行軌跡預先處理(如壓縮、抽稀等),並將處理結果展示於業務系統上。

  • 到達性分析:為了確保運輸車輛的及時到達,通常會在地圖上設定多個電子圍欄(例如高速公路出口等重要位置)。如果在特定時間點車輛尚未觸及這些電子圍欄,則意味著該車輛可能無法在規定時間內將貨物送達客戶。因此,需要觸發預警,以通知相關工作人員進行處理。

  • 停留點分析:長途運輸車輛通常需要在途中進行休息。為了避免駕駛人員因夜間駕駛而帶來的潛在安全隱患,有必要對運輸車輛在夜間是否存在停留點進行監管(即大量軌跡在空間位置上的靜止)。如果在夜間時間段內未出現停留點,則需提醒駕駛員儘快進行休息。

  • 軌跡相似性:運輸車隊中的部分車輛出現了位置偏離,可能是由於車輛駛入錯誤的路線,從而導致貨運到達性風險的產生。為此,需要根據多輛車輛軌跡的相似性,識別異常軌跡,以便及時發現潛在風險。

情境分析

為實現上述情境,可能需要對車輛軌跡進行預先處理、分析與壓縮,最終以支援前端展示。可能用到的主要功能包括::

  1. 軌跡切分(ST_Split):通過幾何對象將一條軌跡切分為多條子軌跡,可以協助業務將一輛運輸車的總體軌跡按照不同的運貨單進行分割。

  2. 軌跡構造(ST_append):通過向一條軌跡中不斷追加新的軌跡點,可以獲得全新的軌跡對象,從而協助業務即時構建不斷延長的軌跡。

  3. 軌跡空間關係判斷(ST_intersects):判斷軌跡是否與幾何對象相關,有助於業務分析在相關時間段內是否觸及了電子圍欄的規定範圍。

  4. 軌跡駐點(ST_StayPoint):提取軌跡中的停留點,可以協助業務分析在任意時間段內車輛的停留時間長度,從而判斷是否存在疲勞駕駛的行為。

  5. 軌跡簡化(ST_Compress):壓縮軌跡能夠協助業務根據空間距離位移閾值、角度偏離閾值及加速度偏離閾值等標準進行資料壓縮,從而減少最終渲染的資料量。

最佳實務

安裝外掛程式

執行如下SQL語句,安裝所需外掛程式。

CREATE EXTENSION ganos_spatialref;
CREATE EXTENSION ganos_geometry;
CREATE EXTENSION ganos_trajectory;

軌跡表配置

執行如下SQL語句,配置軌跡點表、軌跡表和電子圍欄表。

-- 定義軌跡點表,包含運輸單號、經度、緯度、時間四個欄位
CREATE TABLE bill_point(id integer, longitude double precision, latitude double precision, sample_time timestamp);

-- 定義軌跡表, 包含運輸單號、軌跡對象兩個欄位
CREATE TABLE bill_traj(id integer UNIQUE, traj trajectory);

--建立空間索引
CREATE INDEX ON bill_traj USING gist(traj);

-- 定義電子圍欄表,包含圍欄查詢的id,時間和空間範圍
CREATE TABLE fence(id integer, fence_time timestamp, area geometry);

-- 建立id和時間索引
CREATE INDEX ON fence USING btree(id);
CREATE INDEX ON fence USING btree(fence_time);

-- 建立Trigger函數
CREATE OR REPLACE FUNCTION trajectory_sync_point() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO bill_traj
SELECT NEW.id, ST_MakeTrajectory(array_agg(ROW(NEW.sample_time, NEW.longitude, NEW.latitude)), false, '{}'::cstring[])
ON CONFLICT(id) DO UPDATE
  SET traj = ST_Append(bill_traj.traj, excluded.traj);
RETURN NULL;
END;
$$
LANGUAGE plpgsql STRICT PARALLEL SAFE;

-- 建立同步Trigger
CREATE TRIGGER point_trigger AFTER INSERT ON bill_point
    FOR EACH ROW EXECUTE PROCEDURE trajectory_sync_point();

通過點表插入資料並執行電子圍欄查詢

  1. 通過在軌跡點表中插入點,進而在軌跡表中構建軌跡資料。

    -- 向點表插入id為1的軌跡資料
    INSERT INTO bill_point VALUES (1, 2, 2, '2000-01-01 00:01:00'), (1, 2.1, 2, '2000-01-01 00:02:00'), (1, 2.2, 2, '2000-01-01 00:03:00');
    
    -- 從軌跡表中查詢,確認點表的新的點已經成功同步到軌跡表
    SELECT * FROM bill_traj;
    
    -- 查看id為1的軌跡中的所有點
    SELECT f.* FROM (SELECT traj FROM bill_traj WHERE id = 1) a, ST_AsTable(a.traj) AS f(t timestamp,x double precision, y double precision);
  2. 對軌跡表中的軌跡資料執行即時的電子圍欄查詢。

    -- 設定電子圍欄,這裡我們設定為:在2000-01-01 00:05:00通過一個經度在 2.3,緯度在2附近的地區
    INSERT INTO fence VALUES(1, '2000-01-01 00:05:00', ST_MakeEnvelope(2.29,1.99,2.31,2.01)); 
    
    -- 我們假設業務上每隔一分鐘執行一次電子圍欄的掃描,則使用下列語句。
    -- now() >= fence.fence_time AND now() - '60 s'::interval < fence.fence_time 這裡我們因為一分鐘執行一次,因此只截取在這一分鐘需要判斷的fence。這裡使用當前的時間減去fence設定的時間,小於1分鐘則代表我們目前需要對此fence進行判斷
    -- fence.id = bill_traj.id 提取對應的軌跡
    -- ST_EndTime(bill_traj.traj) >= fence.fence_time 代表確認軌跡的末尾已經超過此時間
    -- ST_2DIntersects(bill_traj.traj, fence.area)檢查相交
    -- 此時沒有因為遲到而觸發電子圍欄的查詢,返回空
    SELECT fence.id FROM fence JOIN bill_traj ON now() >= fence.fence_time AND now() - '60 s'::interval < fence.fence_time AND fence.id = bill_traj.id AND ST_EndTime(bill_traj.traj) >= fence.fence_time AND NOT ST_2DIntersects(bill_traj.traj, fence.area);
    
    -- 新插入一個點,此時軌跡的時間到達了電子圍欄的設定時間,此點不在圍欄範圍內,觸發電子圍欄
    INSERT INTO bill_point VALUES (1, 2.25, 2, '2000-01-01 00:05:00');
    
    -- 查看此時id為1的軌跡的點
    SELECT f.* FROM (SELECT traj FROM bill_traj WHERE id = 1) a, ST_AsTable(a.traj) AS f(t timestamp,x double precision, y double precision);
    
    -- 現在我們假設目前時間是2000-01-01 00:05:00。執行下列語句,查詢所有fence是否被觸發;此時發現id為1的電子圍欄被觸發,說明對應的車輛已經遲到
    SELECT fence.id FROM fence JOIN bill_traj ON fence.id = bill_traj.id AND ST_EndTime(bill_traj.traj) >= fence.fence_time AND NOT ST_2DIntersects(bill_traj.traj, fence.area);
    
    -- 此時又輸入了一個新增軌跡點,其空間上進入了電子圍欄,說明此時此車輛已經經過指定地點。此時再進行查詢,就發現沒有電子圍欄被觸發,所有車輛狀態正常
    INSERT INTO bill_point VALUES (1, 2.3, 2, '2000-01-01 00:06:00');
    
    SELECT fence.id FROM fence JOIN bill_traj ON fence.id = bill_traj.id AND ST_EndTime(bill_traj.traj) >= fence.fence_time AND NOT ST_2DIntersects(bill_traj.traj, fence.area);
    
    -- 查看此時id為1的軌跡的點
    SELECT f.* FROM (SELECT traj FROM bill_traj WHERE id = 1) a, ST_AsTable(a.traj) AS f(t timestamp,x double precision, y double precision);
    
    -- 軌跡點繼續輸入,離開電子圍欄,但不再影響電子圍欄是否被觸發
    INSERT INTO bill_point VALUES (1, 2.3, 2.1, '2000-01-01 00:07:00');
    INSERT INTO bill_point VALUES (1, 2.2, 1.9, '2000-01-01 00:08:00');

直接構造軌跡資料並求取駐點

  1. 可以不通過點表,直接在軌跡表中構造一條較長的軌跡資料。

    --根據分別指定軌跡的時間,空間對象來建立軌跡
    INSERT INTO bill_traj SELECT
    2, ST_makeTrajectory ('STPOINT'::leaftype, 'LINESTRING(0 0,1 1,2 2,2 2,2 2,2 3,3 4,2 4,2 3,2 3,2 3,2 2,2 1,2 0,1 0,0 0,-1 0)'::geometry, '{"2000-01-01 00:12:34","2000-01-01 00:23:37","2000-01-01 00:34:41","2000-01-01 00:45:45","2000-01-01 00:56:48","2000-01-01 01:07:52","2000-01-01 01:18:56","2000-01-01 01:30:00","2000-01-01 01:41:03","2000-01-01 01:52:07","2000-01-01 02:03:11","2000-01-01 02:14:14","2000-01-01 02:25:18","2000-01-01 02:36:22","2000-01-01 02:47:25","2000-01-01 02:58:29","2000-01-01 03:09:33"}'::timestamp[], NULL);
  2. 通過對軌跡的駐留點進行檢測,可以判斷車輛是否進行了足夠的休息,以及其休息的具體位置。

    -- 擷取id為2的軌跡的駐留點。
    -- 其中,第一個參數代表軌跡,第二個參數代表對軌跡按5分鐘為採樣間距進行採樣,第三個參數和第四個參數代表將距離在0.1以內,時間差在15分鐘以內的點視為臨近點,第五個參數代表一個點的臨近點數量超過3個就確定其在此處駐留
    SELECT ST_StayPoint(traj, '5 minute', 0.1, '15 minute', 3) from bill_traj where id =2 ;

    返回兩個駐留點:

                                           st_staypoint                                       
    ------------------------------------------------------------------------------------------
     (010100000000000000000000400000000000000040,"2000-01-01 00:34:41","2000-01-01 00:56:48")
     (010100000000000000000000400000000000000840,"2000-01-01 01:41:03","2000-01-01 02:03:11")
  3. (可選)實際業務中,可以對駐留點查詢結果進行加工。

    -- 擷取兩個駐留點的位置
    SELECT ST_AsText((ST_StayPoint(traj, '5 minute', 0.1, '15 minute', 3)).point) from bill_traj where id =2 ;
    
    -- 檢查此軌跡的駐留(休息)總時間長度是否超過30分鐘。如果沒超過,可能代表其疲勞駕駛
    SELECT SUM(duration) >= '30 minute'::interval FROM (SELECT (ST_StayPoint(traj, '5 minute', 0.1, '15 minute', 3)).endt - (ST_StayPoint(traj, '5 minute', 0.1, '15 minute', 3)).startt as duration  from bill_traj where id =2 ) staytime;

軌跡簡化

對於點數較多的軌跡點,可以使用ST_Compress函數對其進行簡化,以便於後續的展示。

-- 擷取簡化後的軌跡,可以看到,id為2的軌跡簡化後由17個點簡化為7個點。參數0.2代表簡化後的軌跡距離原軌跡最大距離為0.2。此簡化後的軌跡可以用於最上層顯示。
SELECT ST_Compress(traj, 0.2) FROM bill_traj;

-- 查看簡化後的id為2的軌跡的所有採樣點
SELECT f.* FROM (SELECT traj FROM bill_traj WHERE id = 2) a, ST_AsTable(ST_Compress(a.traj, 0.2)) AS f(t timestamp,x double precision, y double precision);

總結

GanosBase軌跡模型提供了一系列雲原生的移動對象資料類型、函數以及預存程序,協助您高效管理、查詢和分析時空軌跡資料。相較於傳統方案,GanosBase的軌跡模型具備原生資料類型及空間索引,查詢效率很高。同時,軌跡模型提供了包括軌跡構造、軌跡處理、軌跡屬性、軌跡事件、軌跡空間關係、軌跡時空關係、軌跡統計、軌跡量測、軌跡相似性等十餘大類、數百個運算元的支援,具備較強的易用性。目前,GanosBase軌跡模型在交通運輸、快遞物流、快捷出行、生活服務及公用安全等領域具備了十分完善的能力供給與應用案例,服務了多種客戶群體,為客戶的智能化位置服務應用提供了穩定、高效和健全的時空基礎保障。