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.