All Products
Search
Document Center

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

Last Updated:Mar 30, 2026

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 dengan ST_2DDWithin(...) jika salah satu input berupa geometry, dan setara dengan ST_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);
Varian ST_{2D|3D} menerima geometry sebagai salah satu input. Varian ST_{2D|2DT|3D|3DT} menerima boxndf atau dua trajectory.

Parameter

ParameterDeskripsi
geomGeometry yang akan dibandingkan.
trajTrajectory yang akan dibandingkan, atau trajectory asli yang mencakup sub-trajectory untuk dibandingkan.
traj1Trajectory pertama yang akan dibandingkan, atau trajectory asli yang mencakup sub-trajectory untuk dibandingkan.
traj2Trajectory kedua yang akan dibandingkan, atau trajectory asli yang mencakup sub-trajectory untuk dibandingkan.
boxKotak pembatas yang akan dibandingkan.
tsAwal rentang waktu untuk mengekstraksi sub-trajectory. Opsional.
teAkhir rentang waktu untuk mengekstraksi sub-trajectory. Opsional.
distAmbang 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             | t

Hasil tersebut mengonfirmasi bahwa:

  • Dengan ts = ST_PGEpochToTS(0), te = ST_PGEpochToTS(49), dan dist = 19: semua varian mengembalikan false — trajectory tidak berada dalam jarak 19 satuan satu sama lain selama rentang waktu ini.

  • Dengan te = ST_PGEpochToTS(50) dan dist = 20, atau te = ST_PGEpochToTS(70) dan dist = 21: semua varian mengembalikan true.