Estou tentando identificar onde as estradas se cruzam e fazer um ponto nesse cruzamento, com o número de estradas que formam o cruzamento listado.
Fiquei me perguntando se havia alguma maneira de usar ST_NumPoints para conseguir isso, mas não consigo entender o que deveria estar fazendo. O que fiz foi criar uma tabela de pontos em que as linhas se cruzam usando o seguinte código:
CREATE TABLE test_points as
SELECT
ST_Intersection(a.geom, b.geom),
a.gid
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom);
Se eu executar isso em uma amostra de estradas, recebo a seguinte grade de pontos (as estradas são mostradas para ilustração):
Se eu inspecionar um dos pontos, vejo que há muitos pontos empilhados um sobre o outro:
O GID aqui é o ID da estrada, mas não entendo por que existem muitos pontos. Eu posso entender 4 pontos sendo contados para um cruzamento de estrada central, mas há 12 pontos listados aqui. Existe uma maneira melhor de realizar esse cálculo no PostGIS?
COUNT()
comoCOUNT(ST_Touches(..))
e,COUNT(ST_Intersection(..))
mas isso não parece funcionar como todos os valores12
.Isso é um pouco mais complicado do que você imagina. Isso ocorre porque não há uma boa maneira de analisar relações para mais do que pares. Você não pode colocar três linhas em uma função e perguntar se todas elas se cruzam.
Porém, pelo menos uma abordagem poderia ser encontrar primeiro os cruzamentos e depois verificar quantas estradas estão tocando em cada cruzamento (tudo isso pode ser feito na mesma consulta).
Se suas estradas se conectam perfeitamente umas às outras e não há estradas passando por uma passagem, você pode fazer algo assim (não testado):
editado com a cláusula de grupo esquecida (ainda não testada):
Se as estradas não estiverem conectadas adequadamente e / ou algumas passarem por uma passagem, é mais complicado.
HTH
Nicklas
fonte
distinct_crosspoints ,roads
nome da minha tabela (roads_test
)? Eu tentei isso, mas depois recebi um erro sobregeom
ser ambíguo.Se a linha A (id 1) cruza a linha B (id 2), é um ponto de interseção que precisamos. Mas a linha B também cruza a linha A no mesmo ponto. Mas não precisamos desse ponto duas vezes. É por isso que estou usando, em
a.gid < b.gid
vez dea.gid != b.gid
fonte