軌道(トラジェクトリ)内の曲線を検出し、各曲線の中心点の曲率半径および位置を返します。
構文
構文 1 — デフォルトの拡張半径で十分な場合に使用します:
SETOF trpeak ST_CurveRecognize(trajectory traj, float8 radius_threshold, float8 angle_threshold, float8 angle_compress_threshold DEFAULT 0);構文 2 — 曲線境界が中心点からどの程度離れるかを精密に制御する必要がある場合に使用します:
SETOF trpeak ST_CurveRecognize(trajectory traj, float8 radius_threshold, float8 angle_threshold, float8 expansion_radius1, float8 expansion_radius2, float8 angle_compress_threshold DEFAULT 0);構文 1 を使用する場合、expansion_radius1 のデフォルト値は radius_threshold * 2、expansion_radius2 のデフォルト値は radius_threshold * 4 です。
パラメーター
入力パラメーター
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
traj | trajectory | — | 解析対象の軌道(トラジェクトリ)です。 |
radius_threshold | float8 | — | 曲線の中心点を識別するための曲率半径のしきい値です。この関数は、曲率半径がこの値より小さい連続する軌道ポイントをすべて収集し、その中で最も小さな曲率半径を持つポイントを中心点として選択します。 |
angle_threshold | float8 | — | 境界ポイントを保持するための最小回転角度です。境界ポイントの回転角度がこの値より小さい場合、当該ポイントは削除され、曲線はその位置で 2 つの独立した曲線に分割されます。 |
expansion_radius1 | float8 | radius_threshold * 2 | 候補となる境界ポイントにおける曲率半径のしきい値です。この値より小さい曲率半径を持つポイントのみが曲線の境界に含められます。(構文 2 のみ) |
expansion_radius2 | float8 | radius_threshold * 4 | 候補となる境界ポイントから中心点までの平均曲率半径のしきい値です。この平均値がこの値より小さいポイントのみが曲線の境界に含められます。(構文 2 のみ) |
angle_compress_threshold | float8 | 0 | サンプリング対象とするポイントの最小回転角度です。この値より小さい回転角度を持つポイントはスキップされ、サンプリング密度が低下することで、過剰なサンプリングによる曲線検出の妨げを防止します。 |
戻り値
ST_CurveRecognize は、検出された各曲線に対応する trpeak レコードのセットを返します。各レコードには以下のフィールドが含まれます:
| フィールド | 説明 |
|---|---|
loc | 軌道のターンポイント(方向転換ポイント)シーケンス内における中心点のシリアル番号です。loc = n の場合、中心点は軌道の (n + 1) 番目のターンポイントとなります。 |
height | 中心点における曲率半径です。正の値は時計回りの曲線を、負の値は反時計回りの曲線を示します。 |
startloc | 曲線の開始ポイントのシリアル番号です。 |
endloc | 曲線の終了ポイントのシリアル番号です。 |
仕組み
ST_CurveRecognize は、以下の 3 段階で曲線を検出します:
中心点の識別:曲率半径が
radius_thresholdより小さい連続する軌道ポイントをすべてスキャンします。各グループから、最も小さな曲率半径を持つポイントを曲線の中心点として選択します。曲線境界の拡張:各中心点から始めて、以下の 2 つの条件をともに満たす隣接ポイントを境界に含めるように外側へ拡張します:
当該ポイントの曲率半径が
expansion_radius1より小さいこと。当該ポイントから中心点までの平均曲率半径が
expansion_radius2より小さいこと。
境界ポイントの検証と分割:各境界ポイントについて、その回転角度を
angle_thresholdと比較します:回転角度がしきい値を超える場合、境界は両方向へ外側に拡張されます。
回転角度がしきい値を下回る場合、当該境界ポイントは削除されます。曲線はそのポイントで 2 つの部分に分割され、それぞれの境界ではすべてのポイントの回転角度がしきい値を超えます。
例
以下の例では、16 ポイントの軌道に対して ST_CurveRecognize を実行し、radius_threshold = 15、angle_threshold = 1 を指定しています。軌道データは同一の 8 ポイント経路を 2 回繰り返しており、そのため物理的に同一の曲線が異なる時間帯に 2 回出現します。
SELECT (ST_CurveRecognize(
'{"trajectory":{"version":1,"type":"STPOINT","leafcount":16,
"start_time":"2000-01-01 00:00:00","end_time":"2000-01-16 00:00:00",
"spatial":"LINESTRING(0 0,1 1,2 2,4 3,3 4,5 7,8 8,7 4,0 0,1 1,2 2,4 3,3 4,5 7,8 8,7 4)",
"timeline":["2000-01-01 00:00:00","2000-01-02 00:00:00","2000-01-03 00:00:00",
"2000-01-04 00:00:00","2000-01-05 00:00:00","2000-01-06 00:00:00",
"2000-01-07 00:00:00","2000-01-08 00:00:00","2000-01-09 00:00:00",
"2000-01-10 00:00:00","2000-01-11 00:00:00","2000-01-12 00:00:00",
"2000-01-13 00:00:00","2000-01-14 00:00:00","2000-01-15 00:00:00",
"2000-01-16 00:00:00"]}}',
15, -- radius_threshold
1 -- angle_threshold
)).*;出力:
loc | height | startloc | endloc
-----+---------------------+----------+--------
2 | 5.70087712549569 | 2 | 2
4 | 2.1023796041628637 | 4 | 8
10 | 5.70087712549569 | 10 | 10
12 | 2.1023796041628637 | 12 | 15
3 | -1.1785113019775793 | 3 | 3
11 | -1.1785113019775793 | 11 | 11
(6 rows)出力には 6 行が含まれており、これは 3 つの異なる曲線をそれぞれ 2 回検出した結果です(軌道が経路を繰り返しているため):
loc = 2およびloc = 10の行(height ≈ 5.70、正の値):同一の時計回り曲線であり、経路の最初および 2 回目の通過時に検出されています。loc = 4およびloc = 12の行(height ≈ 2.10、正の値、startlocからendlocまで複数ポイントにわたる):境界が拡張された、より広範囲の時計回り曲線です。loc = 3およびloc = 11の行(height ≈ −1.18、負の値):どちらの通過時にも検出された同一の反時計回り曲線です。