Existe uma função PostGIS para determinar se uma cadeia de linhas se cruza?

16

Eu estive procurando por uma função que pode me dizer se um LineString se cruza. Tentei ligar st_intersectscom a mesma LineString duas vezes, mas obviamente linhas de linhas idênticas se cruzam. Meu plano, se não houver nenhuma função, seria obter todos os pontos na sequência de linhas e criar cadeias de linhas individuais e, em seguida, verificar cada nova cadeia de linhas uma contra a outra com st_intersects. Não quero que isso chegue a isso, mas receio que sim.

Portanto, existem funções do PostGIS para verificar se uma cadeia de linhas se intercepta? Deve ser semelhante a descobrir se um polígono é complexo, eu diria

Jeff
fonte
Houve uma segunda resposta aqui que não me ajudou muito no PostGIS, mas continha um link para algumas informações úteis sobre o problema como um todo. Parece que foi excluído. Alguém tem esse link?
Jeff

Respostas:

14

Você pode testar uma cadeia de linhas com interseção automática com ST_IsSimple(geom):

SELECT ST_IsSimple('LINESTRING (50 50, 150 150, 50 150, 150 50)');
 st_issimple
-------------
 f
(1 row)

Auto-interseção no ponto (100,0 100,0)

A imagem acima e a legenda abaixo são do JTS TestBuilder (clique em "Simples?")

Auto-interseção em POINT ( 100.0 100.0 )

Isso pode ser corrigido com ST_UnaryUnion(geom)(desde o PostGIS 2.0), que retorna uma cadeia de linhas múltipla válida / simples de três partes:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))
Mike T
fonte
Isto é perfeito! Eu sabia que a resposta tinha que ser tão simples. Você disse que usou o JTS Testbuilder para criar a imagem. Existe alguma maneira que você conhece no Postgis para obter o ponto / pontos de interseção?
Jeff
Esse é o detalhe desafiador. O JTS TestBuilder possui CheckNoding, mas isso localiza apenas uma coordenada de nó por chamada, em vez de um MULTIPOINT. Não sei exatamente como obter os pontos de concordância com o PostGIS.
Mike T