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.
Respostas:
Não é uma solução real para o seu problema, mas tente o osm2po ... ele cria o código SQL perfeito para roteamento no pgrouting: http://osm2po.de/
fonte
osm2pgrouting
mas requer mais memória do que o meu servidor e termina sem concluir.osm2po
era um erro de digitação. Existe um simples objetivo de instalá-lo no ubuntu?Resposta simples: não. Você não deve fazer dessa maneira.
A partir dos Shapefiles da estrada OSM, é impossível distinguir entre cruzamentos e passagens superiores / inferiores. Você criará cruzamentos que não existem na realidade se você dividir todas as estradas que aparentemente parecem atravessar.
Você precisará sujar as mãos com o arquivo OSM original, se não quiser usar ferramentas existentes, como osm2pgrouting (onde a rede é pequena o suficiente) ou osm2po.
fonte
Sobre o seu problema geral, usando pgRouting: Acho que @Uffer, @GisStudent e outros que estão mostrando como usar "OSC e etc.", estão certos. Siga as dicas de "melhores práticas" e "padrões" ...
Sobre a sua pergunta: "divida as estradas em segmentos individuais nos cruzamentos" ou "como remover todas as geometrias não divididas originais". Eu posso ajudar se você mostrar aqui seus resultados aqui, passo a passo ...
Primeiro passo: análise de topologia
fonte
Outra "solução não real para o seu problema", mas nosso conversor OSM se divide em interseções enquanto converte de OSM para SHP. É mais eficiente dessa maneira, pois pode comparar o ID dos nós, em vez de fazer cálculos geométricos.
fonte
Uma maneira de resolvê-lo algoritmicamente seria adicionar o ponto inicial e final de cada estrada inteira ao conjunto de "interseções", para que você possa ter certeza de que cada segmento está entre duas interseções.
fonte