Cara mengekstrak sublinestring dari linestring dengan segmen yang tumpang tindih


15

Pernyataan masalah: Diberikan rute bus (didefinisikan sebagai linestring ln.the_geom), dan satu set lokasi halte bus (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), bagi rute bus menjadi beberapa segmen di antara halte bus . Saya menggunakan dua fungsi postgis

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

Di atas berfungsi dengan baik jika rute bus tidak memiliki bagian yang tumpang tindih. Namun, jika ada bagian yang tumpang tindih, ST_line_locate_point akan mengambil titik ke ujung linestring yang lain. Sebagai contoh: Bus bergerak dari A ke B, membuat satu lingkaran, kemudian melakukan perjalanan dari B ke A. "A ke B" dan "B ke A" adalah rute paralel dengan semua titik tumpang tindih. Dalam hal halte bus P1 dan P2, P2 dipetakan ke titik P2 'sebagai gantinya (pada arah yang berlawanan). Segmen diekstraksi secara salah dalam kasus ini (di mana segmen tambahan termasuk).

Bagaimana cara mengatasi masalah seperti ini? Rute bus yang tumpang tindih dapat terjadi di bagian mana pun dari rute ... CONTOH


Apakah ada cara bagi Anda untuk mengidentifikasi termini dari rute bus Anda dan membagi linestring tertutup menjadi garis di kedua arah? Maka Anda tidak akan memiliki segmen yang tumpang tindih lagi. Misalnya, Anda bisa menemukan titik terjauh pada garis dari awal, dan memisahkan garis Anda menjadi dua arah menggunakan titik itu.
raphael

3
Pertanyaan lama tetapi, sepertinya Anda perlu memulai dan menentukan bagian, bergabung dengan dataset titik dan menghapus bagian mana pun dengan pemesanan titik awal yang lebih besar dari titik akhir. Apakah ini masuk akal?
Jorge Sanz

1
Bisakah Anda memberikan geometri WKT untuk rute bus yang diberikan?
kttii

Jawaban:


1

Dengan asumsi bahwa rute bus tumpang tindih dengan sendirinya tidak lebih dari 2 kali pada titik tertentu, maka hal ini dapat diselesaikan dengan membalikkan jalur untuk titik lokasi jalur kedua, menemukan titik terdekat yang terdekat dengan ujung jalur. Anda harus mengurangi ini dari 1 untuk digunakan dalam kueri ST_LineSubstring. Misalnya

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.