本章節將為您介紹Trajectory SQL的基本概念。
Trajectory對象
名稱 | 描述 |
Trajectory Point | 軌跡點,是由移動對象在某個時刻所在的空間位置與附帶的屬性值組成的時Null 物件,其中空間位置支援二維座標或三維座標,屬性支援多欄位多類型。 |
Trajectory Object | 軌跡對象,是由一系列軌跡點、軌跡事件組成的含時間、空間、屬性、事件的高維對象。 |
Trajectory Timeline | 軌跡時間序列,軌跡在時間上連續推進的時間值序列。 |
Trajectory Spatial | 軌跡空間對象,軌跡在空間上的Geometry對象,通常為linestring。 |
Trajectory Leaf | 軌跡葉子,這裡指軌跡點Point,即移動對象在某個時刻的空間位置。 |
Trajectory Attributes | 軌跡屬性資訊(以下簡稱屬性),移動對象在不同軌跡點上所具有的屬性資訊,比如速度資訊、方向資訊等。 |
Trajectory Attribute Field | 軌跡屬性欄位(以下簡稱欄位),軌跡屬性中的某個欄位,比如速度欄位,軌跡屬性欄位值的個數與軌跡點個數一致。 |
Trajectory Field Value | 軌跡屬性值,軌跡屬性在某一時刻某個欄位的值。 |
Trajectory Events | 軌跡事件,在軌跡行程中發生的額外事件,比如汽車行程軌跡中的加油事件、拋錨事件、鎖車事件等,由事件類型ID和事件時間組成。 |
軌跡示意圖如下。
BoxNdf對象
在實際計算時,由於軌跡模組涉及的對象(軌跡類型或幾何類型)常常十分複雜,在分析時可能會使用計算較為簡單的矩形框對象描述查詢或簡化計算。在軌跡模組,使用BoxNdf類型表示矩形框。
BoxNdf對象表示在時空中的一個多維立方體地區,其由在x,y,z(空間),t(時間)
四個座標軸上的最小值和最大值表示。每個矩形框包含的維度可能不同,有的矩形框只記錄x、y維度資訊,有些則可能記錄x、y、z、t四個維度資訊。
在查詢時可能用矩形框表示一個查詢範圍,在查詢時也可以利用軌跡或幾何類型的外包矩形框來輔助查詢。例如下圖就是一條在x,y,t
空間中的運動的軌跡和它對應的外包矩形框。
外包矩形框示意圖如下。
PostgreSQL的時間類型
PostgreSQL中涉及時間相關的有三種類型:
timestamptz:帶時區資訊(time zone)的時間類型。
timestamp:不帶時區資訊的時間類型。
interval:時間段類型。
在GanosBase Trajectory模組中,統一使用不帶時區的timestamp類型,並使用interval類型輔助計算。timestamp類型一般通過字串樣式(例如2000-01-01 10:00:00
)表示,常見操作如下:
-- 建立時間類型
SELECT '2000-01-01 10:00:00'::timestamp;
-- 從Unix時間戳記建立時間類型(需安裝ganos_trajectory外掛程式)
SELECT ST_UnixEpochToTS(1649765331);
-- 將時間類型轉換為Unix時間戳記
SELECT ST_TsToUnixEpoch('2022-04-12 12:08:51');
-- 利用interval類型計算時間的加減法
SELECT '2000-01-01 10:00:00'::timestamp + '30 day'::interval;
SELECT '2000-01-01 10:00:00'::timestamp - '1 month'::interval;
GanosBase的幾何類型
GanosBase幾何類型Geometry可以表示二維和三維的點、線、多邊形等各類空間幾何對象。其相容PostGIS的介面。在GanosBase Trajectory中,支援在軌跡類型和幾何類型之間執行多種空間計算。
-- 構造一個點(2,4)
SELECT 'POINT(2 4)'::geometry;
-- 構造一個折線(2,4)->(0,0)->(5,3)
SELECT 'LINESTRING(2 4, 0 0, 5 3)';
-- 構造一個多邊形。這裡是一個三角形,三個頂點分別為(3,3),(2,2),(5,5)
SELECT 'POLYGON(3 3, 5 5, 2 2, 3 3)';
-- 構造一個以(0,1)為中心,半徑為3的圓,不過是用多邊形近似的。通常來說,我們在執行和圓相交的查詢時,會使用ST_DistanceWithin等函數,而不會使用ST_Buffer函數。
SELECT ST_Buffer('POINT(0 1)', 3);
在一般的二維空間中,可以直接使用上述的操作;而對於地理上的經緯度座標,當我們計算兩點間的距離時,直接應用歐式距離是不合適的,而是需要計算兩點在地表橢球面上的距離,並且有時需要以米為單位進行距離度量。對於經緯度座標,我們通常設定SRID為4326, 即WGS84的投影座標,方式如下
-- 構造一個點(2,4)
SELECT 'SRID=4326;POINT(2 4)'::geometry;
-- 構造一個折線(2,4)->(0,0)->(5,3)
SELECT 'SRID=4326;LINESTRING(2 4, 0 0, 5 3)';
-- 構造一個多邊形。這裡是一個三角形,三個頂點分別為(3,3),(2,2),(5,5)
SELECT 'SRID=4326;POLYGON(3 3, 5 5, 2 2, 3 3)';
-- 構造一個以(0,1)為中心,半徑為3的圓,不過是用多邊形近似的。通常來說,我們在執行和圓相交的查詢時,會使用ST_DistanceWithin等函數,而不會使用ST_Buffer函數。
SELECT ST_SetSRID(ST_Buffer('POINT(0 1)', 3),4326);
在不同投影座標系下,點的座標也可能不同。一個常用的操作是將經緯度座標轉換成局部的以米為單位的座標,方便距離計算:
-- 轉為EPSG:3857,即Google的墨卡托座標系,以米為單位。常用於地圖應用
SELECT ST_Transform('SRID=4326;POINT(114 39)'::geometry, 3857);
-- 轉為EPSG:4479,即在中國附近更加準確的Gauss Kruger投影
SELECT ST_Transform('SRID=4326;POINT(114 39)'::geometry, 4479);