Trajectory SQL は、ApsaraDB RDS for PostgreSQL 向けの GanosBase 拡張機能であり、時間と空間におけるオブジェクトの移動をモデル化し、クエリを実行します。このトピックでは、時空間クエリを記述する前に理解しておくべき、コアとなるデータ型と概念を紹介します。
トラジェクトリオブジェクト
トラジェクトリ とは、オブジェクトの完全な移動記録を表すもので、どこにいたか、いつそこにいたか、各瞬間に何が起きていたかを示します。Trajectory SQL は、この記録を以下のコンポーネントに構造化します。
| 概念 | 説明 |
|---|---|
| トラジェクトリ ポイント | 特定の瞬間における移動オブジェクトのスナップショットです。その位置 (2D または 3D 座標) と、任意の数の属性フィールド (速度や燃料レベルなど) を含みます。 |
| トラジェクトリ オブジェクト | 移動オブジェクトの完全な高次元記録であり、時間、空間、属性、イベントを組み合わせたものです。 |
| トラジェクトリ タイムライン | トラジェクトリ内のタイムスタンプの順序付けられたシーケンスです。タイムスタンプは連続している必要があります。 |
| トラジェクトリ 空間 | トラジェクトリ パスの空間ジオメトリであり、通常は LineString として表現されます。 |
| トラジェクトリ リーフ | 単一の時点における移動オブジェクトの空間位置です。1 つのトラジェクトリ ポイントの位置に相当します。 |
| トラジェクトリ 属性 | トラジェクトリに沿って記録されるポイント単位の属性データであり、速度や方向などが含まれます。各属性は、トラジェクトリ ポイントごとに 1 つの値を持ちます。 |
| トラジェクトリ 属性フィールド | speedトラジェクトリ内の名前付き属性列です (例:)。フィールドは、トラジェクトリ ポイントの数と正確に同じ数の値を持ちます。 |
| トラジェクトリ フィールド値 | 特定の時点における、特定のトラジェクトリ 属性フィールドの値です。 |
| トラジェクトリ イベント | トラジェクトリに沿って発生した個別のイベントです。例えば、給油停止、故障、車両ルート上でのドアロックイベントなどです。各イベントは、イベントタイプ ID とタイムスタンプを記録します。 |
例: 配送車両のトラジェクトリには、定期的な間隔で記録されたトラジェクトリ ポイントが含まれます。各トラジェクトリ ポイントは、車両の GPS 座標 (トラジェクトリ リーフ) を保存し、speed_kmh や engine_temp などのトラジェクトリ 属性フィールドが、各ポイントにおけるセンサーの読み取り値を記録します。車両が燃料補給のために停止すると、その停止はトラジェクトリ イベントとして記録されます。
次の図は、移動オブジェクトのトラジェクトリを示しています。
BoxNDF オブジェクト
生のトラジェクトリ データに対する時空間計算は高コストです。BoxNDF データ型は、軽量な近似値 (多次元バウンディングボックス) を提供し、正確なトラジェクトリ操作を適用する前に検索空間を絞り込むことで、クエリを高速化できます。
BoxNDF オブジェクトは、最大 4 つの軸 (x、y、z (空間)、t (時間)) における最小値と最大値によって定義される立方体です。すべての軸が必須というわけではなく、BoxNDF は x と y のみをカバーすることも、4 つの軸すべてを同時にカバーすることもできます。
BoxNDF は、次の用途で使用します。
-
クエリ領域の指定:検索する空間的および時間的境界を定義します。
-
トラジェクトリまたはジオメトリの近似:正確な交差または包含チェックを実行する前に、そのバウンディングボックスを高速な事前フィルタとして使用します。
次の図は、x 軸、y 軸、t 軸に沿って移動するオブジェクトのバウンディングボックスを示しています。
時間値データ型
PostgreSQL は、3 つの時間関連データ型をサポートしています。ユースケースに基づいて選択してください。
| 型 | 説明 | 使用場面 |
|---|---|---|
| TIMESTAMP | タイムゾーン情報を持たない時点です。 | GanosBase トラジェクトリモジュールで使用します。すべてのトラジェクトリ タイムスタンプは TIMESTAMP を使用します。 |
| TIMESTAMPTZ | タイムゾーン情報を持つ時点です。 | アプリケーションが複数のタイムゾーンにまたがるデータを処理する必要がある場合に使用します。 |
| INTERVAL | 期間です (例:30 日、1 か月)。 | 日付演算 (TIMESTAMP 値に対する期間の加算または減算) に使用します。 |
GanosBase トラジェクトリモジュールは、TIMESTAMP 型を使用してタイムスタンプを保存し、クエリを実行します。
TIMESTAMP 値は、YYYY-MM-DD HH:MM:SS の形式を使用します。例: 2000-01-01 10:00:00
一般的な時間値操作:
-- TIMESTAMP 値を作成します。
SELECT '2000-01-01 10:00:00'::TIMESTAMP;
-- UNIX タイムスタンプを TIMESTAMP に変換します。ganos_trajectory 拡張機能が必要です。
SELECT ST_UnixEpochToTS(1649765331);
-- TIMESTAMP を UNIX タイムスタンプに変換します。
SELECT ST_TsToUnixEpoch('2022-04-12 12:08:51');
-- TIMESTAMP に INTERVAL を加算します。
SELECT '2000-01-01 10:00:00'::TIMESTAMP + '30 day'::interval;
-- TIMESTAMP から INTERVAL を減算します。
SELECT '2000-01-01 10:00:00'::TIMESTAMP - '1 month'::interval;
ジオメトリ型
GanosBase は、2D および 3D 空間におけるポイント、ライン、ポリゴンをサポートしています。ジオメトリ型は PostGIS インターフェイスと互換性があり、トラジェクトリモジュールは、トラジェクトリとジオメトリ オブジェクト間の空間計算をサポートしています。
基本的なジオメトリの構築
次の例では、Well-Known Text (WKT) 表記を使用してジオメトリ オブジェクトを構築します。
-- 点 (2, 4) を構築します。
SELECT 'POINT(2 4)'::geometry;
-- (2,4)、(0,0)、(5,3) を通るラインを構築します。
SELECT 'LINESTRING(2 4, 0 0, 5 3)';
-- (3,3)、(5,5)、(2,2) を頂点とする三角形のポリゴンを構築します。
SELECT 'POLYGON((3 3, 5 5, 2 2, 3 3))';
-- 円を近似します:中心 (0,1)、半径 3。
-- 円形範囲クエリには、ST_Buffer の代わりに ST_DistanceWithin を使用します。
SELECT ST_Buffer('POINT(0 1)', 3);
座標と空間参照系
データがカバーする領域に基づいて、座標アプローチを選択します。
-
プレーンなデカルト座標 (SRID なし):データが小さく限定された領域に限られており、表面を平面として扱える場合に使用します。ユークリッド距離計算は、ローカルスケールのデータに対して高速かつ十分に正確です。
-
SRID 4326 (WGS84) を使用した地理座標:データが緯度と経度を使用する場合 (例:広範囲にわたる GPS 座標) に使用します。地理座標では、ユークリッド距離は意味を持ちません。代わりに地表面距離計算を使用してください。
-- WGS84 を使用して、経度 2、緯度 4 の点を構築します。
SELECT 'SRID=4326;POINT(2 4)'::geometry;
-- WGS84 座標でラインを構築します。
SELECT 'SRID=4326;LINESTRING(2 4, 0 0, 5 3)';
-- WGS84 座標でポリゴンを構築します。
SELECT 'SRID=4326;POLYGON((3 3, 5 5, 2 2, 3 3))';
-- (0,1) を中心とし、半径 3 の円を近似し、SRID 4326 を割り当てます。
SELECT ST_SetSRID(ST_Buffer('POINT(0 1)', 3), 4326);
投影座標系
地理座標 (緯度と経度) は、位置を角度として表現し、距離ではありません。メートル単位で距離を測定するには、ST_Transform を使用して投影座標系 (PCS) に変換します。
一般的な 2 つの投影法:
| 投影法 | EPSG コード | 説明 | 最適な用途 |
|---|---|---|---|
| 球面メルカトル | EPSG:3857 | メートル単位で測定します。Web マッピングサービスで広く使用されています | 一般的な Web マップアプリケーション |
| ガウス・クリューゲル | EPSG:4479 | 中国向けのより正確なメートルベースの投影法です | 中国における高精度な距離計算 |
-- WGS84 座標を球面メルカトル (メートル) に変換します。
SELECT ST_Transform('SRID=4326;POINT(114 39)'::geometry, 3857);
-- WGS84 座標をガウス・クリューゲル (メートル、中国で正確) に変換します。
SELECT ST_Transform('SRID=4326;POINT(114 39)'::geometry, 4479);