Bagaimana cara menyederhanakan jaringan yang dapat dirutekan?

24

Saya memiliki grafik jaringan yang perlu saya sederhanakan dalam arti mengurangi jumlah edge . Idenya adalah untuk menggabungkan node yang terletak berdekatan dan menghapus tepi pendek yang menghubungkan.

Bagaimana ini bisa dicapai dalam PostGIS atau GRASS? Atau ada pendekatan yang lebih baik untuk secara otomatis menyederhanakan jaringan seperti ini?

Saya sudah mencoba fungsi ST_SnapToGrid tapi saya tidak puas dengan hasilnya (abu-abu = asli, hitam = bentak):

masukkan deskripsi gambar di sini

underdark
sumber
1
Apakah Anda melakukan ini untuk menyederhanakan analisis berbasis jaringan atau untuk tujuan tampilan? Jika yang pertama, analisis apa yang akan dilakukan?
whuber
Ini untuk analisis jalur terpendek.
underdark
2
Karena banyak dari algoritma jalur terpendek adalah O (E + V), mungkin Anda bahkan tidak memerlukan penyederhanaan ini? Pada ekstrem yang lain, untuk analisis semacam itu Anda seringkali dapat membuat penyederhanaan yang lebih agresif secara drastis. Misalnya, himpunan tiga segmen paralel dan segmen yang berdampingan di sebelah kiri (tampak seperti H-in-a-box) dapat diganti dengan segitiga jika tidak ada asal atau tujuan yang terletak di dalam segmen tersebut. Saya menyebutkan ini karena saya yakin ada (non-GIS) kode di luar sana untuk operasi seperti itu pada grafik (abstrak).
whuber
Apakah Anda ingin mempertahankan geometri tepi (misalnya kurva) atau hanya mempertahankan topologi + simpul XY cukup? Juga, apakah Anda perlu memastikan node pada Z yang berbeda (misalnya flyover) tidak saling terhubung?
AnserGIS
Topologi adalah kuncinya. Geometri bisa berubah sedikit. Agar Z harus tetap utuh.
underdark

Jawaban:

7

Yang paling dekat saya datang sejauh ini adalah ini:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

Ini mematahkan jalan dengan toleransi 5 meter dan menghapus semua garis panjang nol. Ini bukan solusi optimal karena tampaknya snap agak acak ke beberapa titik.

masukkan deskripsi gambar di sini

underdark
sumber
Memang, hasilnya mungkin tidak akurat tetapi penggunaan v.clean itu menarik, terima kasih sudah berbagi
simo
Apakah gambar itu dibuat di rumput?
NetConstructor.com
Gambar menunjukkan hasil GRASS v.clean divisualisasikan dalam QGIS.
underdark
Adakah masalah dengan mempertahankan "persimpangan aneh" atau jalan berpisah kelas?
dassouki
Bagaimana dengan memproses ST_SnapToGrid setelah v.clean?
kttii
5

Sudahkah Anda mencoba GRASS v.generalisasi ?

v.generalizememungkinkan Anda untuk memilih algoritma generalisasi dengan atribut metode . Ada banyak: douglas, douglas_reduction, lang, reduksi, reumann, boyle, sliding_averaging, distance_weighting, chaiken, hermite, ular, jaringan, perpindahan .

Dan parameter tambahan sebagai threshold, degree_thresh, angle_thresh(tergantung pada algoritma yang dipilih) dapat membantu Anda untuk mendapatkan hasil yang akurat.

Di sinilah tutorial .

simo
sumber
Terima kasih atas tautannya. Saya mencobanya meskipun saya tidak benar-benar mendapatkan kombinasi metode dan nilai ambang batas mana yang akan memberikan hasil yang saya cari.
underdark
Saya benar-benar tidak dapat menemukan metode v.generalisasi yang akan melakukan apa yang saya inginkan.
underdark
2
Sayang sekali, perintahnya kaya banyak algoritma tetapi seperti yang Anda katakan sebelumnya, mungkin cukup rumit untuk diatur untuk mendapatkan hasil yang diharapkan. Mungkin seorang guru algoritma generalisasi, di sini? Sudahkah Anda mencoba juga metode ular ?
Simo
Bukan algo-guru di sini, tetapi saya menemukan metode ular yang terbaik untuk beberapa proses v.genralize saya yang saya buat di masa lalu.
Maning
1
Sebagai catatan, parameter telah disederhanakan pada hari ini di GRASS SVN. Untuk menjadi bagian dari GRASS 6.4.2.
MarkusN
4

Saya belum melakukan ini tetapi saya pikir saya bisa menyarankan arah.

  1. Buat topologi dengan PostGIS untuk grafik Anda.
  2. Temukan semua node hanya dengan dua sisi.
  3. Sembuhkan tepi.

ST_ModEdgeHeal akan menggabungkan satu sisi ke sisi lainnya. ST_NewEdgeHeal akan menggantikan keduanya dengan keunggulan baru.

Manual Topologi PostGIS

Sean
sumber
Terima kasih @Sean. Akankah itu melakukan hal lain selain menggabungkan dua sisi? Ada ide tentang cara menghapus tepi pendek dan membenturkan node mereka bersama-sama?
underdark
@Underdark, saya tidak melihat sesuatu yang sederhana. Anda bisa melakukan semuanya dalam PL / SQL tetapi itu mungkin tidak membantu. Bisakah Anda menjalankan ST_SnapToGrid terlebih dahulu?
Sean
1

@underdark, saya melihat bahwa Anda telah menulis alat untuk memperbesar garis di Sextante. Karena itu saya menyarankan algoritma berikut untuk menghindari "acak" membentak salah satu poin Anda.

Pilih segmen garis yang ingin Anda singkirkan berdasarkan panjangnya.

Untuk masing-masing segmen tersebut, buat titik di titik tengah

Hapus segmen kecil

Sekarang Anda dapat menggunakan ST_Snap di PostGIS (lihat contoh di sini )

EDIT: perhatikan bahwa dalam kasus Anda, Anda juga bisa menggunakan v.net terlebih dahulu untuk menghapus pseudo-node (node ​​yang menghubungkan hanya dua baris)

radouxju
sumber
Tolong jelaskan bagaimana v.net dapat digunakan untuk menghapus pseudo-node. Terima kasih
osmjit
0

Meneruskan bagaimana Michaël Michaud menganalisis ini pada daftar pengembang OpenJUMP:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles
pengguna30184
sumber
Terima kasih telah mengirimkan jawaban ini. Saya agak bingung mengapa Anda memaksa grafik ke planar. Bagaimanapun, jaringan jalan bukan grafik planar (jembatan, terowongan).
underdark
Hanya karena Michaël membuat tes cepat dengan alat grafik yang ada yang telah ia tulis untuk OpenJUMP dan mereka tidak mendukung grafik non-planar saat ini. Lewati langkah pertama jika QGIS dan GRASS memiliki alat serupa yang mendukung grafik non-planar.
user30184
Saya pikir ini adalah pendekatan yang tepat - pisahkan jaringan ke dalam grafik planar. Dalam setiap grafik planar masalahnya lebih sederhana - misalnya seseorang dapat menggunakan pendekatan di atas, atau hanya melakukan triangulasi dan menyiangi TIN dari tepi jalan yang pendek. Kemudian ekstrak tepi jalan lagi dan gabungkan layer bersama.
AnserGIS