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?
.geom
Anda maksud? Tidak bisa menemukannya!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.
Jawaban:
Bukan solusi nyata untuk masalah Anda, tetapi coba osm2po ... ini menciptakan kode SQL yang sempurna untuk perutean di pgrouting: http://osm2po.de/
sumber
osm2pgrouting
tetapi membutuhkan lebih banyak memori daripada server saya dan berakhir tanpa selesai.osm2po
itu salah ketik. Apakah ada kemudahan untuk menginstalnya di ubuntu?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.
sumber
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
sumber
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.
sumber
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.
sumber