Menghitung indeks Jaccard antara dua trajectory atau sub-trajectory, serta mengembalikan batas bawah dan batas atas skor kemiripan.
Sintaksis
record ST_JaccardSimilarity(trajectory tr1, trajectory tr2, double tol_dist,
text unit default '{}', interval tol_time default NULL,
timestamp ts default '-infinity', timestamp te default 'infinity');Fungsi ini mengembalikan record dengan bidang-bidang berikut:
| Field | Type | Description |
|---|---|---|
nleaf1 | int | Jumlah titik trajectory pada tr1 yang berpotongan dengan tr2. |
nleaf2 | int | Jumlah titik trajectory pada tr2 yang berpotongan dengan tr1. Nilai ini dapat berbeda dari nleaf1. Misalnya, jika tr1 melewati titik yang sama pada tr2 sebanyak dua kali, nleaf1 bernilai 1 dan nleaf2 bernilai 2. |
inter1 | int | Jumlah titik trajectory pada tr1 yang jaraknya ke tr2 memenuhi toleransi jarak dan waktu. |
inter2 | int | Jumlah titik trajectory pada tr2 yang jaraknya ke tr1 memenuhi toleransi jarak dan waktu. |
jaccard_lower | double | Batas bawah indeks Jaccard. Dihitung sebagai min(inter1, inter2) / (nleaf1 + nleaf2 - min(inter1, inter2)). |
jaccard_upper | double | Batas atas indeks Jaccard. Dihitung sebagai max(inter1, inter2) / (nleaf1 + nleaf2 - max(inter1, inter2)). |
Parameter
| Parameter | Type | Default | Description |
|---|---|---|---|
tr1 | trajectory | — | Trajectory pertama. |
tr2 | trajectory | — | Trajectory kedua. |
tol_dist | double | — | Jarak maksimum yang diizinkan antara pasangan titik trajectory yang sesuai, dalam meter. |
unit | text | '{}' | String JSON yang mengontrol cara perhitungan jarak. Lihat bidang parameter unit. |
tol_time | interval | NULL | Selisih waktu maksimum yang diizinkan antara pasangan titik trajectory yang sesuai. Jika NULL atau negatif, fungsi mencocokkan titik hanya berdasarkan jarak, tanpa mempertimbangkan timestamp. |
ts | timestamp | -infinity | Awal rentang waktu. Jika ditentukan, fungsi hanya membandingkan sub-trajectory antara ts dan te. |
te | timestamp | infinity | Akhir rentang waktu. Jika ditentukan, fungsi hanya membandingkan sub-trajectory antara ts dan te. |
bidang parameter unit
| Field | Type | Default | Description |
|---|---|---|---|
Projection | string | None | Sistem koordinat untuk mereproyeksi trajectory sebelum menghitung jarak. Nilai yang valid: auto (secara dinamis memilih Lambert Azimuthal atau UTM berdasarkan bujur dan lintang; satuan jarak adalah meter), srid (mereproyeksi menggunakan spatial reference identifier (SRID) yang ditentukan). Jika dihilangkan, perhitungan menggunakan sistem koordinat asli. |
Unit | string | null | Satuan pengukuran jarak. Nilai yang valid: null (jarak Euclidean berdasarkan koordinat mentah), M (jarak berdasarkan referensi spasial trajectory, biasanya dalam meter). |
useSpheroid | bool | true | Menentukan apakah akan menggunakan model ellipsoid ketika Unit bernilai M. true: menggunakan ellipsoid untuk jarak yang akurat. false: menggunakan bola untuk jarak perkiraan. |
Cara kerja
Indeks Jaccard klasik untuk dua himpunan dihitung sebagai ukuran irisan dibagi ukuran gabungan. Untuk trajectory, konsep ini diperluas ke pencocokan spasial (dan opsional temporal): titik pada tr1 dianggap beririsan dengan tr2 jika terdapat titik pada tr2 dalam jarak tol_dist meter (dan, jika tol_time ditentukan, dalam jendela waktu yang ditetapkan).
Karena hubungan pencocokan tidak simetris—tr1 yang melewati dekat suatu titik pada tr2 satu kali dihitung berbeda dari tr2 yang melewati titik yang sama dua kali—fungsi ini mengembalikan dua batas alih-alih satu nilai tunggal:
`jaccard_lower` menggunakan jumlah irisan yang lebih kecil (
min(inter1, inter2)), memberikan estimasi konservatif tumpang tindih. Gunakan nilai ini ketika diperlukan tingkat minimum kemiripan yang pasti.`jaccard_upper` menggunakan jumlah irisan yang lebih besar (
max(inter1, inter2)), memberikan estimasi optimistik tumpang tindih. Gunakan nilai ini untuk menangkap kecocokan paling luas antara kedua trajectory.
Kedua nilai tersebut berkisar dari 0 (tidak ada tumpang tindih) hingga 1 (tumpang tindih sempurna).
Contoh
Contoh berikut membandingkan dua trajectory dalam jendela waktu tiga hari, menggunakan toleransi jarak 100 meter dan toleransi waktu 20 detik.
WITH traj AS (
SELECT
ST_makeTrajectory('STPOINT'::leaftype,
'SRID=4326;LINESTRING(114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921)'::geometry,
ARRAY[
to_timestamp(1590287775) AT TIME ZONE 'UTC',
to_timestamp(1590287778) AT TIME ZONE 'UTC',
to_timestamp(1590302169) AT TIME ZONE 'UTC',
to_timestamp(1590302171) AT TIME ZONE 'UTC'
], '{}') a,
ST_makeTrajectory('STPOINT'::leaftype,
'SRID=4326;LINESTRING(114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921)'::geometry,
ARRAY[
to_timestamp(1590287765) AT TIME ZONE 'UTC',
to_timestamp(1590287771) AT TIME ZONE 'UTC',
to_timestamp(1590287778) AT TIME ZONE 'UTC',
to_timestamp(1590287780) AT TIME ZONE 'UTC',
to_timestamp(1590295992) AT TIME ZONE 'UTC',
to_timestamp(1590295997) AT TIME ZONE 'UTC',
to_timestamp(1590296013) AT TIME ZONE 'UTC',
to_timestamp(1590296018) AT TIME ZONE 'UTC',
to_timestamp(1590296025) AT TIME ZONE 'UTC',
to_timestamp(1590296032) AT TIME ZONE 'UTC',
to_timestamp(1590296055) AT TIME ZONE 'UTC',
to_timestamp(1590296073) AT TIME ZONE 'UTC',
to_timestamp(1590296081) AT TIME ZONE 'UTC',
to_timestamp(1590296081) AT TIME ZONE 'UTC',
to_timestamp(1590302169) AT TIME ZONE 'UTC',
to_timestamp(1590302174) AT TIME ZONE 'UTC',
to_timestamp(1590302176) AT TIME ZONE 'UTC',
to_timestamp(1590302176) AT TIME ZONE 'UTC',
to_timestamp(1590302172) AT TIME ZONE 'UTC',
to_timestamp(1590302176) AT TIME ZONE 'UTC'
], '{}') b
)
SELECT ST_JaccardSimilarity(a, b, 100, '{"unit":"M"}', '20 second',
'2020-05-23'::timestamptz AT TIME ZONE 'UTC',
'2020-05-26'::timestamptz AT TIME ZONE 'UTC')
FROM traj;Output:
st_jaccardsimilarity
-----------------------------------
(4,20,4,10,0.2,0.714285714285714)
(1 row)Hasil tersebut dipetakan ke bidang return sebagai berikut:
| Field | Value | Meaning |
|---|---|---|
nleaf1 | 4 | 4 titik pada tr1 berpotongan dengan tr2 |
nleaf2 | 20 | 20 titik pada tr2 berpotongan dengan tr1 |
inter1 | 4 | 4 titik pada tr1 memenuhi toleransi jarak dan waktu |
inter2 | 10 | 10 titik pada tr2 memenuhi toleransi jarak dan waktu |
jaccard_lower | 0.2 | Kemiripan konservatif: 4 / (4 + 20 - 4) |
jaccard_upper | 0.714... | Kemiripan optimistik: 10 / (4 + 20 - 10) |