Wenn Sie die Polygone einer Tabelle mit Polygonen in einer anderen beschneiden, kann ST_Intersection eine Reihe von Ergebnissen zurückgeben, die mit ST_Dump verarbeitet werden können. Die zurückgegebenen Mehrfachgeometrien sind nicht unbedingt ST_Polygon, sondern auch ST_LineString (wahrscheinlich auch ein Punkt). Also beim Ausführen einer Abfrage
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));
Beim Versuch, die Tabelle "c" mit abgeschnittenen Polygonen zu füllen, schlägt dies mit ERROR fehl: Der Geometrietyp (LineString) stimmt nicht mit dem Spaltentyp (Polygon) überein.
Ich habe eine weitere verschachtelte SELECT-Anweisung ausgeführt, sodass nur die Polygongeometrien durchgekommen sind, z.
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');
Da dies etwas umständlich ist, frage ich mich, ob es eine elegantere Lösung gibt, um ungültige Geometrien zu löschen.
{}
über dem Fenster zum Bearbeiten von Fragen.Antworten:
Dies ist möglicherweise ein guter Ort, um eine SQL-Sprachfunktion zu verwenden. Hier ist eine kurze, die für diese Situation funktionieren sollte:
Dadurch bleiben die polygonalen Komponenten einer Kreuzung erhalten, aber alles andere wird weggeworfen. Es wird immer ein MultiPolygon zurückgegeben, auch wenn Sie eine oder keine Komponenten haben.
quelle
Sehr gute Antwort von @dbaston. Die Rückgabe einer leeren Geometrie anstelle von null kann jedoch zu Problemen führen, da die zurückgegebene leere Geometrie kein srid enthält. St_Intersection gibt möglicherweise auch MultiPolygon zurück. Diese aktualisierte Funktion war wirklich nützlich für mich:
quelle