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.