-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- $Id: cleanGeometry.sql 2008-04-24 10:30Z Dr. Horst Duester $ -- -- cleanGeometry - remove self- and ring-selfintersections from -- input Polygon geometries -- http://www.kappasys.ch -- Copyright 2008 Dr. Horst Duester -- Version 1.0 -- contact: horst dot duester at kappasys dot ch -- -- This is free software; you can redistribute and/or modify it under -- the terms of the GNU General Public Licence. See the COPYING file. -- This software is without any warrenty and you use it at your own risk -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CREATE OR REPLACE FUNCTION cleanGeometry(geom geometry) RETURNS geometry AS $BODY$DECLARE inGeom ALIAS for $1; outGeom geometry; tmpLinestring geometry; Begin outGeom := NULL; -- Clean Process for Polygon IF (GeometryType(inGeom) = 'POLYGON' OR GeometryType(inGeom) = 'MULTIPOLYGON') THEN -- Only process if geometry is not valid, -- otherwise put out without change if not st_isValid(inGeom) THEN -- create nodes at all self-intersecting lines by union the polygon boundaries -- with the startingpoint of the boundary. tmpLinestring := st_union(st_multi(st_boundary(inGeom)),st_pointn(st_boundary(inGeom),1)); outGeom = st_buildarea(tmpLinestring); IF (GeometryType(inGeom) = 'MULTIPOLYGON') THEN RETURN st_multi(outGeom); ELSE RETURN outGeom; END IF; else RETURN inGeom; END IF; ------------------------------------------------------------------------------ -- Clean Process for LINESTRINGS, self-intersecting parts of linestrings -- will be divided into multiparts of the mentioned linestring ------------------------------------------------------------------------------ ELSIF (GeometryType(inGeom) = 'LINESTRING') THEN -- create nodes at all self-intersecting lines by union the linestrings -- with the startingpoint of the linestring. outGeom := st_union(st_multi(inGeom),st_pointn(inGeom,1)); RETURN outGeom; ELSIF (GeometryType(inGeom) = 'MULTILINESTRING') THEN outGeom := multi(st_union(st_multi(inGeom),st_pointn(inGeom,1))); RETURN outGeom; ELSE RAISE NOTICE 'The input type % is not supported',GeometryType(inGeom); RETURN inGeom; END IF; End;$BODY$ LANGUAGE 'plpgsql' VOLATILE;