Apa cara yang efisien untuk mendeteksi persimpangan jalan di peta?

14

Saya dapat menerima peta dari sumber apa pun untuk proyek saya, dan untuk algoritma C ++ yang saya buat, sangat penting bagi algoritma untuk mengetahui di mana persimpangan jalan (node ​​di mana lebih dari dua segmen jalan bertemu) berada. Selain itu, di banyak peta yang saya dapatkan, ada jalan yang melebihi batas dan undershooting (yaitu: jalan tidak terhubung dengan benar). Salah satu cara untuk memperbaiki masalah adalah dengan 'membersihkan' jaringan jalan menggunakan Autocad. Pertanyaan yang saya miliki adalah:

  1. Apakah ada cara yang efisien (perangkat lunak apa pun yang dapat melakukannya?) Untuk mendapatkan peta saya dalam format GML, yang berisi informasi tentang persimpangan jalan di peta? (mungkin memiliki tag GML yang mengatakan bahwa simpul tertentu adalah persimpangan)
  2. Apakah ada cara lain untuk 'membersihkan' jaringan jalan?

Kolega telah menyarankan FME, tetapi itu melibatkan penulisan skrip dan kami tidak yakin apakah skrip itu akan cukup fleksibel untuk memenuhi semua peta. Satu-satunya cara lain untuk mendeteksi persimpangan adalah dengan menggunakan brute force dan menemukan ruas jalan mana yang memiliki simpul umum. Apakah ArcGIS akan membantu? (belum menggunakannya, tetapi telah mendengarnya) Saya yakin harus ada cara yang lebih baik ...

Nav
sumber
2
Apakah perlu menemukan persimpangan jalan sendiri? Bagaimana seharusnya menangani geometri degenerasi (polyline di mana semua simpul bertepatan sehingga memiliki panjang nol). Bagaimana seharusnya menangani garis bertepatan di mana persimpangan adalah segmen linier dan bukan hanya sebuah titik?
Kirk Kuykendall
@Kirk: Saya sedikit terkejut dengan situasi yang Anda sebutkan. Saya baru mengenal GIS, dan bahkan tidak tahu bahwa ada kemungkinan seperti itu. Persimpangan 1.Self membutuhkan beberapa segmen. Kecuali jika itu jalan layang, saya akan menganggap persimpangan itu sebagai persimpangan. 2. Saya bahkan tidak dapat memvisualisasikan apa itu geometri degenerasi, jadi saya tidak tahu harus menjawab apa. 3.Coinciding lines harus diperlakukan sebagai dua jalan yang terpisah karena itulah bagaimana saya berasumsi mereka akan berada di kehidupan nyata juga.
Nav

Jawaban:

9

Jika Anda memiliki jalan dalam bentuk spasial, seperti Shapefile, Anda dapat memuatnya ke PostGIS dan secara otomatis menemukannya menggunakan kueri SQL. Saya telah melakukan ini sebelumnya - pernyataan SQL dirancang untuk menemukan untuk setiap jalan yang bersinggungan secara geografis dan membuat titik nodal untuk setiap persimpangan.

Saya akan mencoba untuk membersihkan ini nanti, tapi di sini adalah aliran dasar yang dapat Anda ambil ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Fungsi ST_ * adalah apa yang membuat ini berfungsi di dalam PostGIS

  • ST_Envelope : Ambil kotak pembatas dari geometri yang diberikan - ini digunakan untuk mempercepat algoritme. Satu dapat mempersempit pencarian geografis dengan kotak pembatas di lulus cepat tapi kurang akurat dan kemudian memindai hasilnya dengan geometri yang sebenarnya.
  • ST_Intersects : Menentukan apakah dua geometri berpotongan
  • ST_Intersection : Mengembalikan persimpangan dua geometri

Berikut ini hanya cuplikan karena saya tidak punya waktu untuk menyelesaikan, mungkin seseorang dapat mengeditnya sebelum saya kembali ke sini ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id
dmsnell
sumber
Hanya berbagi: Basis data lain yang saya jumpai adalah ini - < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Rupanya kueri sangat cepat karena kueri tersedia sebagai pustaka yang dapat disematkan dalam aplikasi.
Nav
1
@ dmsnell- Mungkin Anda bisa memberikan contoh tipe query SQL yang digunakan untuk menyelesaikan tugas ini?
RyanKDalton
11

Anda dapat menganalisis polyline dengan cara yang menakjubkan dengan menggunakan buffer. Ini biasanya tidak efisien - buffer membuat banyak simpul tambahan - tetapi (a) itu adalah teknik yang tersedia di banyak GIS (berbasis vektor atau raster) dan (b) kadang-kadang dapat menghasilkan informasi yang sebaliknya sulit diperoleh.

Dalam hal ini, buffering jalan dengan jumlah kecil dan kemudian buffering oleh negatif dari jumlah yang sama menyisakan sedikit "pulau" di sekitar semua tikungan dan di sekitar semua persimpangan. Ini mudah dibuktikan secara geometris.

Berikut adalah contoh penyangga polyline 10 m (abu-abu) dan penyangga -10 m (merah terang) di peta yang lebarnya 650 m:

Gambar 1

Sekarang memotong lapisan polyline asli dengan poligon pulau ini, menggabungkan segmen dengan pengidentifikasi pulau, dan menghitung potongan-potongan:

Gambar 2

Segmen kuning muda menunjuk potongan-potongan hitung tinggi dan segmen cyan gelap menunjuk yang hitung-rendah. Dengan cara ini, kami telah (a) menemukan semua tikungan dan persimpangan (termasuk persimpangan-sendiri) dan persimpangan dekat (lihat ekstrem kiri, di mana kedua segmen tidak cukup bertemu)) dan (b) membedakan tikungan dari persimpangan. Kita dapat menemukan hampir persimpangan dengan memilih pulau-pulau yang berisi dua atau lebih segmen yang terhubung: tikungan hanya berisi segmen yang terhubung.

Karena simetri buffering, centroid dari pulau-pulau persimpangan adalah titik persimpangan.

Salah satu aspek yang indah dari gaya analisis ini adalah bahwa ia tidak peduli bagaimana polyline yang mendasarinya diwakili: itu bisa menjadi fitur tunggal, itu bisa menjadi satu fitur untuk setiap segmen garis, atau apa pun di antaranya.

whuber
sumber
6

Ya, Anda bisa melakukan ini dengan FME pasti. Ada banyak "transformer" yang menangani pembersihan, persimpangan, dan topologi; Saya akan mencoba transformator TopologyBuilder dalam kasus ini.

Semua skrip dilakukan dalam lingkungan grafis, sehingga sangat mudah dilakukan.

Anda selalu bisa mendapatkan versi uji coba dari www.safe.com

(Pengungkapan: Tandai Irlandia, alias Penginjil FME, Safe Software Inc.)

Tandai Irlandia
sumber
Saya yang kedua ini. FME sangat bagus untuk masalah khusus ini, baik transformasi dari AutoCAD ke GML dan pembersihan topologis. Ini bisa sangat universal dalam penerapannya.
blord-castillo
-1

Analis jaringan Arcgis, yang dapat Anda peroleh dengan uji coba gratis, melakukan ini dalam waktu kurang dari 10 detik dan hanya dengan beberapa klik.

Ini
sumber
-1

Prosesnya dapat dilakukan di ArcGIS dengan analis jaringan.

Ada juga cara lain di ArcGIS: Anda dapat melalui langkah-langkah berikut: "Arctoolbox" → "Alat manajemen data" → "fitur" → "fitur simpul ke titik" dan di sana Anda dapat melakukan apa yang Anda butuhkan.

Tempat tidur
sumber