[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