Created
May 7, 2013 04:55
-
-
Save mpetroff/5530329 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
-- | |
-- $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 | |
-- | |
-- Updated by Matthew Petroff (2013-05) | |
-- | |
-- 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(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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment