Como extrair sub-cadeia de uma cadeia de linhas com segmentos sobrepostos

15

Declaração do problema: dada uma rota de ônibus (definida como uma cadeia de linhas ln.the_geom) e um conjunto de locais de pontos de ônibus (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), divida a rota de ônibus em segmentos entre as paradas de ônibus . Estou usando duas funções postgis

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

O exemplo acima funciona bem se a rota de ônibus não tiver seções sobrepostas. No entanto, se houver seções sobrepostas, o ST_line_locate_point encaixará um ponto na outra extremidade da cadeia de linhas. Como exemplo: o ônibus viaja de A para B, faz um loop e depois viaja de B para A. "A para B" e "B para A" são rotas paralelas com todos os pontos sobrepostos. No caso dos pontos de ônibus P1 e P2, P2 é mapeado no ponto P2 '(na direção oposta). O segmento é extraído incorretamente neste caso (onde segmentos extras estão incluídos).

Como resolver problemas como este? As rotas de ônibus sobrepostas podem acontecer em qualquer seção da rota ... EXEMPLO

user35469
fonte
Existe uma maneira de identificar os terminais de suas rotas de ônibus e dividir a cadeia de linhas fechada em uma linha em qualquer direção? Então você não terá mais segmentos sobrepostos. Por exemplo, você pode encontrar o ponto mais distante da linha desde o início e separar sua linha em duas direções usando esse ponto.
Raphael #
3
Questão antiga, mas parece que você precisa começar e nomear seções, juntar-se ao conjunto de dados de pontos e remover qualquer seção com um ponto inicial ordenando maior que o ponto final. Isso faz algum sentido?
Jorge Sanz
1
Você pode fornecer a geometria WKT para a rota de ônibus especificada?
kttii

Respostas:

1

Supondo que a rota do ônibus se sobreponha não mais que 2 vezes em qualquer ponto, isso pode ser resolvido revertendo a linha para o segundo ponto de localização da linha, localizando o ponto mais próximo mais próximo ao final da linha. Você precisará subtrair isso de 1 para usar na consulta ST_LineSubstring. Por exemplo

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Nathan Lawrence
fonte