Mais

Consulta recursiva de PostGIS baseada na conectividade de linha

Consulta recursiva de PostGIS baseada na conectividade de linha


Estou tendo dificuldade com uma consulta. Eu tenho uma rede de cadeias de linhas, cada uma com um valor na coluna n_type. Essa pode ser uma das várias opções. Gostaria de gerar uma nova tabela que agrupe quaisquer cadeias de linha que sejam do mesmo tipo e que formem uma linha contínua.

Antes da:

Depois:

Aqui está o que eu tenho até agora. Ele retorna resultados, mas eles não fazem sentido - os tipos não correspondem e ele retorna muitos recursos.

Observe também que defini "contínua" como qualquer linha dentro de 5 pés de seu vizinho e encontrando-se em um ângulo inferior a 30 graus.

COM all_links RECURSIVOS (i, pk_uid, n_type, geom) AS (SELECIONE 1 AS i, pk_uid, n_type, geom DA rede WHERE n_type! = 'Nenhum' UNION ALL SELECT ai + 1, b.pk_uid, b.n_type, b. geom FROM rede b, all_links a WHERE b.n_type = a.n_type AND b.geom <#> a.geom <= 5 - as linhas são contínuas se dentro de 5 pés do vizinho E ABS (DEGREES (3 * pi () - st_azimuth (st_startpoint (a.geom), st_endpoint (a.geom)) + st_azimuth (st_startpoint (b.geom), st_endpoint (b.geom))) :: int% 360 - 180) <= 30) - apenas pegue links dentro de 30 graus do mesmo ângulo SELECT i, n_type, ST_Union (the_geom) FROM all_links GROUP BY i, n_type

Presumi que uma consulta recursiva é o caminho a percorrer, mas estou feliz em saber que estou errado nisso. Recursivas são um pouco difíceis de entender.

Edit: Devo acrescentar que já tentei agregar usando ST_Union e ST_Linemerge e, em seguida, despejar o resultado. Isso meio que funciona, mas não leva em conta interseções> 30 graus e também não pode respeitar a tolerância de cinco pés para conectividade.


Sua solução é, pelo menos, faltar uma pré-encomenda dos componentes da linha, como disse John Barça.

As consultas recursivas são muito, muito difíceis de entender, eu diria.

Você deve tentar replicar o comportamento ST_Linemerge em uma nova função de banco de dados. Eu tentaria primeiro olhar para a origem de uma implementação ST_Linemerge e replicar, alterando-a para produzir a contração do ângulo de 30 graus.

Para descartar da agregação os segmentos que não estão em um ângulo de <30 graus, você deve compará-los DENTRO de um loop de agregação.


Assista o vídeo: RESOLVENDO ERRO CONECTIVIDADE ICP. JAVA. 2020 - 2021 #conectividadeicp #java