Diberikan tabel dengan geometri garis, dan satu atau lebih titik yang terpotong ke garis ini dalam tabel terpisah, saya ingin membagi setiap garis dengan satu atau lebih titik berpotongan di setiap lokasi di mana garis memotong titik.
Misalnya, ada garis, L, dengan tiga titik berpotongan, A, B, dan C dalam urutan sepanjang garis geometri. Saya ingin mengembalikan L sebagai empat geometri yang berbeda: dari awal L ke A, dari A ke B di sepanjang L, dari B ke C di sepanjang L, dan dari C ke ujung L.
Di masa lalu saya telah menggunakan rupawan untuk tugas ini, yang merupakan masalah referensi linear ( http://sgillies.net/blog/1040/shapely-recipes/ ). Namun, ini tidak dapat dipraktikkan dalam kasus ini, yang memiliki jutaan garis dan titik. Sebagai gantinya, saya mencari solusi menggunakan PostgreSQL / PostGIS.
Perhatikan bahwa poin dibatasi pada garis. Lebih jauh, suatu titik dapat secara sah berada pada awal atau akhir suatu garis, dalam hal mana garis tersebut tidak perlu dipisah (kecuali ada titik lain yang tidak bersamaan dengan titik awal atau titik akhir garis yang sama). Garis subset perlu mempertahankan arah dan atributnya, tetapi atribut fitur titik tidak menjadi masalah.
sumber
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
- saya sudah mengeditnya.ST_Split
mendukung multi * blade di dalampostgis 2.2
dan di atas postgis.net/docs/ST_Split.htmlTingkatkan ke PostGIS 2.2 , di mana ST_Split diperluas untuk mendukung pemisahan oleh multiline, multipoint atau (multi) batas poligon.
sumber
Saya belum memiliki seluruh jawaban untuk Anda, tetapi ST_Line_Locate_Point mengambil garis dan titik sebagai argumen, dan mengembalikan angka antara 0 dan 1 yang mewakili jarak di sepanjang garis ke posisi yang paling dekat dengan titik.
ST_Line_Substring mengambil garis dan dua angka, masing-masing antara 0 dan 1, sebagai argumen. Angka-angka mewakili posisi pada garis sebagai jarak fraksional. Fungsi mengembalikan segmen garis yang berjalan di antara dua posisi itu.
Dengan bekerja dengan dua fungsi ini, Anda harus dapat mencapai apa yang ingin Anda lakukan.
sumber
Saya telah diminta untuk ini dua kali sekarang, maaf atas keterlambatannya. Ini tidak mungkin dianggap solusi singkat; Saya menulisnya ketika sedikit lebih jauh ke bawah kurva belajar daripada saya saat ini. Setiap tips diterima, bahkan yang bergaya.
sumber
Saya ingin memperluas jawaban di atas dari sudut pandang pemula. Dalam skenario ini, Anda memiliki serangkaian poin dan Anda menonton menggunakannya sebagai "bilah" untuk memotong garis menjadi segmen. Seluruh contoh ini mengasumsikan bahwa Anda pertama kali mengambil poin Anda ke garis dan bahwa poin memiliki atribut ID unik dari garis terpotong mereka. Saya menggunakan 'column_id "untuk mewakili ID unik baris.
Pertama , Anda ingin mengelompokkan poin menjadi beberapa titik ketika lebih dari satu bilah jatuh pada satu garis. Jika tidak, fungsi split_line_multipoint bertindak seperti fungsi ST_Split, yang bukan hasil yang Anda inginkan.
Kemudian , Anda ingin membagi jaringan Anda berdasarkan multipoints ini.
Ulangi Langkah 1 dan 2 dengan garis yang hanya memiliki satu titik berpotongan. Untuk melakukan ini, Anda harus memperbarui kode dari langkah 1 ke 'HAVING COUNT (*) = 1'. Ganti nama tabel sesuai dengan itu.
Selanjutnya , buat tabel garis duplikat dan hapus entri dengan poin di atasnya.
Terakhir , gabungkan tiga tabel Anda bersama-sama menggunakan
UNION ALL
:BAM!
sumber