このトピックでは、軌道フィルタリング、軌道セグメンテーション、軌道の再サンプリング、軌道の簡略化など、サンプリングポイントの処理におけるGanosBase軌道エンジンの機能について説明します。 この機能は、移動するオブジェクトを前処理し、ビジネス開発の効率を向上させるのに役立ちます。
GanosBaseの軌道
軌道は、歩行者、車両、船、航空機などの移動物体の分析および処理において重要な時空間物体である。
軌道データは、離散点のセットとして、または時間とともに進化する空間ポリラインによって表される連続線として分析することができる。 連続的な軌道線は、サンプリング周波数の影響を受けにくく、ポリラインとしてさまざまな空間演算に使用できます。 対照的に、離散軌道点は、サンプリング方法および周波数に対してより敏感であるが、アルゴリズムの単純さを提供する。 類似性計算および軌道セグメンテーションのような機能は、通常、ポイントベースの演算に依存する。
例えば、2020年4月11日の17:42:30に共有自転車の座標 (114.35、39.28) が報告された場合、以下のようなレコードがデータベースに追加される。
時間 | x | y |
2020-04-11 17:42:30 | 114.35 | 39.28 |
速度または方向などの他の情報も、これらのサンプリングポイントで記録することができる。 たとえば、その時の自転車の速度が4.3だった場合、レコードは次のようになります。
時間 | 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 |
これらの点は、以下に示すように、時空間軌道を形成します。

PolarDBのネイティブGanosBase軌道エンジンは、移動するオブジェクトの保存、検索、および分析の課題に対処するために、軌道タイプと関連するインデックス作成および時空間演算子を導入します。
軌道サンプリング点の一般的な処理操作
背景情報
実際のビジネスシナリオでは、軌道は通常、GPS信号に基づく輸送管理システム (TMS) や自動識別システム (AIS) などのシステムによってサンプリングされ、データベースに格納されます。 GPSサンプリング周波数は比較的一貫している。 ただし、軌道データの有用性に影響を与える可能性のある車両の動きの固有の制限により、次の問題が発生する可能性があります。
悪い信号品質からのドリフトポイントなど、GPS信号の問題によって引き起こされる異常な軌道ポイント。
停泊地を待っている間に港を周回する船やサービスエリアで休んでいる車両など、輸送行動による過度の無効ポイント。
軌道点の損失は、不均一なサンプリングをもたらし、これは、類似性計算などの後続の分析において重大な誤差をもたらし得る。
フロントエンドレンダリングの効率を低下させ、プログラムの障害や吃音を引き起こす可能性のある大量のデータ。
処理方法
バージョン5.2以降、GanosBaseは、軌道サンプリングポイントを処理するための包括的な関数セットを導入します。 これらの機能により、ユーザーは軌道データをより効果的に管理および分析し、幅広いビジネス分析およびプレゼンテーション要件に対応できます。
ST_removeDriftPoints (軌道フィルタリング)
ST_removeDriftPoints関数は、予想される運動パターンからの有意な偏差を示す軌道内の点を除去するように設計される。 これらの偏差は、しばしばサンプリング誤差から生じる。 この関数は、密ではあるが不正確なサンプリングのためにオブジェクトが短い時間枠内にジャンプしているように見えるときに発生する速度異常も除去する。 詳細については、「ST_removeDriftPoints」「」をご参照ください。

ST_Split (軌道セグメンテーション)
軌道サンプリングポイントを処理する際の課題は、さまざまなビジネスの多様な要件にあります。 様々なアプリケーションは、特定のニーズに従って軌道点を調整する必要がある場合があり、ユーザが軌道の各セグメントを自律的に扱うことを可能にする柔軟な軌道セグメント化能力を提供することが不可欠になる。 軌道セグメンテーションは一般に3つのカテゴリに分類されます。
cut_point: 軌道に沿って特定のサンプリングポイントを選択し、これらのポイントで軌道を分割します。 次の図に示すように、カットポイントとしてポイントBを選択すると、軌道は2つのサブ軌道に分割され、どちらもポイントBを含みます。このための一般的なユースケースは、軌道が長すぎて、分析または処理を容易にするために短いセグメントに分割する必要がある場合です。
cut_edge: この操作はカットポイントのセグメンテーションに似ていますが、選択可能なポイントは元のサンプリングポイントに限定されません。 代わりに、ユーザは、補間から導出された点Cなど、軌道境界に沿って位置する点を選択することができる。 点Cでの分割は、両方とも点Cを含む2つのセグメントをもたらす。このタイプのセグメンテーションは、時間間隔や空間グリッドなどによって、軌道を固定形状に分割するためによく使用されます。
drop_edge: エッジを選択して削除します。 除去後、削除されたエッジの2つの端点は、2つの別個のサブ軌道の一部になる。 この方法の典型的な用途は、関連性の低いセクションを破棄しながら、軌道の意味のある部分を抽出することです。 たとえば、共有自転車のコンテキストでは、静止期間 (自転車が駐車されている場所) を削除し、アクティブな旅行セグメントのみを維持することができます。

GanosBaseは、幾何オブジェクトを使用して軌道を複数のセグメントに分割するST_Split関数を提供します。 詳細については、「ST_Split 」をご参照ください。
ST_Resample (軌道リサンプリング)
ST_Resampleは、ノイズ低減または他の前処理方法によって生じ得る、軌道点の不均一な分布に対処するために軌道データを再サンプリングする方法を指す。 この不均一な分布は、局所軌道セグメントの性能および解析可能性に悪影響を及ぼし得る。
GanosBaseは、2つのリサンプリング戦略を提供します。
add_point: 軌道に沿った点の密度を上げます。 これは、密度統計や類似性マッチングなどの詳細な分析に役立ちます。
drop_point: 軌道に沿った点の密度を下げます。 これは、長期的な傾向を抽出したり、軌道を単純化したりするのに役立ちます。
GanosBaseは、軌道リサンプリングのためのST_Resample関数を提供します。 詳細については、「ST_Resample」「」をご参照ください。
軌道の簡素化
軌道損失圧縮としても知られる軌道の単純化は、一般的な移動方向を維持しながら、軌道内のサンプリング点の数を減らす。 このプロセスは、データ記憶要件を効果的に減らし、レンダリング性能を改善する。

2次元 (2D) 軌道のコンテキストでは、前の図に示すように、Douglas-Peuckerアルゴリズムが単純化のために一般的に使用されます。 このアルゴリズムは、元の軌道とその簡略化されたバージョンとの間の最大許容偏差を定義する許容値を指定することから始まる。 アルゴリズムは、軌道の始点と終点を接続し、中間点が許容基準を満たすかどうかを順次決定することによって機能します。 これは、簡略化された軌道からの最大距離を有する点を繰り返し選択し、新しい簡略化されたバージョンを生成し、全ての元の点から簡略化された軌道までの距離が許容範囲内にあるかどうかをチェックすることを含む。 このプロセスは、すべてのポイントが指定された制限内になるまで続きます。 しかしながら、Douglas − Peuckerアルゴリズムは、2次元軌道にのみ適用可能であり、全てのサンプリング点が同じ平面上にあることを必要とする。 時空間軌道を含むシナリオでは、軌道は長期間静止したままであり得る。 3次元の視点から、静止点は時間軸に沿って長い垂直線を作成します。 対照的に、2次元で観察すると、この垂直線は単一の点に崩壊する。 この状況で従来の2D Douglas − Peuckerアルゴリズムを適用することは、線の端点のうちの1つを排除することにつながり、それによって軌道の3D空間構造を歪ませることがある。 問題に対処するには、GanosBaseは、タイムスタンプ付きの軌道に異なるアプローチを使用します。 標準のDouglas-Peuckerアルゴリズムで使用される垂直ユークリッド距離の代わりに、同期ユークリッド距離 (SED) を使用して、時空間軌跡のより正確で効果的な圧縮を保証します。
GanosBaseは、軌道の簡素化のために次の関数を提供します。
関数 | 説明 | 参考情報 |
ST_Compress | Douglas-Peuckerアルゴリズムを使用して2D軌道を単純化します。 | |
ST_CompressSED | SED基準を使用して、時空間軌道 (空間次元と時間次元の両方を含む軌道) を単純化します。 |
ベストプラクティス
ケース1: 船の緯度と経度の情報からドリフトポイントを削除
船舶の航行軌道を正確に構築するために、AISによって収集されたデータが投入された地点テーブルから船舶の緯度および経度情報を抽出し、データから軌道を構築し、次いで、軌道からドリフト点を除去し、結果として得られた清浄化された軌道を記憶する。
SELECT
ST_removeDriftPoints (-- Remove drift points.
ST_SetSRID ( -- Set an SRID.
ST_MakeTrajectory ( -- Construct a trajectory object.
ARRAY_AGG ( ROW ( traj.arrival_time :: TIMESTAMP, st_x ( traj.pts ) :: DOUBLE PRECISION, traj.lat :: DOUBLE PRECISION, traj.rowid )
), FALSE, '{"rowid"}' :: cstring [] ), 4326 ),
40,
10,
'1 minute' :: INTERVAL
)
FROM
(
SELECT
time
ST_makepoint ( lon, lat ) pts,
lat,
rowid
FROM
point_table
WHERE
time IS NOT NULL
AND lon IS NOT NULL
AND lat IS NOT NULL
ORDER BY
rowid
) traj INTO trajectory_table;ケース2: ドローン軌道サンプリングポイントを再サンプリングし、ポイント密度をカウントする
ドローンの移動パターンを分析するには、ドローンの軌道を5分間隔にセグメント化し、これらの各間隔内のデータ点を再サンプリングして軌道点の密度を計算し、この計算された各5分セグメントの点密度を機械学習モデルへの入力として使用します。
SELECT
ST_Density(
ST_Resample(ST_OnlyST(traj),
'{"add_point.period_lesser":"5 minute"}')
), 100, '30 minute'
) FROM table;ケース3: 貨物車両の軌道を簡素化する
貨物管理の顧客は、ビジネス分析のために広範な車両軌道データを収集します。 特定の行程セグメントに焦点を合わせるために、軌道内のより長いエッジが除去されて、より短く分析可能なサブ軌道が作成される。
With traj AS(
SELECT
'{"trajectory":{"version":1,"type":"STPOINT","leafcount":19,"start_time":"2000-01-01 00:01:19.067179","end_time":"2000-01-01 03:24:25.946085","spatial":"LINESTRING(-100 -100 -100,-88.8925775739675 -86.6512698383691 -92.3767832526937,-79.6904716538265 -80.6515727923252 -84.2357598245144,-75.8435507711644 -73.7572890928326 -80.5007370118983,-70.6238425321256 -67.8213750167439 -74.5733173238113,-61.6014582272619 -61.0636760429479 -67.9874239303172,-56.1098577060426 -54.4264591250879 -64.5007972046733,-46.9800617334743 -49.4026757289345 -61.6160059720278,-41.7122942996211 -46.3224360072054 -56.5283147455193,-35.5646221285375 -38.1688933617746 -49.2775720101781,-31.7230528349367 -33.6970051738123 -44.1693710885011,-23.1585765127093 -26.5895827477798 -40.6539742602035,-16.7020264320696 -21.6133877349397 -37.3055470525287,-12.1044529232507 -14.1236051704424 -28.2295028120279,-3.77185660181567 -7.74744770256802 -24.3842111621052,0.488159407706304 -3.68223926316326 -19.9478872027248,6.33406881305078 4.54123636645575 -15.0410129944794,15.6666049417108 10.5611746329814 -11.2770220567472,14 11 -10)","timeline":["2000-01-01 00:01:19.067179","2000-01-01 00:12:36.116007","2000-01-01 00:23:53.164835","2000-01-01 00:35:10.213663","2000-01-01 00:46:27.262491","2000-01-01 00:57:44.311319","2000-01-01 01:09:01.360147","2000-01-01 01:20:18.408975","2000-01-01 01:31:35.457803","2000-01-01 01:42:52.506631","2000-01-01 01:54:09.555459","2000-01-01 02:05:26.604287","2000-01-01 02:16:43.653115","2000-01-01 02:28:00.701943","2000-01-01 02:39:17.750771","2000-01-01 02:50:34.799599","2000-01-01 03:01:51.848427","2000-01-01 03:13:08.897255","2000-01-01 03:24:25.946085"]}}'::trajectory as a
)
SELECT (ST_split(a, '{"drop_edge.spatial_distance_2d":10}')) FROM traj;