Bagaimana cara membagi jalan OSM menjadi segmen individu di persimpangan?

10

Saya ingin membuat jaringan jalan untuk digunakan dengan pgRouting menggunakan data OpenStreetMap. Saya memuat shapefile dari GeoFabrik ke dalam tabel Postgres (dengan PostGIS diaktifkan). Namun, satu masalah yang saya miliki adalah bahwa jalan tidak selalu berakhir di persimpangan, jadi saya memutuskan untuk membagi semuanya di setiap persimpangan atau persimpangan.

Untuk mengidentifikasi semua persimpangan di mana jalan menyeberang atau berpotongan saya menggunakan yang berikut SQL(mirip dengan pertanyaan sebelumnya ):

CREATE TABLE split_points as
SELECT DISTINCT    
   ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom      
FROM
   roads as a,
   roads as b
WHERE
    ST_Touches(a.geom, b.geom)
OR
    ST_Crosses(a.geom, b.geom)    
    AND a.gid != b.gid
GROUP BY
   ST_Intersection(a.geom, b.geom);

Saya sekarang ingin membagi jalan menggunakan titik-titik ini. Saya menggunakan pendekatan berikut:

CREATE TABLE split_roads as
SELECT     
    ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
    generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM    
    split_points as blade,
    roads as g
WHERE
    ST_Intersects(g.geom, blade.geom);

Masalah dengan pendekatan split ini adalah bahwa panjang jalan penuh tetap di samping semua bagian split. Untuk menghapus geometri jalan yang tidak terbagi yang disertakan, saya menggunakan ST_Equals()fungsi untuk mengidentifikasi mereka, dan menghapusnya:

DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)

Namun, pendekatan ini tidak menghapus semua geometri unsplit asli (meskipun tidak menghapus sebagian dari mereka). Apakah ada pendekatan yang lebih baik untuk penghapusan (atau keseluruhan) sehingga saya hanya memiliki geometri split dalam sebuah tabel?

djq
sumber
Menurut dokumentasi, ST_Split tidak mengembalikan geometri tidak asli yang asli. Apakah tambahan '.geom' yang nongkrong di tanda kurung penutupan terakhir di baris pertama pernyataan SELECT Anda? Mungkin sesederhana menghapus itu.
Scro
@ Scro yang .geomAnda maksud? Tidak bisa menemukannya!
djq
Saya kira secara teknis, itu akan menjadi baris kedua dari pernyataan SELECT. Saya juga merujuk pada pembuatan tabel "split_roads". Baris yang diakhiri dengan '))). Geom) sebagai geom'.
Scro
hmm, saya mendapatkan kesalahan saat melakukan itu. ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
djq
Apakah seluruh baris terlihat seperti ini: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, blade.geom)))) Sebagai geom,
Scro

Jawaban:

6

Bukan solusi nyata untuk masalah Anda, tetapi coba osm2po ... ini menciptakan kode SQL yang sempurna untuk perutean di pgrouting: http://osm2po.de/

Siswa GIS
sumber
Terima kasih untuk sarannya. Saya sudah mencoba osm2pgroutingtetapi membutuhkan lebih banyak memori daripada server saya dan berakhir tanpa selesai.
djq
2
@djq osm2po dapat menangani file yang jauh lebih besar daripada osm2pgrouting. Ia bahkan dapat memuat planet.osm
underdark
ah, awalnya saya pikir osm2poitu salah ketik. Apakah ada kemudahan untuk menginstalnya di ubuntu?
djq
Ini file JAR siap dikompilasi (java). Jalankan saja seperti yang dijelaskan di situs web.
Siswa GIS
11

Jawaban sederhana: Jangan. Anda seharusnya tidak melakukannya dengan cara itu.

Dari Shapefile jalan OSM, tidak mungkin untuk membedakan antara persimpangan dan over / underpass. Anda akan membuat persimpangan yang tidak ada dalam kenyataan jika Anda memecah semua jalan yang tampaknya berseberangan.

Anda harus membuat tangan Anda kotor dengan file OSM asli, jika Anda tidak ingin menggunakan alat yang ada seperti osm2pgrouting (di mana jaringannya cukup kecil) atau osm2po.

underdark
sumber
1
Tepat . Ini juga kesalahan lain yang dilakukan beberapa orang ketika mereka memproses data navteq dan teleatlas. Jalan layang / layang adalah rasa sakit tetapi kenyataan.
Ragi Yaser Burhum
1
Setuju. Selamat datang di GIS yang datanya hampir semuanya buruk
simplexio
3

Tentang masalah umum Anda, menggunakan pgRouting: Saya pikir @Uffer, @GisStudent, dan lainnya yang menunjukkan cara menggunakan "OSC & etc.", mereka benar. Ikuti petunjuk "praktik terbaik" dan "standar" ...

Tentang pertanyaan Anda: "bagi jalan menjadi segmen individual di persimpangan" atau "cara menghapus semua geometri unsplit asli". Saya dapat membantu jika Anda menunjukkan hasil Anda di sini, langkah demi langkah ...

Langkah pertama: analisis topologi

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.
Peter Krauss
sumber
2

Lain "solusi tidak nyata untuk masalah Anda", tetapi konverter OSM kami membagi di persimpangan sementara itu mengkonversi dari OSM ke SHP. Itu lebih efisien seperti itu, karena dapat membandingkan ID dari node, daripada melakukan perhitungan geometrik.

Uffe Kousgaard
sumber
1

Salah satu cara untuk menyelesaikannya secara algoritmik adalah dengan menambahkan titik awal dan akhir setiap jalan ke set "persimpangan", sehingga Anda dapat yakin bahwa setiap segmen berada di antara dua persimpangan.

relet
sumber