Ao recortar os polígonos de uma tabela com polígonos em outra, ST_Intersection pode retornar um conjunto de resultados que podem ser manipulados com ST_Dump. As várias geometrias retornadas não são necessariamente ST_Polygon, mas também ST_LineString (provavelmente também um ponto). Então, ao executar uma consulta
INSERT INTO c (geom)
(SELECT (ST_Dump(ST_Intersection(a.geom,b.geom))).geom
FROM a INNER JOIN b ON ST_Intersects(a.geom, b.geom));
ao tentar preencher a tabela "c" com polígonos cortados, ela falha com ERRO: O tipo de geometria (LineString) não corresponde ao tipo de coluna (polígono)
Eu fiz outra instrução SELECT aninhada para que apenas as geometrias de polígonos aparecessem, como:
INSERT INTO c (geom)
(SELECT geom FROM
(SELECT (ST_Dump(ST_Intersection(a.geom,b.geom))).geom
FROM a INNER JOIN b ON ST_Intersects(a.geom, b.geom))) AS cl
WHERE ST_GeometryType(cl.geom)='ST_Polygon');
Como isso é um pouco complicado, pergunto-me se existe uma solução mais elegante para eliminar geometrias inválidas?
{}
acima da janela de edição de perguntas.Respostas:
Esse pode ser um bom local para usar uma função da linguagem SQL. Aqui está uma rápida que deve funcionar para esta situação:
Isso manterá os componentes poligonais de uma interseção, mas jogue fora todo o resto. Ele sempre retorna um MultiPolygon, mesmo se você tiver um ou nenhum componente.
fonte
Resposta muito boa de @dbaston. No entanto, retornar uma geometria vazia em vez de nula pode causar problemas porque a geometria vazia retornada não possui srid. St_Intersection também pode retornar MultiPolygon. Esta função atualizada foi realmente útil para mim:
fonte