]> granicus.if.org Git - postgis/commitdiff
Add topology.polygonize(<toponame>) function, see ticket #916
authorSandro Santilli <strk@keybit.net>
Tue, 19 Apr 2011 16:58:42 +0000 (16:58 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 19 Apr 2011 16:58:42 +0000 (16:58 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@7047 b70326c6-7e19-0410-871a-916f4a2858ee

topology/Makefile.in
topology/sql/polygonize.sql [new file with mode: 0644]
topology/topology.sql.in.c

index d6d03669651a1aa4d8ac1bb9cffc4a32dd27b5bb..72d6e6368be2ea40f50684195494dc98df779ef0 100644 (file)
@@ -42,7 +42,7 @@ endif
 $(SQL_OBJS): %.in: %.in.c
        $(CPP) -traditional-cpp $< | grep -v '^#' > $@
 
-topology.sql.in: sql/sqlmm.sql sql/populate.sql sql/gml.sql sql/query/getnodebypoint.sql sql/query/getedgebypoint.sql sql/query/getfacebypoint.sql sql/manage/TopologySummary.sql sql/manage/CopyTopology.sql
+topology.sql.in: sql/sqlmm.sql sql/populate.sql sql/polygonize.sql sql/gml.sql sql/query/getnodebypoint.sql sql/query/getedgebypoint.sql sql/query/getfacebypoint.sql sql/manage/TopologySummary.sql sql/manage/CopyTopology.sql
 
 check: topology.sql
        $(MAKE) -C test $@
diff --git a/topology/sql/polygonize.sql b/topology/sql/polygonize.sql
new file mode 100644 (file)
index 0000000..4d04bcd
--- /dev/null
@@ -0,0 +1,51 @@
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+-- 
+-- PostGIS - Spatial Types for PostgreSQL
+-- http://postgis.refractions.net
+--
+-- Copyright (C) 2011 Sandro Santilli <strk@keybit.net>
+--
+-- This is free software; you can redistribute and/or modify it under
+-- the terms of the GNU General Public Licence. See the COPYING file.
+--
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+--
+-- Functions used to polygonize topology edges
+--
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+--{
+--
+-- int Polygonize(toponame)
+--
+-- TODO: allow restricting polygonization to a bounding box
+--
+-- }{
+CREATE OR REPLACE FUNCTION topology.polygonize(toponame varchar)
+       RETURNS text
+AS
+$$
+DECLARE
+  sql text;
+       rec RECORD;
+  faces int;
+BEGIN
+
+       sql := 'SELECT (st_dump(st_polygonize(geom))).geom from '
+         || quote_ident(toponame) || '.edge_data';
+
+  faces = 0;
+       FOR rec in EXECUTE sql LOOP
+    BEGIN
+      PERFORM topology.AddFace(toponame, rec.geom);
+      faces = faces + 1;
+    EXCEPTION
+      WHEN OTHERS THEN
+        RAISE WARNING 'Error registering face % (%)', rec.geom, SQLERRM;
+    END;
+       END LOOP;
+  RETURN faces || ' faces registered';
+END
+$$
+LANGUAGE 'plpgsql';
+--} Polygonize(toponame)
index 58caa4c38fdc34a2b804f0fd67753ccb320d37f1..4ff8112248780b67a1c968add220bf990f20e54f 100644 (file)
@@ -2436,8 +2436,9 @@ LANGUAGE 'plpgsql' VOLATILE STRICT;
 #include "sql/query/getedgebypoint.sql"
 #include "sql/query/getfacebypoint.sql"
 
---  Editing
+--  Populating
 #include "sql/populate.sql"
+#include "sql/polygonize.sql"
 
 --  TopoElement
 #include "sql/topoelement/topoelement_agg.sql"