Al recortar los polígonos de una tabla con polígonos en otra, ST_Intersection puede devolver un conjunto de resultados que se pueden manejar con ST_Dump. Las geometrías múltiples devueltas no son necesariamente ST_Polygon sino también ST_LineString (probablemente también un punto). Entonces cuando se ejecuta una 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));
al intentar llenar la tabla "c" con polígonos recortados, falla con ERROR: el tipo de geometría (LineString) no coincide con el tipo de columna (polígono)
Hice otra instrucción SELECT anidada para que solo aparecieran las geometrías de polígonos, 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 esto es un poco engorroso, me pregunto si hay una solución más elegante para descartar geometrías no válidas.
{}
sobre la ventana de edición de Preguntas.Respuestas:
Este podría ser un buen lugar para usar una función de lenguaje SQL. Aquí hay uno rápido que debería funcionar para esta situación:
Esto retendrá los componentes poligonales de una intersección, pero tirará todo lo demás. Siempre devuelve un MultiPolygon, incluso si tiene uno o ningún componente.
fuente
Muy buena respuesta de @dbaston. Sin embargo, devolver una geometría vacía en lugar de nulo podría causar problemas porque la geometría vacía devuelta no tiene cuadrícula. St_Intersection también puede devolver MultiPolygon. Esta función actualizada fue realmente útil para mí:
fuente