Chcę utworzyć sieć drogową do użytku z pgRouting przy użyciu danych OpenStreetMap. Załadowałem plik kształtu z GeoFabrik do tabeli Postgres (z włączonym PostGIS). Jednak jednym z moich problemów było to, że drogi nie zawsze kończą się na skrzyżowaniach, dlatego postanowiłem je wszystkie podzielić na każdym skrzyżowaniu lub skrzyżowaniu.
Aby zidentyfikować wszystkie skrzyżowania, w których drogi przecinały się lub przecinały, użyłem następującego SQL
(podobnego do poprzedniego pytania):
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);
Chcę teraz podzielić drogi za pomocą tych punktów. Zastosowałem następujące podejście:
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);
Problem z tym podejściem dzielonym polega na tym, że oprócz wszystkich podzielonych elementów pozostaje pełna długość drogi. Aby usunąć te nierozdzielone geometrie drogi, które zostały uwzględnione, użyłem ST_Equals()
funkcji do ich zidentyfikowania i usunięcia:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
Jednak to podejście nie usuwa wszystkich oryginalnych nieoświetlonych geometrii (chociaż usuwa niektóre z nich). Czy istnieje lepsze podejście do usuwania (lub ogólnie), aby mieć tylko podzielone geometrie w tabeli?
.geom
mówisz? Nie mogę tego zauważyć!
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.