[postgis-commits] svn - r3679 - in spike/wktraster/rt_pg: . test

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Tue Feb 10 04:23:46 PST 2009


Author: strk
Date: 2009-02-10 04:23:44 -0800 (Tue, 10 Feb 2009)
New Revision: 3679

Added:
   spike/wktraster/rt_pg/test/ops_expected
Modified:
   spike/wktraster/rt_pg/rtpostgis.sql.in.c
   spike/wktraster/rt_pg/test/Makefile.in
   spike/wktraster/rt_pg/test/bbox.sql
   spike/wktraster/rt_pg/test/ops.sql
Log:
Implement spatial operators, and tests for them


Modified: spike/wktraster/rt_pg/rtpostgis.sql.in.c
===================================================================
--- spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-02-10 11:25:51 UTC (rev 3678)
+++ spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-02-10 12:23:44 UTC (rev 3679)
@@ -63,6 +63,11 @@
 	AS 'MODULE_PATHNAME','RASTER_to_BOX2DFLOAT4'
 	LANGUAGE 'C' _IMMUTABLE_STRICT; 
 
+CREATEFUNCTION rt_raster_envelope(raster)
+	RETURNS GEOMETRY 
+	AS 'MODULE_PATHNAME','RASTER_envelope'
+	LANGUAGE 'C' _IMMUTABLE_STRICT; 
+
 -- 
 -- rt_MakeEmptyRaster( <width>, <height>, <ipx>, <ipy>,
 --                                        <scalex>, <scaley>,
@@ -77,7 +82,155 @@
 --  CASTS
 -------------------------------------------------------------------
 
-CREATE CAST (raster AS box2d) WITH FUNCTION rt_raster_to_box2d(raster) AS IMPLICIT;
+CREATE CAST (raster AS box2d)
+  WITH FUNCTION rt_raster_to_box2d(raster) AS IMPLICIT;
 
+CREATE CAST (raster AS geometry)
+  WITH FUNCTION rt_raster_envelope(raster) AS IMPLICIT;
+
+-------------------------------------------------------------------
+--  GiST index OPERATOR support functions 
+-------------------------------------------------------------------
+
+CREATEFUNCTION rt_overleft(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_overleft($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_overright(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_overright($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_left(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_left($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_right(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_right($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_overabove(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_overabove($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_overbelow(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_overbelow($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_above(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_above($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_below(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_below($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_same(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_same($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_contained(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_contained($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_contain(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_contain($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+CREATEFUNCTION rt_overlap(raster, raster)
+    RETURNS bool
+    AS 'select ST_geometry_overlap($1::geometry, $2::geometry)'
+    LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
+
+-------------------------------------------------------------------
+--  GiST index OPERATORs
+-------------------------------------------------------------------
+
+CREATE OPERATOR << (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_left,
+   COMMUTATOR = '>>',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR &< (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_overleft,
+   COMMUTATOR = '&>',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR <<| (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_below,
+   COMMUTATOR = '|>>',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR &<| (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_overbelow,
+   COMMUTATOR = '|&>',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR && (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_overlap,
+   COMMUTATOR = '&&',
+   RESTRICT = ST_postgis_gist_sel, JOIN = ST_postgis_gist_joinsel
+);
+
+CREATE OPERATOR &> (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_overright,
+   COMMUTATOR = '&<',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR >> (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_right,
+   COMMUTATOR = '<<',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR |&> (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_overabove,
+   COMMUTATOR = '&<|',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR |>> (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_above,
+   COMMUTATOR = '<<|',
+   RESTRICT = positionsel, JOIN = positionjoinsel
+);
+
+CREATE OPERATOR ~= (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_same,
+   COMMUTATOR = '~=', 
+   RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR @ (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_contained,
+   COMMUTATOR = '~',
+   RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR ~ (
+   LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_contain,
+   COMMUTATOR = '@',
+   RESTRICT = contsel, JOIN = contjoinsel
+);
+
+-------------------------------------------------------------------
+--  END
+-------------------------------------------------------------------
+
 -- COMMIT;
 

Modified: spike/wktraster/rt_pg/test/Makefile.in
===================================================================
--- spike/wktraster/rt_pg/test/Makefile.in	2009-02-10 11:25:51 UTC (rev 3678)
+++ spike/wktraster/rt_pg/test/Makefile.in	2009-02-10 12:23:44 UTC (rev 3679)
@@ -12,7 +12,7 @@
 
 POSTGIS_SRC=@POSTGIS_SRCDIR@
 
-TESTS=io.sql bbox.sql
+TESTS=io.sql bbox.sql ops.sql
 
 all: run_test
 

Modified: spike/wktraster/rt_pg/test/bbox.sql
===================================================================
--- spike/wktraster/rt_pg/test/bbox.sql	2009-02-10 11:25:51 UTC (rev 3678)
+++ spike/wktraster/rt_pg/test/bbox.sql	2009-02-10 12:23:44 UTC (rev 3679)
@@ -1,6 +1,6 @@
 CREATE TABLE rt_test_envelope (
         id numeric,
-	name text,
+        name text,
         rast raster,
         env box2d
     );

Modified: spike/wktraster/rt_pg/test/ops.sql
===================================================================
--- spike/wktraster/rt_pg/test/ops.sql	2009-02-10 11:25:51 UTC (rev 3678)
+++ spike/wktraster/rt_pg/test/ops.sql	2009-02-10 12:23:44 UTC (rev 3679)
@@ -33,9 +33,9 @@
     scaley = ((ST_ymax(extent)-ST_ymin(extent))/gridRows)/tileHeight;
 
     FOR y IN 0..gridRows-1 LOOP
-        ipy = y*scaley + (scaley/2);
+        ipy = y*scaley + (scaley/2) + ST_ymin(extent);
         FOR x IN 0..gridCols-1 LOOP
-            ipx = x*scalex + (scalex/2);
+            ipx = x*scalex + (scalex/2) + ST_xmin(extent);
             rec.x = x;
             rec.y = y;
             rec.tile = rt_MakeEmptyRaster(tileWidth, tileHeight, ipx, ipy,
@@ -50,65 +50,204 @@
 LANGUAGE 'plpgsql';
 
 -----------------------------------------------------------------------
--- Create a grid of 100x100 rasters
+-- Create a grid of 10x10 rasters on an extent of -100..100 both axis
+-- and another on the same extent with 3x3 tiles, to use for queries 
 -----------------------------------------------------------------------
 
-CREATE TABLE rt_test_grid as select * from makegrid(100, 100,
+CREATE TABLE rt_test_ops_grid as select * from makegrid(10, 10,
 	'BOX(-100 -100, 100 100)', 1, 1);
 
+CREATE TABLE rt_test_ops_query as select * from makegrid(3, 3,
+	'BOX(-100 -100, 100 100)', 1, 1);
 
+
 -----------------------------------------------------------------------
--- Test = operator
+-- Test &< operator (overleft)
 -----------------------------------------------------------------------
 
-SELECT x, y from rt_test_grid where tile &&
-		rt_MakeEmptyRaster(1, 1, 0.5, 0.5, 1, 1, 0, 0, -1);
+SELECT 'X &< query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile &< b.tile;
 
 -----------------------------------------------------------------------
--- Test &< operator
+-- Test &> operator (overright)
 -----------------------------------------------------------------------
 
------------------------------------------------------------------------
--- Test >& operator
------------------------------------------------------------------------
+SELECT 'X &> query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile &> b.tile;
 
 -----------------------------------------------------------------------
--- Test << operator
+-- Test << operator (left)
 -----------------------------------------------------------------------
 
+SELECT 'X << query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile << b.tile;
+
 -----------------------------------------------------------------------
--- Test >> operator
+-- Test >> operator (right)
 -----------------------------------------------------------------------
 
+SELECT 'X >> query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile >> b.tile;
+
 -----------------------------------------------------------------------
--- Test &<| operator
+-- Test &<| operator (overbelow)
 -----------------------------------------------------------------------
 
+SELECT 'X &<| query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile &<| b.tile;
+
 -----------------------------------------------------------------------
--- Test |&> operator
+-- Test |&> operator (overabove)
 -----------------------------------------------------------------------
 
+SELECT 'X |&> query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile |&> b.tile;
+
 -----------------------------------------------------------------------
--- Test <<| operator
+-- Test <<| operator (below)
 -----------------------------------------------------------------------
 
+SELECT 'X <<| query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile <<| b.tile;
+
 -----------------------------------------------------------------------
--- Test |>> operator
+-- Test |>> above
 -----------------------------------------------------------------------
 
+SELECT 'X |>> query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile |>> b.tile;
+
 -----------------------------------------------------------------------
--- Test ~= operator
+-- Test ~= operator (same)
 -----------------------------------------------------------------------
 
+SELECT 'X ~= query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile ~= b.tile;
+
+SELECT 'X ~= tile(7,7)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_grid b
+ WHERE b.x = 7 and b.y = 7
+ AND a.tile ~= b.tile;
+
 -----------------------------------------------------------------------
--- Test @ operator
+-- Test @ operator (contained by)
 -----------------------------------------------------------------------
 
+SELECT 'X @ query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile @ b.tile;
+
 -----------------------------------------------------------------------
--- Test ~ operator
+-- Test ~ operator (contains)
 -----------------------------------------------------------------------
 
+SELECT 'query(1,1) ~ X' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND b.tile ~ a.tile;
+
 -----------------------------------------------------------------------
 -- Test && operator
 -----------------------------------------------------------------------
 
+SELECT 'X && query(1,1)' as op,
+        count(a.y),
+        min(a.x) as xmin,
+        max(a.x) as xmax,
+        min(a.y) as ymin,
+        max(a.y) as ymax,
+        extent(a.tile)
+ FROM rt_test_ops_grid a, rt_test_ops_query b
+ WHERE b.x = 1 and b.y = 1
+ AND a.tile && b.tile;

Added: spike/wktraster/rt_pg/test/ops_expected
===================================================================
--- spike/wktraster/rt_pg/test/ops_expected	2009-02-10 11:25:51 UTC (rev 3678)
+++ spike/wktraster/rt_pg/test/ops_expected	2009-02-10 12:23:44 UTC (rev 3679)
@@ -0,0 +1,15 @@
+SELECT
+SELECT
+X &< query(1,1)|60|0|5|0|9|BOX(-100 -100,20 100)
+X &> query(1,1)|60|4|9|0|9|BOX(-20 -100,100 100)
+X << query(1,1)|30|0|2|0|9|BOX(-100 -100,-40 100)
+X >> query(1,1)|30|7|9|0|9|BOX(40 -100,100 100)
+X &<| query(1,1)|60|0|9|0|5|BOX(-100 -100,100 20)
+X |&> query(1,1)|60|0|9|4|9|BOX(-100 -20,100 100)
+X <<| query(1,1)|30|0|9|0|2|BOX(-100 -100,100 -40)
+X |>> query(1,1)|30|0|9|7|9|BOX(-100 40,100 100)
+X ~= query(1,1)|0|||||
+X ~= tile(7,7)|1|7|7|7|7|BOX(40 40,60 60)
+X @ query(1,1)|4|4|5|4|5|BOX(-20 -20,20 20)
+query(1,1) ~ X|4|4|5|4|5|BOX(-20 -20,20 20)
+X && query(1,1)|16|3|6|3|6|BOX(-40 -40,40 40)



More information about the postgis-commits mailing list