このトピックでは、軌道モデルの詳細と使用方法について説明します。
概要
概要
軌道モデルは、特定の条件を満たす移動物体の集合である。 それは通常交通機関、兵站学、旅行および自動車のような区域で使用されます。
GanosBase Trajectoryは、PostgreSQL ( PolarDB for PostgreSQL (Compatible with Oracle)) の時空間エンジン拡張です。 軌道は、移動するオブジェクトのサンプリングポイントと属性を格納し、オブジェクトを分析するために、GanosBaseによって提供される自己開発のデータ型です。
機能
軌道は、軌道データの保存と分析のための複数の機能をサポートします。
軌道構築: ジオメトリ、タイムスタンプ、配列、データテーブルなどのデータソースに基づいて軌道を構築できます。
軌道編集: 軌道の時間、ジオメトリ、属性、イベントなどのオブジェクト情報を編集できます。 また、軌道の単純化、分割、平滑化、サブ軌道の抽出、軌道の時空間フィーチャの編集など、他の操作を実行することもできます。
軌道分析: 空間関係と時空関係を特定し、類似性を分析し、軌道の特徴を抽出することができます。
軌道インデックス作成: 時空間インデックスを作成して、前述のクエリと分析を高速化できます。
詳細については、「軌跡 SQL リファレンス (Trajectory SQL reference)」をご参照ください。
シナリオ
GanosBase Trajectoryは、次のシナリオで使用できます。
歴史的な軌跡のアーカイブ
共有自転車などの一部のエリアでは、GanosBase Trajectoryを使用して、高周波サンプリングポイントを軌道に集約できます。 このような軌道は、軌道簡略化アルゴリズムを使用して簡略化およびダウンサンプリングし、データベースまたはOSSバケットに保存してストレージコストを節約できます。 GanosBaseを使用すると、データがデータベースに保存されているかOSSに保存されているかに関係なく、統一された方法で軌道データにアクセスできます。
弾道の時空間データ分析と類似性分析
GanosBase Trajectoryを使用すると、特定の時空間領域を通過する、または特定の軌道に似ている軌道をクエリできます。 このようにして、特定のタイプの顧客を特定してサポートしたり、クーポンを発行したりするなど、ビジネスオペレーションに使用できる軌跡を特定できます。
軌道特徴の抽出と分析
GanosBase Trajectoryを使用して、ドリフトポイントをリサンプリングして削除し、長さ、持続時間、滞在ポイント、曲線などの統計情報を抽出することで、ユーザーの過去の軌跡を消去できます。 次に、ニューラルネットワークまたは他のアルゴリズムに基づく機械学習のための情報を使用して、ユーザーの管理と推奨に使用できるユーザープロファイルを生成できます。
コンポーネント
概要
軌跡は、異なる時点での現実世界における移動物体の空間位置を記録する。 オブジェクトの軌跡は、異なる時点におけるオブジェクトの空間位置を記録する、時空間情報を有する点のシーケンスである。
たとえば、オブジェクトが2020年4月11日の17:42:30に緯度と経度 (114.35、39.28) を報告した場合、次のレコードがデータベースに生成されます。
時間 | x | y |
2020-04-11 17:42:30 | 114.35 | 39.28 |
軌道のサンプリング点は、通常、速度および方向などの追加情報を記録する。 次の例では、速度は軌道データに記録されます。
時間 | x | y | スピード |
2020-04-11 17:42:30 | 114.35 | 39.28 | 4.3 |
経時的に、軌道点のセットが生成される。 この例では、3つの軌道点のレコードが生成される。
時間 | x | y | スピード |
2020-04-11 17:42:30 | 114.35 | 39.28 | 4.3 |
2020-04-11 17:43:30 | 114.36 | 39.28 | 4.8 |
2020-04-11 17:45:00 | 114.35 | 39.29 | 3.5 |
これらの軌道点は、次の図に示すように、時空間軌道を構成します。

GanosBase Trajectoryは、個々の軌道ポイントを格納する代わりに、移動オブジェクトの複数の軌道ポイントを集約して格納します。 これにより、複数の軌道ポイントを圧縮することでストレージコストを節約できます。 軌道交差の識別、サブ軌道の抽出、軌道類似性の識別など、単一の点ではなく、集約された軌道全体に対して操作を実行することもできます。
さらに、GanosBaseは、イベント属性をサポートして、単一のサンプリングポイントとは無関係な異なる時点でイベントを記録します。 イベントは、{type:timestamp} 形式の2タプルとして記録されます。 この形式では、typeはユーザー定義のイベント番号 (整数型) 、timestampはイベントが発生した時刻です。
ストレージ
移動オブジェクトの軌跡データは、通常、次のいずれかの方法で保存されます。
方法1: データはテーブルに行として保存されます。 各行は、ポイントの時刻、x座標、y座標などの情報を記録します。
方法2: データは、LINESTRINGまたはLINESTRING Mタイプの2Dまたは3Dジオメトリとして保存されます。 M次元は、タイムスタンプを格納するために使用される。
方法3: データはTrajectory型として保存されます。
方法1は、高性能の更新操作、低いクエリ性能、および高いストレージスペース使用量を提供する。 方法2は、定期的な更新操作、高性能な空間クエリ、および低いストレージスペース使用量を提供しますが、属性はサポートしていません。 方法3は、方法2に基づいて強化された時間的データ処理能力を提供し、属性およびイベントをサポートする。 要件に基づいてストレージ方法を選択します。 データをクエリすると、処理と分析のために他の表現に変換できます。
-- Store data as table rows. Each row represents a trajectory point.
CREATE TABLE sample_points(userid numeric, sample_time timestamp, x double precision, y double precision, z double precision, intensity int);
INSERT INTO sample_points VALUES
(1,'2020-04-11 17:42:30',114.35, 39.28, 4, 80),
(1,'2020-04-11 17:43:30',114.36, 39.28, 4, 30),
(1,'2020-04-11 17:45:00',114.35, 39.29, 4, 50),
(2,'2020-04-11 17:42:30',114.3, 39, 34, 60),
(2,'2020-04-11 17:43:30',114.3, 39, 38, 58);
-- Convert the data from table rows to the trajectory type. Each row represents a trajectory point.
CREATE TABLE trajectory_table(userid numeric PRIMARY KEY, traj trajectory);
INSERT INTO trajectory_table
SELECT userid, ST_Sort(ST_MakeTrajectory(pnts.tjraw, true, '{"intensity"}'::cstring[]))
FROM
(SELECT sample_points.userid, array_agg(ROW(sample_points.sample_time, sample_points.x, sample_points.y, sample_points.z, sample_points.intensity)) as tjraw FROM sample_points GROUP BY userid) pnts;
-- Convert the data from the trajectory type to table rows.
SELECT f.* from trajectory_table,ST_AsTable(traj) as f(t timestamp, x double precision, y double precision, z double precision, intensity integer);
-- Convert the data from the trajectory type to the LINESTRING type, which contains only spatial information.
SELECT ST_trajspatial(traj) FROM trajectory_table;
-- Use the spatial and temporal data of the LINESTRING type to construct a trajectory.
SELECT ST_MakeTrajectory('STPOINT'::leaftype, st_geomfromtext('LINESTRING (114 35, 115 36, 116 37)', 4326), '[2010-01-01 14:30, 2010-01-01 15:30)'::tsrange, '{}');出力形式
GanosBase Trajectoryの軌道は、時間、空間、属性、イベントの4つの部分で構成されています。 出力用にテキストに変換すると、4つの部分が含まれ、JSON形式に従います。 サンプルコード:
{
"trajectory": {
"version": 1、
"type": "STPOINT" 、
"leafcount": 3,
"start_time": "2010-01-01 14:30:00" 、
"end_time": "2010-01-01 15:30:00" 、
"spatial": "SRID=4326;LINESTRING(114 35,115 36,116 37)" 、
"timeline": [
"2010-01-01 14:30:00" 、
"2010-01-01 15:00:00" 、
"2010-01-01 15:30:00"
],
"attributes": {
"leafcount": 3,
"velocity": {
"type": "integer",
"length": 2,
"nullable": true,
"value": [120、130、140]
},
"accuracy": {
"type": "float",
"length": 4,
"nullable": false,
"value": [120.0、130.0、140.0]
},
"bearing": {
"type": "float",
"length": 8,
"nullable": false,
"value": [120.0、130.0、140.0]
},
"acceleration": {
"type": "string"、
"length": 20,
"nullable": true,
"value": ["120", "130", "140"]
},
"active": {
"type": "timestamp",
"length": 8,
"nullable": false,
"value": [
"2010-01-01 14:30:00" 、
"2010-01-01 15:00:00" 、
"2010-01-01 15:30:00"
]
}
},
"events": [
{
"1": "2010-01-01 14:30:00"
},
{
"2": "2010-01-01 15:00:00"
},
{
"3": "2010-01-01 15:30:00"
}
]
}
}次のセクションでは、前のサンプルのパラメーターについて説明します。
versionとtype: バージョンとタイプを示す固定値。
leafcount: 軌道のサンプリングポイントの数。
start_timeとend_time: 軌道の開始時刻と終了時刻。
spatial: WKT形式の軌道の空間形状。
timeline: 文字列配列の形式のサンプリングポイントのタイムスタンプ。
attributes: 軌道の属性。 leafcountの値は、要素の数を示します。 他のキーは、属性の名前である。 各属性で、typeはデータ型を示し、lengthはデータ型の長さを示し、nullableは属性がnull値を受け入れるかどうかを示します。
events: キーと値のペアの複数の配列で構成される軌道のイベント。
空間参照システム
空間参照システム (SRS) は、軌道オブジェクトを地球の表面上の特定の場所にどのように関連付けるかを定義します。
GanosBaseは、SRS定義を参照するためにSRIDとして整数を使用します。 Trajectoryオブジェクトは、それ自体のSRID値を使用することによってSRSに関連付けられる。
詳細については、「空間リファレンス」をご参照ください。
データ列ビュー
GanosBaseでは、trajectory_columnsビューは、データベースのシステムカタログテーブルから軌道タイプの関連するすべての列を読み取ります。 ビューには次の列があります。
列 | データ型 | 説明 |
t_table_catalog | varchar(256) | 値はpostgresとして固定されています。 |
t_table_schema | varchar(256) | テーブルのスキーマ。 |
t_table_name | varchar(256) | テーブルの名前。 |
t_trajectory_column | varchar(256) | テーブル内の軌道列の名前。 |
次のステートメントを実行して、現在のデータベース内のすべての軌道タイプの列を照会します。
SELECT * FROM trajectory_columns;インデックス
GanosBaseは、軌道データのGiSTインデックスをサポートしています。
インデックス | 説明 | 機能 |
GiST (一般化検索ツリー) | GiSTは、空間インデックス付けに一般的に使用されるバランスの取れた検索ツリーです。 高いクエリパフォーマンスを提供します。 | GiSTインデックスを使用すると、バランスの取れたツリーに任意のタイプのデータを分散するルールを定義できます。 データにアクセスするメソッドを定義することもできます。 |
実装標準
GanosBase軌道は、OGC Moving Features標準で定義されているインターフェイスをサポートおよび拡張します。 軌道の幾何学的属性は、幾何学的モデルに基づいて実装される。 ST_trjectorySpatial関数を使用して、ジオメトリ属性を抽出し、さらに処理することができます。
クイックスタート
概要
このセクションでは、拡張子の作成、テーブルの作成、データのインポート、インデックスの作成、データのクエリ、類似性分析など、Ganos Trajectoryエンジンの使用方法について説明します。
構文
拡張を作成します。
CREATE extension ganos_trajectory cascade;説明アクセス許可の問題を回避するために、パブリックスキーマに拡張機能を作成します。
CREATE extension ganos_trajectory WITH schema public cascade;軌道テーブルを作成します。
CREATE TABLE traj_table (id integer, traj trajectory);軌道データレコードを軌道テーブルに挿入します。
INSERT INTO traj_table VALUES (1, ST_MakeTrajectory('STPOINT'::leaftype, st_geomfromtext('LINESTRING (114 35, 115 36, 116 37)', 4326), '[2010-01-01 14:30, 2010-01-01 15:30)'::tsrange, '{"leafcount": 3,"attributes" : {"velocity" : {"type":"integer","length":4,"nullable":false,"value":[120, 130, 140]},"accuracy":{"type":"integer","length":4,"nullable":false,"value":[120, 130, 140]},"bearing":{"type":"float","length":4,"nullable":false,"value":[120, 130, 140]},"acceleration":{"type":"float","length":4,"nullable":false,"value":[120, 130, 140]}}}')), (2, ST_MakeTrajectory('STPOINT'::leaftype, st_geomfromtext('LINESTRING (114 35, 115 36, 116 37)', 4326), '2010-01-01 14:30'::timestamp, '2010-01-01 15:30'::timestamp, '{"leafcount": 3,"attributes" : {"velocity" : {"type":"integer","length":4,"nullable":false,"value":[120, 130, 140]},"accuracy":{"type":"integer","length":4,"nullable":false,"value":[120, 130, 140]},"bearing":{"type":"float","length":4,"nullable":false,"value":[120, 130, 140]},"acceleration":{"type":"float","length":4,"nullable":false,"value":[120, 130, 140]}}}')), (3, ST_MakeTrajectory('STPOINT'::leaftype, st_geomfromtext('LINESTRING (114 35, 115 36, 116 37)', 4326), ARRAY['2010-01-01 14:30'::timestamp, '2010-01-01 15:00'::timestamp, '2010-01-01 15:30'::timestamp], '{"leafcount": 3,"attributes" : {"velocity" : {"type":"integer","length":4,"nullable":false,"value":[120, 130, 140]},"accuracy":{"type":"integer","length":4,"nullable":false,"value":[120, 130, 140]},"bearing":{"type":"float","length":4,"nullable":false,"value":[120, 130, 140]},"acceleration":{"type":"float","length":4,"nullable":false,"value":[120, 130, 140]}}}')), (4, ST_MakeTrajectory('STPOINT'::leaftype, st_geomfromtext('LINESTRING (114 35, 115 36, 116 37)', 4326), '[2010-01-01 14:30, 2010-01-01 15:30)'::tsrange, null));さまざまなクエリを高速化する軌道インデックスを作成します。
-- Create a trajectory index to accelerate the process of filtering spatio-temporal data records. CREATE index tr_index ON traj_table USING trajgist (traj); -- Run spatial data queries. You can find that the trajectory index accelerates the process of filtering spatial data records. SELECT id, traj FROM traj_table WHERE st_3dintersects(traj, ST_GeomFromText('POLYGON((116.46747851805917 39.92317964155052,116.4986540687358 39.92317964155052,116.4986540687358 39.94452401711516,116.46747851805917 39.94452401711516,116.46747851805917 39.92317964155052))')); -- Run temporal data queries. You can find that the trajectory index accelerates the process of filtering temporal data records. SELECT id, traj FROM traj_table WHERE st_TIntersects(traj, '2010-01-01 12:30:44'::timestamp,'2010-01-01 14:30:44'::timestamp); -- Run spatio-temporal data queries. You can find that the trajectory index accelerates the process of filtering spatio-temporal data records. SELECT id, traj FROM traj_table WHERE st_3dintersects(traj, ST_GeomFromText('POLYGON((116.46747851805917 39.92317964155052,116.4986540687358 39.92317964155052,116.4986540687358 39.94452401711516,116.46747851805917 39.94452401711516,116.46747851805917 39.92317964155052))'),'2010-01-01 13:30:44'::timestamp,'2010-01-03 17:30:44'::timestamp);軌道の開始時刻と終了時刻を照会します。
SELECT st_startTime(traj), st_endTime(traj) FROM traj_table ; st_starttime | st_endtime ---------------------+--------------------- 2010-01-01 14:30:00 | 2010-01-01 15:30:00 2010-01-01 14:30:00 | 2010-01-01 15:30:00 2010-01-01 14:30:00 | 2010-01-01 15:30:00 2010-01-01 14:30:00 | 2010-01-01 15:30:00 (4 rows)軌道の類似性を分析します。
With traj AS ( SELECT ST_makeTrajectory('STPOINT', 'LINESTRING(1 1, 5 6, 9 8)'::geometry, '[2010-01-01 11:30, 2010-01-01 15:00)'::tsrange, '{"leafcount":3,"attributes":{"velocity": {"type": "integer", "length": 2,"nullable" : true,"value": [120,130,140]}, "accuracy": {"type": "float", "length": 4, "nullable" : false,"value": [120,130,140]}, "bearing": {"type": "float", "length": 8, "nullable" : false,"value": [120,130,140]}, "acceleration": {"type": "string", "length": 20, "nullable" : true,"value": ["120","130","140"]}, "active": {"type": "timestamp", "nullable" : false,"value": ["Fri Jan 01 11:35:00 2010", "Fri Jan 01 12:35:00 2010", "Fri Jan 01 13:30:00 2010"]}}, "events": [{"2" : "Fri Jan 02 15:00:00 2010"}, {"3" : "Fri Jan 02 15:30:00 2010"}]}') a, ST_makeTrajectory('STPOINT', 'LINESTRING(1 0, 4 2, 9 6)'::geometry, '[2010-01-01 11:30, 2010-01-01 15:00)'::tsrange, '{"leafcount":3,"attributes":{"velocity": {"type": "integer", "length": 2,"nullable" : true,"value": [120,130,140]}, "accuracy": {"type": "float", "length": 4, "nullable" : false,"value": [120,130,140]}, "bearing": {"type": "float", "length": 8, "nullable" : false,"value": [120,130,140]}, "acceleration": {"type": "string", "length": 20, "nullable" : true,"value": ["120","130","140"]}, "active": {"type": "timestamp", "nullable" : false,"value": ["Fri Jan 01 11:35:00 2010", "Fri Jan 01 12:35:00 2010", "Fri Jan 01 13:30:00 2010"]}}, "events": [{"2" : "Fri Jan 02 15:00:00 2010"}, {"3" : "Fri Jan 02 15:30:00 2010"}]}') b) SELECT ST_euclideanDistance(a, b) FROM traj; st_euclideandistance ---------------------- 0.0888997369940162 (1 row)拡張子を削除します (オプション) 。
DROP EXTENSION ganos_trajectory CASCADE;
SQL文
詳細については、「軌跡 SQL リファレンス (Trajectory SQL reference)」をご参照ください。