Quero criar uma rede de estradas para uso com pgRouting usando dados do OpenStreetMap. Carreguei um shapefile do GeoFabrik em uma tabela do Postgres (com o PostGIS ativado). No entanto, um problema que tive foi que as estradas nem sempre terminam nos cruzamentos, por isso decidi dividi-las em todos os cruzamentos ou cruzamentos.
Para identificar todas as interseções nas quais as estradas cruzaram ou cruzaram, usei o seguinte SQL
(semelhante a uma pergunta anterior ):
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);
Agora eu quero dividir as estradas usando esses pontos. Eu usei a seguinte abordagem:
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);
O problema dessa abordagem dividida é que a extensão total da estrada permanece além de todas as partes divididas. Para remover essas geometrias de estrada não divididas incluídas, usei a ST_Equals()
função para identificá-las e excluí-las:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
No entanto, essa abordagem não remove todas as geometrias não divididas originais (embora remova algumas delas). Existe uma abordagem melhor para exclusão (ou geral) para que eu tenha apenas as geometrias divididas em uma tabela?
.geom
você está se referindo? Não consigo identificar!
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.