Mengembalikan true jika jarak antara dua objek kurang dari atau sama dengan ambang batas yang ditentukan, diukur sepanjang sumbu spasial atau spasiotemporal tertentu.
Cara kerja
Fungsi ini memiliki empat mode pengukuran:
2D dan 3D — memeriksa apakah jarak antara proyeksi 2D atau 3D dari dua objek berada dalam ambang batas. Dimensi waktu diabaikan.
2DT dan 3DT — memeriksa apakah jarak antara dua objek dalam dimensi yang ditentukan, pada setiap titik waktu, berada dalam ambang batas. Dimensi waktu turut diperhitungkan dalam pengukuran.
Jika parameter ts dan te diberikan, fungsi ini membandingkan sub-trajectory dalam rentang waktu tersebut. Tanpa ts dan te, fungsi ini membandingkan trajectory lengkap.
ST_DistanceWithin(..)setara denganST_2DDWithin(...)jika salah satu input berupa geometry, dan setara denganST_3DTDWithin(...)jika kedua input berupa trajectory.
Sintaksis
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);VarianST_{2D|3D}menerimageometrysebagai salah satu input. VarianST_{2D|2DT|3D|3DT}menerimaboxndfatau dua trajectory.
Parameter
| Parameter | Deskripsi |
|---|---|
geom | Geometry yang akan dibandingkan. |
traj | Trajectory yang akan dibandingkan, atau trajectory asli yang mencakup sub-trajectory untuk dibandingkan. |
traj1 | Trajectory pertama yang akan dibandingkan, atau trajectory asli yang mencakup sub-trajectory untuk dibandingkan. |
traj2 | Trajectory kedua yang akan dibandingkan, atau trajectory asli yang mencakup sub-trajectory untuk dibandingkan. |
box | Kotak pembatas yang akan dibandingkan. |
ts | Awal rentang waktu untuk mengekstraksi sub-trajectory. Opsional. |
te | Akhir rentang waktu untuk mengekstraksi sub-trajectory. Opsional. |
dist | Ambang batas untuk jarak antara dua objek. |
Contoh
Contoh berikut membuat dua trajectory dan memeriksa apakah jarak 2D, 3D, 2DT, dan 3DT-nya berada dalam ambang batas yang ditentukan pada rentang waktu berbeda.
Semua pemanggilan menggunakan ST_2dDWithin, ST_3dDWithin, ST_2dtDWithin, dan ST_3dtDWithin dengan pasangan trajectory yang sama. Hasilnya menunjukkan bahwa ambang batas 19 terlalu kecil ketika te = ST_PGEpochToTS(49), tetapi ambang batas 20 sudah mencukupi ketika te = ST_PGEpochToTS(50).
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: One or both of the geometries is missing z-value. The unknown z-value will be regarded as "any value"
NOTICE: One or both of the geometries is missing z-value. The unknown z-value will be regarded as "any value"
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 | tHasil tersebut mengonfirmasi bahwa:
Dengan
ts = ST_PGEpochToTS(0),te = ST_PGEpochToTS(49), dandist = 19: semua varian mengembalikanfalse— trajectory tidak berada dalam jarak 19 satuan satu sama lain selama rentang waktu ini.Dengan
te = ST_PGEpochToTS(50)dandist = 20, ataute = ST_PGEpochToTS(70)dandist = 21: semua varian mengembalikantrue.