]> granicus.if.org Git - postgis/commitdiff
Override GeometryType and ST_GeometryType for TopoGeometry (#1289)
authorSandro Santilli <strk@keybit.net>
Thu, 24 Nov 2011 16:01:29 +0000 (16:01 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 24 Nov 2011 16:01:29 +0000 (16:01 +0000)
Includes regression testing.
NOTE: we'll always advertise MULTI as a safest bet

git-svn-id: http://svn.osgeo.org/postgis/trunk@8237 b70326c6-7e19-0410-871a-916f4a2858ee

topology/sql/topogeometry/type.sql [new file with mode: 0644]
topology/test/Makefile
topology/test/hierarchy.sql
topology/test/regress/topogeometry_type.sql [new file with mode: 0644]
topology/test/regress/topogeometry_type_expected [new file with mode: 0644]
topology/topology.sql.in.c

diff --git a/topology/sql/topogeometry/type.sql b/topology/sql/topogeometry/type.sql
new file mode 100644 (file)
index 0000000..f09b9ad
--- /dev/null
@@ -0,0 +1,59 @@
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+-- 
+-- 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.
+--
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+-- {
+--  Override geometrytype() for topogeometry objects
+--
+--  Note: For performance reasons, this function always assumes
+--        TopoGeometry are of the MULTI type. This may not always
+--        be the case if you convert the TopoGeometry to an actual
+--        Geometry.
+--
+-- }{
+CREATE OR REPLACE FUNCTION topology.GeometryType(tg topology.TopoGeometry)
+       RETURNS text
+AS
+$$
+       SELECT CASE
+               WHEN type($1) = 1 THEN 'MULTIPOINT'
+               WHEN type($1) = 2 THEN 'MULTILINESTRING'
+               WHEN type($1) = 3 THEN 'MULTIPOLYGON'
+               WHEN type($1) = 4 THEN 'GEOMETRYCOLLECTION'
+               ELSE 'UNEXPECTED'
+               END;
+$$
+LANGUAGE 'SQL' STABLE STRICT;
+-- }
+
+-- {
+--  Override st_geometrytype() for topogeometry objects
+--
+--  Note: For performance reasons, this function always assumes
+--        TopoGeometry are of the MULTI type. This may not always
+--        be the case if you convert the TopoGeometry to an actual
+--        Geometry.
+--
+-- }{
+CREATE OR REPLACE FUNCTION topology.ST_GeometryType(tg topology.TopoGeometry)
+       RETURNS text
+AS
+$$
+       SELECT CASE
+               WHEN type($1) = 1 THEN 'ST_MultiPoint'
+               WHEN type($1) = 2 THEN 'ST_MultiLinestring'
+               WHEN type($1) = 3 THEN 'ST_MultiPolygon'
+               WHEN type($1) = 4 THEN 'ST_GeometryCollection'
+               ELSE 'ST_Unexpected'
+               END;
+$$
+LANGUAGE 'SQL' STABLE STRICT;
+-- }
index 7f6c7adbf64eb95ebb12bcf6381599de6d111bef..bd1e2befd60f41a4126c27042f23c99bd43bd734 100644 (file)
@@ -11,7 +11,7 @@ edit:
 
 
 topo_predicates.sql: predicates.sql.in
-       @cpp -P -traditional-cpp predicates.sql.in | sed -e 's:@COLUMN@:feature:g;s:@SCHEMA@:topology.:g' > topo_predicates.sql
+       cpp -P -traditional-cpp predicates.sql.in | sed -e 's:@COLUMN@:feature:g;s:@SCHEMA@:topology.:g' > topo_predicates.sql
 
 load_topology.sql: load_topology.sql.in
        @cpp -P -traditional-cpp load_topology.sql.in | sed -e 's:@SRID@:-1:g' > load_topology.sql
@@ -38,10 +38,11 @@ TESTS = regress/legacy_validate.sql regress/legacy_predicate.sql \
        regress/st_getfaceedges.sql \
        regress/st_modedgeheal.sql \
        regress/st_newedgeheal.sql \
-  regress/st_remedgenewface.sql \
-  regress/st_remedgemodface.sql \
+       regress/st_remedgenewface.sql \
+       regress/st_remedgemodface.sql \
        regress/topoelement.sql \
        regress/topoelementarray_agg.sql \
+       regress/topogeometry_type.sql \
        regress/topo2.5d.sql \
        regress/droptopology.sql \
        regress/copytopology.sql \
index da80f90827df49925051debd07622cff4178d5cf..cd1cdde5943fc705d5b6af391670bf95cdef8c5b 100644 (file)
@@ -36,7 +36,10 @@ INSERT INTO features.big_parcels VALUES ('F3F6', -- Feature name
     'city_data', -- Topology name
     3, -- Topology geometry type (polygon/multipolygon)
     (SELECT layer_id FROM topology.layer WHERE table_name = 'big_parcels'),
-    '{{6,1},{7,1}}')); -- F3 and F6
+    (SELECT topoelementarray_agg(ARRAY[id(feature), 1])
+     FROM features.land_parcels
+     WHERE feature_name in ('F3','F6')) 
+  ));
 
 --
 -- Streets
diff --git a/topology/test/regress/topogeometry_type.sql b/topology/test/regress/topogeometry_type.sql
new file mode 100644 (file)
index 0000000..05c21fe
--- /dev/null
@@ -0,0 +1,39 @@
+set client_min_messages to WARNING;
+
+\i load_topology.sql
+\i load_features.sql
+\i more_features.sql
+\i hierarchy.sql
+
+SELECT DISTINCT 'GeometryType(traffic_signs)',
+       geometrytype(feature) FROM features.traffic_signs;
+SELECT DISTINCT 'ST_GeometryType(traffic_signs)',
+       st_geometrytype(feature) FROM features.traffic_signs;
+
+SELECT DISTINCT 'GeometryType(city_streets)',
+       geometrytype(feature) FROM features.city_streets;
+SELECT DISTINCT 'ST_GeometryType(city_streets)',
+       st_geometrytype(feature) FROM features.city_streets;
+
+SELECT DISTINCT 'GeometryType(land_parcels)',
+       geometrytype(feature) FROM features.land_parcels;
+SELECT DISTINCT 'ST_GeometryType(land_parcels)',
+       st_geometrytype(feature) FROM features.land_parcels;
+
+SELECT DISTINCT 'GeometryType(big_signs)',
+       geometrytype(feature) FROM features.big_signs;
+SELECT DISTINCT 'ST_GeometryType(big_signs)',
+       st_geometrytype(feature) FROM features.big_signs;
+
+SELECT DISTINCT 'GeometryType(big_streets)',
+       geometrytype(feature) FROM features.big_streets;
+SELECT DISTINCT 'ST_GeometryType(big_streets)',
+       st_geometrytype(feature) FROM features.big_streets;
+
+SELECT DISTINCT 'GeometryType(big_parcels)',
+       geometrytype(feature) FROM features.big_parcels;
+SELECT DISTINCT 'ST_GeometryType(big_parcels)',
+       st_geometrytype(feature) FROM features.big_parcels;
+
+SELECT topology.DropTopology('city_data');
+DROP SCHEMA features CASCADE;
diff --git a/topology/test/regress/topogeometry_type_expected b/topology/test/regress/topogeometry_type_expected
new file mode 100644 (file)
index 0000000..c418d7f
--- /dev/null
@@ -0,0 +1,29 @@
+BEGIN
+t
+9
+22
+26
+COMMIT
+BEGIN
+1
+2
+3
+COMMIT
+4
+features.big_parcels.the_geom SRID:0 TYPE:MULTIPOLYGON DIMS:2 
+5
+6
+features.big_signs.the_geom SRID:0 TYPE:MULTIPOINT DIMS:2 
+GeometryType(traffic_signs)|MULTIPOINT
+ST_GeometryType(traffic_signs)|ST_MultiPoint
+GeometryType(city_streets)|MULTILINESTRING
+ST_GeometryType(city_streets)|ST_MultiLinestring
+GeometryType(land_parcels)|MULTIPOLYGON
+ST_GeometryType(land_parcels)|ST_MultiPolygon
+GeometryType(big_signs)|MULTIPOINT
+ST_GeometryType(big_signs)|ST_MultiPoint
+GeometryType(big_streets)|MULTILINESTRING
+ST_GeometryType(big_streets)|ST_MultiLinestring
+GeometryType(big_parcels)|MULTIPOLYGON
+ST_GeometryType(big_parcels)|ST_MultiPolygon
+Topology 'city_data' dropped
index 4fc82d49c09b373747910af4eb7a459907155ce6..3ea1b6f8ab8243f31ffcd90876c9c9a9f0b82204 100644 (file)
@@ -2451,6 +2451,9 @@ LANGUAGE 'plpgsql' VOLATILE STRICT;
 --  TopoElement
 #include "sql/topoelement/topoelement_agg.sql"
 
+--  TopoGeometry
+#include "sql/topogeometry/type.sql"
+
 --  GML
 #include "sql/gml.sql"