Dada uma tabela com geometria de linha e um ou mais pontos que são encaixados nessa linha em uma tabela separada, eu gostaria de dividir cada linha com um ou mais pontos de interseção em cada um dos locais onde a linha cruza um ponto.
Por exemplo, há uma linha L com três pontos de interseção, A, B e C em ordem ao longo da geometria da linha. Gostaria de retornar L como quatro geometrias distintas: do início de L a A, de A a B ao longo de L, de B a C ao longo de L e de C ao final de L.
No passado, eu usei shapely para esta tarefa, que é um problema de referência linear ( http://sgillies.net/blog/1040/shapely-recipes/ ). No entanto, isso não seria viável neste caso, que possui muitos milhões de linhas e pontos. Em vez disso, estou procurando uma solução usando o PostgreSQL / PostGIS.
Observe que os pontos são restritos a estar em uma linha. Além disso, um ponto pode validamente estar no início ou no final de uma linha; nesse caso, a linha não precisa ser dividida (a menos que haja outros pontos que não sejam coincidentes com os pontos de início ou de término da mesma linha). As linhas de subconjunto precisam manter sua direção e seus atributos, mas os atributos dos recursos de ponto não importam.
fonte
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
- eu editei.ST_Split
suporta multi * lâminas empostgis 2.2
e acima postgis.net/docs/ST_Split.htmlAtualize para o PostGIS 2.2 , onde ST_Split foi expandido para suportar a divisão por uma multilinha, um limite multiponto ou (multi) polígono.
fonte
Não tenho a resposta completa para você, mas ST_Line_Locate_Point usa uma linha e um ponto como argumentos e retorna um número entre 0 e 1 representando a distância ao longo da linha até a posição mais próxima do ponto.
ST_Line_Substring usa uma linha e dois números, cada um entre 0 e 1, como argumentos. Os números representam as posições na linha como distâncias fracionárias. A função retorna o segmento de linha que é executado entre essas duas posições.
Ao trabalhar com essas duas funções, você poderá conseguir o que deseja fazer.
fonte
Me pediram isso duas vezes agora, desculpe pelo atraso. É improvável que seja considerada uma solução concisa; Eu o escrevi um pouco mais abaixo na curva de aprendizado do que atualmente. Todas as dicas são bem-vindas, até as estilísticas.
fonte
Eu quero expandir as respostas acima da perspectiva de um iniciante. Nesse cenário, você tem uma série de pontos e observa como usá-los como uma "lâmina" para cortar linhas em segmentos. Este exemplo inteiro pressupõe que você primeiro inseriu seus pontos na linha e que os pontos têm o atributo de ID exclusivo da sua linha ajustada. Eu uso 'column_id "para representar o ID exclusivo da linha.
Primeiro , você deseja agrupar seus pontos em multipontos quando mais de uma lâmina cair em uma linha. Caso contrário, a função split_line_multipoint atua como a função ST_Split, que não é o resultado desejado.
Então , você deseja dividir sua rede com base nesses multipontos.
Repita as etapas 1 e 2 com suas linhas que possuem apenas um ponto de interseção. Para fazer isso, você deve atualizar o código da etapa 1 para 'TENDO CONTAGEM (*) = 1'. Renomeie as tabelas de acordo.
Em seguida , crie uma tabela de linhas duplicada e exclua as entradas com pontos nelas.
Por fim , junte suas três tabelas usando
UNION ALL
:BAM!
fonte