時空間集約関数は、順不同で保存されているポイントをソートおよび集約するために使用できます。これらの関数は、大量の時空間データが生成され、軌跡分析が必要なシナリオ (Internet of Vehicles (IoV)、GIS、Internet of Things (IoT) など) でよく使用されます。
該当するエンジンとバージョン
このトピックで説明されている集約関数は、LindormTable にのみ適用されます。
このトピックで説明されている集約関数は、LindormTable 2.6.5 以降のバージョンでサポートされています。 LindormTable のバージョンを表示またはアップグレードする方法の詳細については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナーエンジンバージョンをアップグレードする」をご参照ください。
Lindorm SQL のバージョンは 2.6.8 以降である必要があります。 Lindorm SQL のバージョンの表示方法の詳細については、「SQL バージョン」をご参照ください。
関数
次の表に、Lindorm GanosBase でサポートされている集約関数を示します。
関数 | 説明 |
この関数は、順不同のポイントを時間順にソートし、ポイントを集約して軌跡を作成し、軌跡の球面長をメートル単位で返します。 | |
この関数は、順不同で保存されているポイントを時間順にソートし、指定された時間しきい値と空間しきい値に基づいてポイントをダウンサンプリングし、ダウンサンプリングされたデータを集約して軌跡を作成します。 | |
この関数は、順不同のポイントを時間順にソートし、ポイントを集約して軌跡を作成し、指定された時間しきい値に基づいて軌跡をセグメントに分割し、各セグメントの開始点と終了点の座標と時間を返します。 |
ST_Length_Rows
この関数は、順不同のポイントを時間順にソートし、ポイントを集約して軌跡を作成し、軌跡の球面長をメートル単位で返します。
ST_Length_Rows 関数を GROUP BY 句と一緒に使用すると、指定された列のポイントによって集約された軌跡の球面長を取得できます。
プライマリキーを使用して、ポイントが正しい順序で集約されていることを確認する必要があります。そうでない場合、返される長さが予期したとおりにならない可能性があります。たとえば、IoV シナリオでは、車両 ID 列とタイムスタンプ列をプライマリキーとして使用して、ポイントが正しい順序で集約されていることを確認できます。
構文
double ST_Length_Rows(point column)パラメーター
パラメーター | 説明 |
point column | この関数を使用して処理するジオメトリオブジェクト。このパラメーターにはポイントを指定します。 |
例
次の例では、次のステートメントを実行して、test_len という名前のテーブルを作成し、サンプルデータを入力します。
CREATE TABLE test_len (carid VARCHAR, collect_time TIMESTAMP, p GEOMETRY(POINT), PRIMARY KEY(carid, collect_time));
INSERT INTO test_len (carid, collect_time,p) VALUES('car1', '2023-09-12 00:04:02', ST_GeomFromText('POINT (111.40269 35.61695)')),
('car1', '2023-09-12 00:09:07', ST_GeomFromText('POINT (111.40127 35.616096)')),
('car1', '2023-09-12 00:14:03', ST_GeomFromText('POINT (111.400604 35.616013)')),
('car1', '2023-09-12 00:20:13', ST_GeomFromText('POINT (111.399734 35.613983)')),
('car1', '2023-09-12 00:27:21', ST_GeomFromText('POINT (111.40217 35.616386)')),
('car2', '2023-09-12 00:27:21', ST_GeomFromText('POINT (111.40217 35.616386)'));例 1: 車両 car1 によって生成されたポイントによって集約された軌跡の球面長を計算します。
SELECT ST_LENGTH_ROWS(p) FROM test_len WHERE carid='car1';次の結果が返されます。
+--------------------+ | st_length_rows(p) | +--------------------+ | 805.55323541493414 | +--------------------+例 2: すべての車両によって生成されたポイントによって集約された軌跡の球面長を計算し、結果を車両 ID でグループ化します。
SELECT carid,ST_LENGTH_ROWS(p) as len FROM test_len WHERE carid<='car2' GROUP BY carid;次の結果が返されます。
+-------+--------------------+ | carid | len | +-------+--------------------+ | car1 | 805.55323541493414 | | car2 | 0 | +-------+--------------------+
ST_Resample
この関数は、順不同で保存されているポイントを時間順にソートし、指定された時間しきい値と空間しきい値に基づいてポイントをダウンサンプリングし、ダウンサンプリングされたデータを集約して軌跡を作成します。
ST_Resample 関数を使用する場合は、軌跡ポイントまたは単一の軌跡のフィルター条件を指定する必要があります。この関数は、GROUP BY 句と一緒に使用することはできません。
構文
String ST_Resample(String geomColumnName, String timeColumnName, String config)
String ST_Resample(String xColumnName, String yColumnName, String timeColumnName, String config) パラメーター
パラメーター | 説明 |
geomColumnName | この関数を使用して処理するジオメトリオブジェクト。このパラメーターにはポイントを指定します。 |
xColumnName | 経度列。このパラメーターには DOUBLE 値を指定します。このパラメーターは、yColumnName パラメーターと一緒に指定する必要があります。 |
yColumnName | 緯度列。このパラメーターには DOUBLE 値を指定します。このパラメーターは、xColumnName パラメーターと一緒に指定する必要があります。 |
timeColumnName | 時間列。テーブル内のポイントは、この列の昇順で構築されます。時間列は、TIME、TIMESTAMP、および LONG データ型をサポートしています。時間列のデータ型が LONG の場合、列の値の単位はミリ秒である必要があります。 |
config | JSON 形式のダウンサンプリングパラメーター。ダウンサンプリングパラメーターには STRING 値を指定します。ダウンサンプリングパラメーターの値の形式は次のとおりです: {"パラメーター名": 値} |
次の表に、config パラメーターで指定できるダウンサンプリングパラメーターを示します。
パラメーター | 説明 |
downsample_time | 時間ダウンサンプリングしきい値。ダウンサンプリングされたデータ内の隣接する軌跡ポイント間の時間間隔は、このパラメーター値よりも大きくなります。 このパラメーターには INT または LONG 値を指定します。単位: ミリ秒。デフォルト値: -1。 |
downsample_distance | 空間ダウンサンプリングしきい値。軌跡のジオメトリは、このパラメーター値に基づいて指定されたアルゴリズムを使用して簡略化されます。 このパラメーターには INT、LONG、FLOAT、または DOUBLE 値を指定します。このパラメーターの単位は、座標の単位と同じです。デフォルト値: -1.0。 |
simplifier | ダウンサンプリングで使用されるアルゴリズム。パラメーターには STRING 値を指定します。有効な値:
|
戻り値
この関数は、時間順にソートされたダウンサンプリングされた軌跡ポイントのシーケンスを返します。返されるシーケンスは、次の形式の文字列です: [{\"x\":経度,\"y\":緯度,\"t\":時間}, {\"x\":経度,\"y\":緯度,\"t\":時間}, ...]。
例
次の例では、次のステートメントを実行して、gps_point という名前のテーブルを作成し、サンプルデータを入力します。
CREATE TABLE gps_points (account_id VARCHAR, collect_time TIMESTAMP, gps_point GEOMETRY(POINT), PRIMARY KEY(account_id, collect_time));
INSERT INTO gps_points(account_id, collect_time, gps_point) VALUES ('001', '2023-11-10 11:00:30', ST_MakePoint(113.665431, 34.773)),
('001', '2023-11-10 11:00:31', ST_MakePoint(113.665432, 34.773)),
('001', '2023-11-10 11:00:32', ST_MakePoint(113.665433, 34.773)),
('001', '2023-11-10 11:00:33', ST_MakePoint(113.665434, 34.774));gps_point テーブルで、指定された時間範囲内の指定された車両の軌跡をクエリします。返される軌跡は、空間しきい値 0.0001 に基づいて Visvalingam-Whyatt アルゴリズムを使用してダウンサンプリングされたポイントによって生成されます。
SELECT ST_Resample(gps_point, collect_time,'{"downsample_distance": 0.0001, "simplifier": "vw"}') as resampled_traj FROM gps_points WHERE collect_time >= '2023-11-10 00:00:00' and collect_time <= '2023-11-11 00:00:00' and account_id='001';次の結果が返されます。
+----------------------------------------------------------------------------------------------------------------------+
| resampled_traj |
+----------------------------------------------------------------------------------------------------------------------+
| [{"x":113.665431,"y":34.773,"t":"2023-11-10 11:00:30.0"},{"x":113.665434,"y":34.774,"t":"2023-11-10 11:00:33.0"}] |
+----------------------------------------------------------------------------------------------------------------------+ST_TrajectoryProfile
この関数は、順不同のポイントを時間順にソートし、ポイントを集約して軌跡を作成し、指定された時間しきい値に基づいて軌跡をセグメントに分割し、各セグメントの開始点と終了点の座標と時間を返します。
ST_TrajectoryProfile 関数は、GROUP BY 句と一緒に使用して、ポイントのグループによって集約された各軌跡セグメントの開始点と終了点の座標と時間を計算する必要があります。
ST_TrajectoryProfile 関数は通常、ST_DWithinSphere などの空間関係の関数と一緒に使用されます。この場合、軌跡セグメント内で指定された領域に最初に入ったポイントと最後に離れたポイントの座標と時間を計算できます。
構文
String ST_TrajectoryProfile(String geomColumnName, String timeColumnName,long thresh)
String ST_TrajectoryProfile(String xColumnName, String yColumnName, String timeColumnName,long thresh)パラメーター
パラメーター | 説明 |
geomColumnName | この関数を使用して処理するジオメトリオブジェクト。このパラメーターにはポイントを指定します。 説明 ポイントのデータがテーブルにポイントオブジェクトとして保存されている場合、関数を使用するときにこのパラメーターを指定します。 |
xColumnName | 経度列。このパラメーターには DOUBLE 値を指定します。このパラメーターは、yColumnName パラメーターと一緒に指定する必要があります。 説明 ポイントのデータがテーブルに経度と緯度として保存されている場合、関数を使用するときにこのパラメーターを指定します。 |
yColumnName | 緯度列。このパラメーターには DOUBLE 値を指定します。このパラメーターは、xColumnName パラメーターと一緒に指定する必要があります。 説明 ポイントのデータがテーブルに経度と緯度として保存されている場合、関数を使用するときにこのパラメーターを指定します。 |
timeColumnName | 時間列。テーブル内のポイントは、この列の昇順で構築されます。 |
thresh | このパラメーターはオプションです。単位: ミリ秒。ポイントが時間列に基づいてソートされた後、2 つの隣接するポイントの時間間隔がしきい値以下である場合、2 つのポイントは同じ軌跡セグメントにあると見なされます。2 つの隣接するポイントの時間間隔がしきい値よりも大きい場合、2 つのポイントは異なる軌跡セグメントにあると見なされます。デフォルト値: 10000。 |
戻り値
この関数は、次の形式の JSON 文字列を返します。
{"軌跡セグメント番号":"{\"endY\":終了点の緯度,\"endX\":終了点の経度,\"startY\":開始点の緯度,\"startTime\":開始点の時間,\"startX\":開始点の経度,\"endTime\":終了点の時間}"}。
例
次の例では、次のステートメントを実行して、test_traj という名前のテーブルを作成し、サンプルデータを入力します。
CREATE TABLE test_traj (carid VARCHAR, collect_time TIMESTAMP, p GEOMETRY(POINT), status VARCHAR, PRIMARY KEY(z-order(p), carid, collect_time));
INSERT INTO test_traj (carid, collect_time, p, status) VALUES('car1', '2023-09-12 00:04:02', ST_GeomFromText('POINT (111.40269 35.61695)'), 'normal'),
('car1', '2023-09-12 00:09:07', ST_GeomFromText('POINT (111.40127 35.616096)'), 'normal'),
('car1', '2023-09-12 00:14:03', ST_GeomFromText('POINT (111.400604 35.616013)'), 'normal'),
('car1', '2023-09-12 00:20:13', ST_GeomFromText('POINT (111.399734 35.613983)'), 'normal'),
('car1', '2023-09-12 00:27:21', ST_GeomFromText('POINT (111.40217 35.616386)'), 'normal'),
('car2', '2023-09-12 00:27:21', ST_GeomFromText('POINT (111.40217 35.616386)'), 'normal');test_traj テーブルのデータによって生成された各軌跡セグメントで、指定された時間範囲内で指定された領域に最初に入ったポイントと最後に離れたポイントの座標と時間をクエリします。
SELECT carid, st_trajectoryprofile(p, collect_time, 30000) as trajprofile FROM test_traj WHERE st_dwithinsphere(st_geomfromtext('POINT (111.40217 35.616386)'), p, 100.0) and collect_time >= '2023-09-12 00:09:07' and collect_time <= '2023-09-20 00:09:07' group by carid;クエリでセカンダリインデックスを使用する場合、集約キー、フィルター条件列、関数パラメーター列など、クエリで使用されるすべての列をインデックスにインクルード列として追加する必要があります。これにより、クエリはベーステーブルのデータをスキャンする必要がなくなります。たとえば、前のステートメントでは、carid、p、および collect_time 列をセカンダリインデックスにインクルード列として追加する必要があります。
次の結果が返されます。
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| carid | trajprofile |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| car1 | {"0":"{\"endY\":35.616096,\"endX\":111.40127,\"startY\":35.616096,\"startTime\":1694448547000,\"startX\":111.40127,\"endTime\":1694448547000}","1":"{\"endY\":35.616386,\"endX\":111.40217,\"startY\":35.616386,\"startTime\":1694449641000,\"startX\":111.40217,\"endTime\":1694449641000}"} |
| car2 | {"0":"{\"endY\":35.616386,\"endX\":111.40217,\"startY\":35.616386,\"startTime\":1694449641000,\"startX\":111.40217,\"endTime\":1694449641000}"} |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+