すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ST_{2D|2DT|3D|3DT}DWithin

最終更新日:Mar 29, 2026

指定された空間軸または時空間軸に沿って測定した 2 つのオブジェクト間の距離が、指定されたしきい値以下の場合に true を返します。

仕組み

この関数ファミリーは、4 つの測定モードに対応しています。

  • 2D および 3D — 2 つのオブジェクトの 2D または 3D 射影間の距離がしきい値内にあるかどうかをチェックします。時間ディメンションは無視されます。

  • 2DT および 3DT — 指定されたディメンションにおける 2 つのオブジェクト間の距離が、各時点でしきい値内にあるかどうかをチェックします。時間ディメンションが測定に考慮されます。

tste が指定されている場合、関数は指定された時間範囲から抽出されたサブ軌跡を比較します。tste がない場合は、完全な軌跡を比較します。

ST_DistanceWithin(..) は、入力の 1 つがジオメトリの場合は ST_2DDWithin(...) と同等であり、両方の入力が軌跡の場合は ST_3DTDWithin(...) と同等です。

構文

bool ST_{2D|3D}DWithin(geometry geom, trajectory traj, float8 dist);
bool ST_{2D|3D}DWithin(trajectory traj, geometry geom, float8 dist);
bool ST_{2D|3D}DWithin(geometry geom, trajectory traj, timestamp ts, timestamp te, float8 dist);
bool ST_{2D|3D}DWithin(trajectory traj, geometry geom, timestamp ts, timestamp te, float8 dist);
bool ST_{2D|2DT|3D|3DT}DWithin(boxndf box, trajectory traj, float8 dist);
bool ST_{2D|2DT|3D|3DT}DWithin(trajectory traj, boxndf box, float8 dist);
bool ST_{2D|2DT|3D|3DT}DWithin(boxndf box, trajectory traj, timestamp ts, timestamp te, float8 dist);
bool ST_{2D|2DT|3D|3DT}DWithin(trajectory traj, boxndf box, timestamp ts, timestamp te, float8 dist);
bool ST_{2D|2DT|3D|3DT}DWithin(trajectory traj1, trajectory traj2, float8 dist);
bool ST_{2D|2DT|3D|3DT}DWithin(trajectory traj1, trajectory traj2, timestamp ts, timestamp te, float8 dist);
ST_{2D|3D} バリアントは、入力の 1 つとして geometry を受け入れます。ST_{2D|2DT|3D|3DT} バリアントは、boxndf または 2 つの軌跡を受け入れます。

パラメーター

パラメーター説明
geom比較対象のジオメトリ。
traj比較対象の軌跡、または比較対象のサブ軌跡を含む元の軌跡。
traj1比較対象の最初の軌跡、または比較対象のサブ軌跡を含む元の軌跡。
traj2比較対象の 2 番目の軌跡、または比較対象のサブ軌跡を含む元の軌跡。
box比較対象のバウンディングボックス。
tsサブ軌跡を抽出するための時間範囲の開始時刻。オプションです。
teサブ軌跡を抽出するための時間範囲の終了時刻。オプションです。
dist2 つのオブジェクト間の距離のしきい値。

次の例では、2 つの軌跡を作成し、異なる時間範囲にわたって、それらの 2D、3D、2DT、および 3DT の距離が指定されたしきい値内にあるかどうかをチェックします。

すべての呼び出しで、同じ軌跡ペアに対して ST_2dDWithinST_3dDWithinST_2dtDWithin、および ST_3dtDWithin を使用します。この結果から、te = ST_PGEpochToTS(49) の場合、しきい値 19 では小さすぎますが、te = ST_PGEpochToTS(50) の場合はしきい値 20 で十分であることがわかります。

WITH traj AS(
    Select ST_makeTrajectory('STPOINT', 'LINESTRING(0 0 10, 50 0 10, 100 0 10)'::geometry,
                             ('[' || ST_PGEpochToTS(0) || ',' || ST_PGEpochToTS(100) || ')')::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(0 20, 50 20, 100 20)'::geometry,
                             ('[' || ST_PGEpochToTS(0) || ',' || ST_PGEpochToTS(100) ||')')::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_2dDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(49), 19), ST_3dDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(49), 19),
       ST_2dDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(50), 20), ST_3dDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(50), 20),
       ST_2dDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(70), 21), ST_3dDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(70), 21),
       ST_2dtDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(49), 19), ST_3dtDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(49), 19),
       ST_2dtDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(50), 20), ST_3dtDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(50), 20),
       ST_2dtDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(70), 21), ST_3dtDWithin(a,b, ST_PGEpochToTS(0),ST_PGEpochToTS(70), 21) from traj;
NOTICE:  一方または両方のジオメトリに z 値がありません。不明な z 値は「任意の値」として扱われます。
NOTICE:  一方または両方のジオメトリに z 値がありません。不明な z 値は「任意の値」として扱われます。
 st_2ddwithin | st_3ddwithin | st_2ddwithin | st_3ddwithin | st_2ddwithin | st_3ddwithin | st_2dtdwithin | st_3dtdwithin | st_2dtdwithin | st_3dtdwithin | st_2dtdwithin | st_3dtdwithin
--------------+--------------+--------------+--------------+--------------+--------------+---------------+---------------+---------------+---------------+---------------+---------------
 f            | f            | t            | t            | t            | t            | f             | f             | t             | t             | t             | t

この結果から、以下のことがわかります。

  • ts = ST_PGEpochToTS(0)te = ST_PGEpochToTS(49)、および dist = 19 の場合:すべてのバリアントは false を返します。この時間範囲において、軌跡は互いに 19 単位以内にありません。

  • te = ST_PGEpochToTS(50)dist = 20、または te = ST_PGEpochToTS(70)dist = 21 の場合:すべてのバリアントは true を返します。