]> granicus.if.org Git - postgis/commitdiff
Fix for ticket #1635. Added explicit ~ and && operators on raster and geometry.
authorPierre Racine <Pierre.Racine@sbf.ulaval.ca>
Thu, 1 Mar 2012 16:47:18 +0000 (16:47 +0000)
committerPierre Racine <Pierre.Racine@sbf.ulaval.ca>
Thu, 1 Mar 2012 16:47:18 +0000 (16:47 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@9372 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_pg/rtpostgis.sql.in.c
raster/test/regress/rt_contain.sql
raster/test/regress/rt_contain_expected
raster/test/regress/rt_overlap.sql
raster/test/regress/rt_overlap_expected

index 6721e29dc383d2f40c6f232c11c5accb7962b4ab..24aed350cd688f66f81eee082cb0877019128333 100644 (file)
@@ -2454,7 +2454,7 @@ CREATE OR REPLACE FUNCTION st_pixelaspolygon(rast raster, x integer, y integer)
 
 -----------------------------------------------------------------------
 -- ST_PixelAsPolygons
--- Return all the pixels of a raster as a geomval record
+-- Return all the pixels of a raster as a geom, val, x, y record
 -- Should be called like this:
 -- SELECT (gv).geom, (gv).val FROM (SELECT ST_PixelAsPolygons(rast) gv FROM mytable) foo
 -----------------------------------------------------------------------
@@ -2797,7 +2797,7 @@ CREATE CAST (raster AS bytea)
 ------------------------------------------------------------------------------
 --  GiST index OPERATOR support functions
 ------------------------------------------------------------------------------
-
+-- raster/raster functions
 CREATE OR REPLACE FUNCTION raster_overleft(raster, raster)
     RETURNS bool
     AS 'select $1::geometry &< $2::geometry'
@@ -2858,10 +2858,32 @@ CREATE OR REPLACE FUNCTION raster_overlap(raster, raster)
     AS 'select $1::geometry && $2::geometry'
     LANGUAGE 'SQL' IMMUTABLE STRICT;
 
+-- raster/geometry functions
+CREATE OR REPLACE FUNCTION raster_geometry_contain(raster, geometry)
+    RETURNS bool
+    AS 'select $1::geometry ~ $2'
+    LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION raster_geometry_overlap(raster, geometry)
+    RETURNS bool
+    AS 'select $1::geometry && $2'
+    LANGUAGE 'SQL' IMMUTABLE STRICT;
+    
+-- geometry/raster functions
+CREATE OR REPLACE FUNCTION geometry_raster_contain(geometry, raster)
+    RETURNS bool
+    AS 'select $1 ~ $2::geometry'
+    LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION geometry_raster_overlap(geometry, raster)
+    RETURNS bool
+    AS 'select $1 && $2::geometry'
+    LANGUAGE 'SQL' IMMUTABLE STRICT;
+    
 ------------------------------------------------------------------------------
 --  GiST index OPERATORs
 ------------------------------------------------------------------------------
-
+-- raster/raster operators
 CREATE OPERATOR << (
     LEFTARG = raster, RIGHTARG = raster, PROCEDURE = raster_left,
     COMMUTATOR = '>>',
@@ -2934,6 +2956,32 @@ CREATE OPERATOR ~ (
     RESTRICT = contsel, JOIN = contjoinsel
     );
 
+-- raster/geometry operators
+CREATE OPERATOR ~ (
+    LEFTARG = raster, RIGHTARG = geometry, PROCEDURE = raster_geometry_contain,
+    COMMUTATOR = '@',
+    RESTRICT = contsel, JOIN = contjoinsel
+    );
+    
+CREATE OPERATOR && (
+    LEFTARG = raster, RIGHTARG = geometry, PROCEDURE = raster_geometry_overlap,
+    COMMUTATOR = '&&',
+    RESTRICT = contsel, JOIN = contjoinsel
+    );
+
+-- geometry/raster operators
+CREATE OPERATOR ~ (
+    LEFTARG = geometry, RIGHTARG = raster, PROCEDURE = geometry_raster_contain,
+    COMMUTATOR = '@',
+    RESTRICT = contsel, JOIN = contjoinsel
+    );
+    
+CREATE OPERATOR && (
+    LEFTARG = geometry, RIGHTARG = raster, PROCEDURE = geometry_raster_overlap,
+    COMMUTATOR = '&&',
+    RESTRICT = contsel, JOIN = contjoinsel
+    );
+
 -----------------------------------------------------------------------
 -- Raster/Raster Spatial Relationship
 -----------------------------------------------------------------------
index d705492dc44913bc44ebd407b10c45988d755bcc..d9a3755cb51ecb208fd75f5a11908ed836e73300 100644 (file)
@@ -22,8 +22,38 @@ FROM rt_gist_grid_test a, rt_gist_query_test b
 WHERE b.x = 1 and b.y = 1
     AND raster_contain(b.tile, a.tile);
 
+-------------------------------------------------------------------
+-- raster_geometry_contain
 -----------------------------------------------------------------------
--- Test ~ operator (contains)
+
+SELECT 'raster_geometry_contain(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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND raster_geometry_contain(b.tile, a.tile::geometry);
+
+-------------------------------------------------------------------
+-- geometry_raster_contain
+-----------------------------------------------------------------------
+
+SELECT 'geometry_raster_contain(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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND geometry_raster_contain(b.tile::geometry, a.tile);
+
+-----------------------------------------------------------------------
+-- Test ~ operator (raster contains raster)
 -----------------------------------------------------------------------
 
 SELECT 'query(1,1) ~ X' as op,
@@ -36,3 +66,33 @@ SELECT 'query(1,1) ~ X' as op,
 FROM rt_gist_grid_test a, rt_gist_query_test b
 WHERE b.x = 1 and b.y = 1
     AND b.tile ~ a.tile;
+
+-----------------------------------------------------------------------
+-- Test ~ operator (raster contains geometry)
+-----------------------------------------------------------------------
+
+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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND b.tile ~ a.tile::geometry;
+
+-----------------------------------------------------------------------
+-- Test ~ operator (geometry contains raster )
+-----------------------------------------------------------------------
+
+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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND b.tile::geometry ~ a.tile;
index 354f3a7513ee523b117310bd522e0fe8f2112aaf..697b93d2af623ff16014c8ae75ba660390ad4ac5 100644 (file)
@@ -1,2 +1,6 @@
 raster_contain(query(1,1), X)|4|4|5|4|5|BOX(-20 -20,20 20)
+raster_geometry_contain(query(1,1), X)|4|4|5|4|5|BOX(-20 -20,20 20)
+geometry_raster_contain(query(1,1), X)|4|4|5|4|5|BOX(-20 -20,20 20)
+query(1,1) ~ X|4|4|5|4|5|BOX(-20 -20,20 20)
+query(1,1) ~ X|4|4|5|4|5|BOX(-20 -20,20 20)
 query(1,1) ~ X|4|4|5|4|5|BOX(-20 -20,20 20)
index 52cc5602d1ddd768a6a301820f278118ea4130a8..cc15b7496267ea6ea4c408c9e5b869b1d57369ef 100644 (file)
@@ -22,6 +22,36 @@ FROM rt_gist_grid_test a, rt_gist_query_test b
 WHERE b.x = 1 and b.y = 1
     AND raster_overlap(a.tile, b.tile);
 
+-------------------------------------------------------------------
+-- raster_geometry_overlap
+-----------------------------------------------------------------------
+
+SELECT 'raster_geometry_overlap(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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND raster_geometry_overlap(a.tile, b.tile::geometry);
+
+-------------------------------------------------------------------
+-- geometry_raster_overlap
+-----------------------------------------------------------------------
+
+SELECT 'geometry_raster_overlap(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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND geometry_raster_overlap(a.tile::geometry, b.tile);
+
 -----------------------------------------------------------------------
 -- Test && operator (overlap)
 -----------------------------------------------------------------------
@@ -36,3 +66,33 @@ SELECT 'X && query(1,1)' as op,
 FROM rt_gist_grid_test a, rt_gist_query_test b
 WHERE b.x = 1 and b.y = 1
     AND a.tile && b.tile;
+
+-----------------------------------------------------------------------
+-- Test && operator (raster overlap geometry)
+-----------------------------------------------------------------------
+
+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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND a.tile && b.tile::geometry;
+
+-----------------------------------------------------------------------
+-- Test && operator (geometry overlap raster)
+-----------------------------------------------------------------------
+
+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,
+        st_extent(a.tile::geometry)
+FROM rt_gist_grid_test a, rt_gist_query_test b
+WHERE b.x = 1 and b.y = 1
+    AND a.tile::geometry && b.tile;
\ No newline at end of file
index 807742d4ec22dc6d55fd158be9f74a65680858d8..bcc3f8bee8069803d20f035f7b5beef45b3a0484 100644 (file)
@@ -1,2 +1,6 @@
 raster_overlap(X, query(1,1))|16|3|6|3|6|BOX(-40 -40,40 40)
+raster_geometry_overlap(X, query(1,1))|16|3|6|3|6|BOX(-40 -40,40 40)
+geometry_raster_overlap(X, query(1,1))|16|3|6|3|6|BOX(-40 -40,40 40)
+X && query(1,1)|16|3|6|3|6|BOX(-40 -40,40 40)
+X && query(1,1)|16|3|6|3|6|BOX(-40 -40,40 40)
 X && query(1,1)|16|3|6|3|6|BOX(-40 -40,40 40)