All Products
Search
Document Center

ApsaraDB RDS:ST_CurveRecognize

Last Updated:Mar 28, 2026

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

ParameterTipeDefaultDeskripsi
trajtrajectoryTrajectory yang akan dianalisis.
radius_thresholdfloat8Ambang 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_thresholdfloat8Sudut 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_radius1float8radius_threshold * 2Ambang 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_radius2float8radius_threshold * 4Ambang 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_thresholdfloat80Sudut 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:

FieldDeskripsi
locNomor seri titik pusat dalam urutan turning-point trajectory. Jika loc = n, titik pusat merupakan turning point ke-(n + 1) dari trajectory.
heightJari-jari kelengkungan pada titik pusat. Nilai positif menunjukkan kurva searah jarum jam; nilai negatif menunjukkan kurva berlawanan arah jarum jam.
startlocNomor seri titik awal kurva.
endlocNomor seri titik akhir kurva.

Cara kerja

ST_CurveRecognize mengidentifikasi kurva dalam tiga langkah:

  1. 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.

  2. 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.

  3. 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 = 2 dan loc = 10 (height ≈ 5,70, positif): kurva searah jarum jam yang sama, ditemui pada lintasan pertama dan kedua.

  • Baris dengan loc = 4 dan loc = 12 (height ≈ 2,10, positif, rentang startloc hingga endloc mencakup beberapa titik): kurva searah jarum jam yang lebih lebar dengan batas yang diperluas.

  • Baris dengan loc = 3 dan loc = 11 (height ≈ −1,18, negatif): kurva berlawanan arah jarum jam yang sama pada kedua lintasan.