-----------------------------------------------------------------------
-- 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
-----------------------------------------------------------------------
------------------------------------------------------------------------------
-- GiST index OPERATOR support functions
------------------------------------------------------------------------------
-
+-- raster/raster functions
CREATE OR REPLACE FUNCTION raster_overleft(raster, raster)
RETURNS bool
AS 'select $1::geometry &< $2::geometry'
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 = '>>',
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
-----------------------------------------------------------------------
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,
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;
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)
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)
-----------------------------------------------------------------------
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
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)