ワークロードが主にクエリに軌跡IDを使用し、ストレージの使用量に影響されない場合は、頂点テーブルを使用してデータを格納できます。 頂点テーブルでクエリを実行した後、必要な操作を実行するには、クエリ結果を軌道に集約する必要があります。
この例では、頂点テーブルを使用して、旅行アプリのユーザー軌道を保存します。 以下のデータが各サンプリング点で収集される: ユーザID、日時、経度、緯度、高度、およびサンプリング装置の信号強度。
- テーブルを作成します。
CREATE TABLE sample_points ( userid numeric, -- ユーザーID sample_time timestamp, -- サンプリングポイント x倍精度、-経度 yの倍の精密、-- 緯度 z倍精度、-高度 intensity int -- サンプリングデバイスの信号強度 ); - テーブルにテストデータを挿入します。
INSERT INTO sample_points VALUES (1,'2020-04-11 17:4: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:4:30 '、114.3、39、34、60) 、(2、'2020-04-11 17:43:30 '、114.3、39、38、58); - userid列のインデックスを作成します。
btree(userid) を使用してsample_pointsにインデックスを作成します。 - すべてのサンプリングポイントでuseridが1のユーザーの軌跡ポイントを抽出します。 軌道点は、サンプリング点の時系列に基づいて配置される。
SELECT * FROM sample_points WHERE userid = 1 ORDER BY sample_time;
抽出された軌道ポイントを処理できます。 たとえば、正確でないドリフトポイントを削除できます。
SELECT ST_removeDriftPoints( -- 不正確なドリフトポイントを削除します。
ST_SetSRID (− 軌道の空間参照識別子 (SRID) を変更する。)
ST_MakeTrajectory (− 軌道を構築する。)
array_agg (
ROW(traj.sample_time, traj.x, traj.y, traj.z, traj.int insity) -- 軌道の構築に使用する列を選択します。
), true, '{"intensity"}'::cstring[]),4326), 40,10, '1 minute'::interval
) FROM (SELECT * FROM sample_points WHERE userid = 1 ORDER BY sample_time) traj; 説明
- この例では、軌道点が軌道に集約される。 次に、ST_removeDriftPoints関数を使用して、不要な軌道点を削除します。 軌道関数のパラメーターの詳細については、「ST_makeTrajectory」、「ST_SetSRID」、および「ST_removeDriftPoints」をご参照ください。
- ROW関数では、最初の列はTIMESTAMPタイプでなければならず、2番目と3番目の列はDOUBLE PRECISIONタイプでなければなりません。 ST_MakeTrajectory関数の2番目のパラメーターの値がtrueの場合、ROW関数の4番目の列もDOUBLE PRECISION型である必要があります。 値trueは、軌道点が高度を含むことを示す。 ROW関数のいずれかの列がDOUBLE PRECISION型でない場合、
Variable name::double precisionまたはcast(Variable name as double precision)を使用して、列のデータ型をDOUBLE PRECISIONに明示的に変換できます。 - 時間値のデータ型の詳細については、「PostgreSQLの時間値のデータ型」をご参照ください。
ST_removeDriftPoint関数は軌道を返します。 軌道を頂点テーブルに変換する場合は、ST_AsTable関数を使用します。 として削除された
WITH
(
SELECT ST_removeDriftPoints (
ST_SetSRID (
ST_MakeTrajectory (
array_agg (
ROW(traj.sample_time、traj.x、traj.y、traj.z、traj.int ensity) 、
true, '{"intensity"}'::cstring[]), 4326), 40,10, '1 minute'::interval) AS trajcol
FROM (SELECT * FROM sample_points WHERE userid = 1 ORDER BY sample_time) traj
)
SELECT f.* 削除済み、ST_AsTable(removed.trajcol) AS − 軌道を頂点テーブルに変換する。
f(sample_time timestamp,x double precision, y double precision, z double precision, intensity int); 説明
- ST_removeDriftPoints関数では、軌道のSRIDが4326である必要があります。これは、世界測地システム1984 (WGS84) を指定します。 したがって、ST_removeDriftPoints関数の入力軌道のSRIDが4326であることを確認する必要があります。 それ以外の場合、ST_removeDriftPoint関数によって返される軌道のSRIDは0です。 値0は、返された軌道のSRIDが不明であることを示します。
- Data Management (DMS) を使用してクライアントをApsaraDB RDSインスタンスに接続し、このステートメントを実行すると、互換性の問題が発生する可能性があります。
予期しない結果が返されたことを示すメッセージが表示された場合は、別のクライアントを使用します。