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:
(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_VoronoiPolygons
mas 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?
ExteriorRing
eIntersects
mas não tiveram tempo para trabalhar nele durante as férias.Respostas:
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):
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;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.
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.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;6) No QGIS Na tabela exper_list6, execute a ferramenta "Delaunay triangulation" e obtenha o resultado exper_list10, veja a figura 6
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;
8) No exper_list6, corte o resultado exper_list11, figura 8 exper_list12;
9) No exper_list4, corte exper_list11, o resultado figura 9 exper_list13;
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.
boa sorte sua fielmente
fonte