]> granicus.if.org Git - postgis/commitdiff
Consider TopoElements of type 0 as empty, allow CreateTopoGeom calls w/out a TopoElem...
authorSandro Santilli <strk@keybit.net>
Thu, 29 Dec 2011 18:01:08 +0000 (18:01 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 29 Dec 2011 18:01:08 +0000 (18:01 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@8613 b70326c6-7e19-0410-871a-916f4a2858ee

doc/extras_topology.xml
topology/topology.sql.in.c

index 2fb1ec6b9299b3260aaaeb754f962178595719e2..ffd851178d58a2b0b1863034b87308cac66187f4 100644 (file)
@@ -2098,6 +2098,13 @@ nodeid
                                        <paramdef><type>integer</type> <parameter>layer_id</parameter></paramdef>
                                        <paramdef><type>topoelementarray</type> <parameter>tg_objs</parameter></paramdef>
                                        </funcprototype>
+
+                                       <funcprototype>
+                                       <funcdef>topogeometry <function>CreateTopoGeom</function></funcdef>
+                                       <paramdef><type>varchar </type> <parameter>toponame</parameter></paramdef>
+                                       <paramdef><type>integer </type> <parameter>tg_type</parameter></paramdef>
+                                       <paramdef><type>integer</type> <parameter>layer_id</parameter></paramdef>
+                                       </funcprototype>
                                </funcsynopsis>
                        </refsynopsisdiv>
                
@@ -2108,6 +2115,7 @@ nodeid
                 <para>tg_type is an integer: 1:[multi]point (punctal), 2:[multi]line (lineal), 3:[multi]poly (areal), 4:collection. layer_id is the layer id in the topology.layer table.</para>
                 <para>punctal layers are formed from set of nodes, lineal layers are formed from a set of edges, areal layers are formed from a set of faces,
                        and collections can be formed from a mixture of nodes, edges, and faces.</para>
+                <para>Omitting the array of components generates an empty TopoGeometry object.</para>
                 <!-- use this format if new function -->
                 <para>Availability: 1.?</para>
                        </refsection>
index 1459524b443cc3eeff3828281da9836518d24baa..8c678cff2bd84f46470603767dc21a6d8d1189a9 100644 (file)
@@ -910,29 +910,37 @@ BEGIN
        LOOP
                obj_id = tg_objs[i][1];
                obj_type = tg_objs[i][2];
-               IF layerlevel = 0 THEN -- array specifies lower-level objects
-                       IF tg_type != 4 and tg_type != obj_type THEN
-                               RAISE EXCEPTION 'A TopoGeometry of type % cannot contain topology elements of type %', tg_type, obj_type;
+
+               -- Elements of type 0 represent emptiness, just skip them
+               IF obj_type = 0 THEN
+                       IF obj_id != 0 THEN
+                               RAISE EXCEPTION 'Malformed empty topo element {0,%} -- id must be 0 as well', obj_id;
                        END IF;
-               ELSE -- array specifies lower-level topogeometries
-                       IF obj_type != layerchild THEN
-                               RAISE EXCEPTION 'TopoGeom element layer do not match TopoGeom child layer';
+               ELSE
+                       IF layerlevel = 0 THEN -- array specifies lower-level objects
+                               IF tg_type != 4 and tg_type != obj_type THEN
+                                       RAISE EXCEPTION 'A TopoGeometry of type % cannot contain topology elements of type %', tg_type, obj_type;
+                               END IF;
+                       ELSE -- array specifies lower-level topogeometries
+                               IF obj_type != layerchild THEN
+                                       RAISE EXCEPTION 'TopoGeom element layer do not match TopoGeom child layer';
+                               END IF;
+                               -- TODO: verify that the referred TopoGeometry really
+                               -- exists in the relation table ?
                        END IF;
-                       -- TODO: verify that the referred TopoGeometry really
-                       -- exists in the relation table ?
-               END IF;
 
-               --RAISE NOTICE 'obj:% type:% id:%', i, obj_type, obj_id;
-
-               --
-               -- Insert record into the Relation table
-               --
-               EXECUTE 'INSERT INTO '||quote_ident(toponame)
-                       || '.relation(topogeo_id, layer_id, '
-                       || 'element_id,element_type) '
-                       || ' VALUES ('||ret.id
-                       ||','||ret.layer_id
-                       || ',' || obj_id || ',' || obj_type || ');';
+                       --RAISE NOTICE 'obj:% type:% id:%', i, obj_type, obj_id;
+
+                       --
+                       -- Insert record into the Relation table
+                       --
+                       EXECUTE 'INSERT INTO '||quote_ident(toponame)
+                               || '.relation(topogeo_id, layer_id, '
+                               || 'element_id,element_type) '
+                               || ' VALUES ('||ret.id
+                               ||','||ret.layer_id
+                               || ',' || obj_id || ',' || obj_type || ');';
+               END IF;
 
                i = i+1;
                IF i > array_upper(tg_objs, 1) THEN
@@ -945,7 +953,17 @@ BEGIN
 END
 $$
 LANGUAGE 'plpgsql' VOLATILE STRICT;
---} CreateTopoGeom(toponame,topogeom_type, TopoObject[])
+--} CreateTopoGeom(toponame,topogeom_type, layer_id, TopoElementArray)
+
+--{
+-- CreateTopoGeom(topology_name, topogeom_type, layer_id) - creates the empty topogeom
+CREATE OR REPLACE FUNCTION topology.CreateTopoGeom(toponame varchar, tg_type integer, layer_id integer)
+       RETURNS topology.TopoGeometry
+AS
+$$
+  SELECT topology.CreateTopoGeom($1,$2,$3,'{{0,0}}');
+$$ LANGUAGE 'sql' VOLATILE STRICT;
+--} CreateTopoGeom(toponame, topogeom_type, layer_id)
 
 --{
 -- GetTopologyName(topology_id)