Enfrento um desafio com o PostGIS que não consigo entender. Eu sei que posso resolver isso usando uma linguagem de programação (e esse é o meu plano de backup), mas eu realmente gosto de resolver isso no PostGIS. Eu tentei pesquisar, mas não consegui encontrar respostas que correspondam ao meu problema, isso pode ser porque eu não tenho certeza sobre meus termos de pesquisa. Por isso, desculpe-me e aponte-me na direção certa; de fato, há uma resposta.
Meu problema é este:
- Eu tenho uma tabela com polígonos / poligonos múltiplos
- Cada polígono (multi) possui um atributo que o classifica (prioridade)
- Cada polígono também tem um valor que eu gostaria de saber
- Eu tenho uma área de pesquisa (polígono)
- Para a minha área de consulta, quero encontrar a área coberta por cada valor de polígono
Exemplo:
Digamos que eu tenha os três polígonos representados em vermelho, verde e índigo aqui:
E que o menor retângulo azul é o meu polígono de consulta
Além disso, os atributos são
geom | rank | value
-------|------|----
red | 3 | 0.1
green | 1 | 0.2
indigo | 2 | 0.2
O que eu quero é selecionar essas geometrias, para que a classificação mais alta (verde) preencha toda a área possível (por exemplo, a interseção entre o meu geom de consulta e esse geom), e a próxima mais alta (índigo) preencha a interseção entre o geom da consulta e o geom menos o já coberto) etc.
Encontrei esta pergunta: Usando ST_Difference para remover recursos sobrepostos? mas parece não fazer o que eu quero.
Eu mesmo posso descobrir como calcular áreas e coisas assim, então uma consulta que me fornece as três geometrias mostradas na segunda imagem é boa!
Informações adicionais: - Esta não é uma tabela grande (~ 2000 linhas) - pode haver zero ou várias sobreposições (não apenas três) - pode não haver polígonos na minha área de consulta (ou apenas em partes dela) - i ' m executando o postgis 2.3 no postgres 9.6.6
Minha solução de fallback é fazer uma consulta como esta:
SELECT
ST_Intersection(geom, querygeom) as intersection, rank, value
FROM mytable
WHERE ST_Intersects(geom, querygeom)
ORDER by rank asc
E, em seguida, iterativamente "corta" partes das geometrias no código. Mas, como eu disse, eu realmente gostaria de fazer isso no PostGIS
WITH RECURSIVE ...
CTE ( docs e um general tutorial )