= Geometry Cleaning = Cleaning is fundamentally a difficult problem, because things can be dirty in so many ways. Here's a list of cases that need to be addressed in any geometry cleaning routines. * POLYGON rings must not self-touch * The classic "bow-tie" polygon would have to be re-written as a "polygon with hole that touches once" * POLYGON rings should not have zero area * POLYGONs should probably not have zero area * POLYGON rings must be properly nested and only touch once * POLYGONs with rings that touch along a segment should have the inner ring and zero-width corridor removed * LINESTRINGs and POLYGON rings should not have duplicate vertices and probably not have vertices within a tolerance of one another * For POLYGONs in a coverage, this will break edge-matching * LINESTRINGs and POLYGON rings should probably not have "spikes" or "gores" * These elements create two very parallel segments in the feature, which lead to topology failures later on * MULTIPOLYGONS are not allowed to have parts that touch * Fixing this in generality is hard because it requires dissolving which is itself a topologically sensitive operation * POLYGON rings must not cross * Again, fixing this is hard because the intent behind crossing rings is difficult to discern. The potential for breaking edge-matching calls for a further cleaning function, that takes in two geometries and snaps the edges of one to another, within a tolerance. * ST_SnapToReference(referencegeometry, geometry, tolerance) A self-join could be used to run this function on all pairwise possibilities in a table to "complete the cleaning" of a coverage.