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.