Voglio creare una rete stradale da utilizzare con pgRouting utilizzando i dati OpenStreetMap. Ho caricato uno shapefile da GeoFabrik in una tabella Postgres (con PostGIS abilitato). Tuttavia, un problema che ho avuto è stato che le strade non finiscono sempre agli incroci, quindi ho deciso di dividerli tutti ad ogni incrocio o incrocio.
Per identificare tutte le intersezioni in cui le strade si incrociavano o si intersecavano, ho usato quanto segue SQL
(simile a una domanda precedente ):
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);
Ora voglio dividere le strade usando questi punti. Ho usato il seguente approccio:
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);
Il problema con questo approccio diviso è che l'intera lunghezza della strada rimane in aggiunta a tutti i pezzi divisi. Per rimuovere queste geometrie stradali non suddivise che sono state incluse, ho usato la ST_Equals()
funzione per identificarle ed eliminarle:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
Tuttavia, questo approccio non rimuove tutte le geometrie non divise originali (sebbene ne rimuova alcune). Esiste un approccio migliore per la cancellazione (o nel complesso) in modo da avere solo le geometrie divise in una tabella?
.geom
ti riferisci? Non riesco a individuarlo!
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.