Mengidentifikasi kurva dalam suatu trajectory dan mengembalikan jari-jari kelengkungan serta posisi titik pusat setiap kurva.
Sintaks
Sintaks 1 — Gunakan ketika nilai default expansion radii sudah mencukupi:
SETOF trpeak ST_CurveRecognize(trajectory traj, float8 radius_threshold, float8 angle_threshold, float8 angle_compress_threshold DEFAULT 0);Sintaks 2 — Gunakan ketika Anda memerlukan kendali presisi atas seberapa jauh batas kurva meluas dari titik pusat:
SETOF trpeak ST_CurveRecognize(trajectory traj, float8 radius_threshold, float8 angle_threshold, float8 expansion_radius1, float8 expansion_radius2, float8 angle_compress_threshold DEFAULT 0);Dengan Sintaks 1, expansion_radius1 bernilai default radius_threshold * 2 dan expansion_radius2 bernilai default radius_threshold * 4.
Parameter
Parameter input
| Parameter | Tipe | Default | Deskripsi |
|---|---|---|---|
traj | trajectory | — | Trajectory yang akan dianalisis. |
radius_threshold | float8 | — | Ambang batas jari-jari kelengkungan untuk mengidentifikasi titik pusat kurva. Fungsi ini mengumpulkan semua titik trajectory berurutan yang jari-jari kelengkungannya lebih kecil dari nilai ini, lalu memilih titik dengan jari-jari kelengkungan terkecil sebagai titik pusat. |
angle_threshold | float8 | — | Sudut rotasi minimum agar suatu titik batas dipertahankan. Jika sudut rotasi titik batas lebih kecil dari nilai ini, titik tersebut dihapus dan kurva dibagi menjadi dua kurva terpisah pada lokasi tersebut. |
expansion_radius1 | float8 | radius_threshold * 2 | Ambang batas jari-jari kelengkungan pada setiap titik batas kandidat. Hanya titik-titik yang jari-jari kelengkungannya lebih kecil dari nilai ini yang dimasukkan ke dalam batas kurva. (Hanya untuk Sintaks 2) |
expansion_radius2 | float8 | radius_threshold * 4 | Ambang batas rata-rata jari-jari kelengkungan dari titik batas kandidat ke titik pusat. Hanya titik-titik yang rata-rata tersebut lebih kecil dari nilai ini yang dimasukkan ke dalam batas kurva. (Hanya untuk Sintaks 2) |
angle_compress_threshold | float8 | 0 | Sudut rotasi minimum agar suatu titik diambil sampelnya. Titik-titik dengan sudut rotasi lebih kecil dari nilai ini dilewati, sehingga mengurangi kerapatan pengambilan sampel dan mencegah oversampling mengaburkan deteksi kurva. |
Nilai kembalian
ST_CurveRecognize mengembalikan satu set catatan trpeak, satu untuk setiap kurva yang terdeteksi. Setiap catatan berisi:
| Field | Deskripsi |
|---|---|
loc | Nomor seri titik pusat dalam urutan turning-point trajectory. Jika loc = n, titik pusat merupakan turning point ke-(n + 1) dari trajectory. |
height | Jari-jari kelengkungan pada titik pusat. Nilai positif menunjukkan kurva searah jarum jam; nilai negatif menunjukkan kurva berlawanan arah jarum jam. |
startloc | Nomor seri titik awal kurva. |
endloc | Nomor seri titik akhir kurva. |
Cara kerja
ST_CurveRecognize mengidentifikasi kurva dalam tiga langkah:
Identifikasi titik pusat. Pindai semua titik trajectory secara berurutan yang memiliki jari-jari kelengkungan lebih kecil dari
radius_threshold. Dari setiap kelompok tersebut, pilih titik dengan jari-jari kelengkungan terkecil sebagai titik pusat kurva.Perluas batas kurva. Mulai dari setiap titik pusat, perluas batas ke luar untuk menyertakan titik-titik berdekatan yang memenuhi kedua kondisi berikut:
Jari-jari kelengkungan titik tersebut lebih kecil dari
expansion_radius1.Rata-rata jari-jari kelengkungan dari titik tersebut hingga titik pusat lebih kecil dari
expansion_radius2.
Validasi dan pisahkan titik batas. Untuk setiap titik batas, bandingkan sudut rotasinya dengan
angle_threshold:Jika sudut rotasi melebihi ambang batas, batas diperluas ke luar ke kedua arah.
Jika sudut rotasi berada di bawah ambang batas, titik batas dihapus. Kurva terbagi menjadi dua bagian pada titik tersebut, masing-masing memiliki sudut rotasi di atas ambang batas pada setiap titik batasnya.
Contoh
Contoh berikut menjalankan ST_CurveRecognize pada trajectory 16 titik dengan radius_threshold = 15 dan angle_threshold = 1. Data trajectory mengulang lintasan 8 titik yang sama dua kali, sehingga kurva fisik yang sama muncul pada dua segmen waktu berbeda.
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
)).*;Output:
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)Output berisi 6 baris yang merepresentasikan 3 kurva berbeda, masing-masing terdeteksi dua kali karena trajectory diulang:
Baris dengan
loc = 2danloc = 10(height ≈ 5,70, positif): kurva searah jarum jam yang sama, ditemui pada lintasan pertama dan kedua.Baris dengan
loc = 4danloc = 12(height ≈ 2,10, positif, rentangstartlochinggaendlocmencakup beberapa titik): kurva searah jarum jam yang lebih lebar dengan batas yang diperluas.Baris dengan
loc = 3danloc = 11(height ≈ −1,18, negatif): kurva berlawanan arah jarum jam yang sama pada kedua lintasan.