Dividir sobreposição entre polígonos e atribuir ao polígono mais próximo usando o PostGIS?


8

Minha pergunta está bastante relacionada à sobreposição dividida não respondida entre polígonos em conjuntos separados, exceto que eu não estou usando shapely, estou usando o PostGIS 2.4 no PostgreSQL 10.

Eu tenho uma tabela contendo multipolígonos para unidades administrativas. As geometrias cobrem apenas a área terrestre. Meu objetivo é estendê-los a uma determinada distância na água.

Para estender os polígonos atuais para a água, faço um buffer seguido subtraindo todas as outras geometrias da tabela. Isso corta o buffer em que a geometria tem vizinhos e retém o buffer em que a camada atualmente não possui nada. Então, algo como:

SELECT c1.name
     , ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
                    , (SELECT ST_Union(c2.geom)
                         FROM foo.county AS c2
                        WHERE c2.name <> c1.name)
                    )
  FROM foo.county AS c1
 GROUP BY c1.name;

No entanto, é claro que isso me dá amortecedores sobrepostos, onde dois polígonos se encontram na beira da água, bem como em estreitos estreitos:

mapa

(Observe que a pequena tira roxa à esquerda deve ser completamente atribuída ao polígono vermelho, pois nenhum ponto nessa geometria está mais perto do azul do que do vermelho devido à península do tipo apêndice.)

É aqui que estou preso. Quero cortar as sobreposições (partes roxas) em dois polígonos disjuntos ao longo de uma linha equidistante aos polígonos sem buffer e depois subtrair essas lascas dos condados armazenados em buffer.

Acho que não tenho um caso de três ou mais buffers sobrepostos. Atravessarei a ponte se e quando chegar a ela.

Cheira a mim algo semelhante, mas não muito idêntico ao uso, ST_VoronoiPolygonsmas em torno de polígonos, em vez de pontos.

Isso existe - idealmente - como funções PostGIS, como funcionalidade de geoprocessamento QGIS ou talvez em algumas bibliotecas python?


Na imagem acima, esse pequeno grão de águas internacionais não azuis? ou você preenche isso?
Evan Carroll

O não-azul está simplesmente fora de todos os polígonos - só estou usando um buffer de 250 metros, por isso ainda são águas nacionais. Para o meu propósito, só preciso de um pequeno buffer para ter certeza de pegar os recursos "no surf". Ver o buraco ao sul da ilha do anel no meio definitivamente me faz querer fazer um despejo do ExteriorRing também, mas isso não é relevante para esta pergunta. :)
kthy

Você encontrou uma solução? Estou enfrentando um problema semelhante e gostaria de dividir alguns polígonos sobrepostos aos vizinhos.
danielk

Ainda não há solução, infelizmente. Eu tenho uma idéia para progredir usando uma combinação de ExteriorRinge Intersectsmas não tiveram tempo para trabalhar nele durante as férias.
kthy

seu exemplo pode ter sido parcialmente automatizado, mas a função st_difference se comporta horrivelmente ao cortar, deixando "bigodes" nas bordas dos cortes, o que força o desenvolvedor a procurar soluções alternativas, e os casos de mesclagem de polígonos podem ser simples e complicados, o que implicará revisão manual ... você ainda enfrenta trabalho com o seu exemplo?
Cyril Mikhalchenko

Respostas:


5

Se a solução para esse problema for relevante e entendi corretamente, sua solução é a seguinte: (Os dados originais são abstratos, pois eu entendi que é a interseção adjacente no buffer com um determinado número de metros, no meu caso 2 tabelas : exper_list3 e exper_list4, veja a figura 1):

insira a descrição da imagem aqui 1) No pgAdmin, execute a consulta: create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true; resultado: tabela exper_list5, veja a figura 2;

insira a descrição da imagem aqui

2) No pgAdmin, execute a consulta: create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5; O resultado é uma tabela com pontos, vá adicionalmente às propriedades da tabela, crie um campo gid e defina restrições sobre ele;

3) No QGIS, execute a ferramenta Voronoi Polygon na tabela (camada vetorial) exper_list6 O resultado é mostrado na Figura 3.

insira a descrição da imagem aqui

4) No pgAdmin, execute a consulta: create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7; O resultado é mostrado na Figura 4.

insira a descrição da imagem aqui

5) Selecione entre exper_list8 os pontos que inserem o polígono exper_list5 No pgAdmin, execute a consulta: create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true; e copie esses pontos na figura 5 do resultado da tabela exper_list6;

insira a descrição da imagem aqui

6) No QGIS Na tabela exper_list6, execute a ferramenta "Delaunay triangulation" e obtenha o resultado exper_list10, veja a figura 6

insira a descrição da imagem aqui

7) No QGIS, no modo de edição "Lápis" na tabela exper_list10, escolha os triângulos que atingem a área de interesse, use a ferramenta "Vetor" - "Geoprocessamento" - "Unificação por recurso" (marque "apenas objetos selecionados" "Classificação" - por todos os sinais) resultado exper_list11 figura 7;

insira a descrição da imagem aqui

8) No exper_list6, corte o resultado exper_list11, figura 8 exper_list12;

insira a descrição da imagem aqui

9) No exper_list4, corte exper_list11, o resultado figura 9 exper_list13;

insira a descrição da imagem aqui

10) Ações semelhantes devem ser executadas com o polígono esquerdo (no meu caso, a tabela exper_list4)

11) O resultado geral são as duas tabelas exper_list13 e exper_list14, veja a figura 10.

insira a descrição da imagem aqui

boa sorte sua fielmente


Parece ouro maciço. Marcarei como aceito assim que tiver tempo de testá-lo na próxima semana. Obrigado!
Kthy 17/05/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.