From: Pierre Racine Date: Thu, 1 Mar 2012 16:47:18 +0000 (+0000) Subject: Fix for ticket #1635. Added explicit ~ and && operators on raster and geometry. X-Git-Tag: 2.0.0beta2~55 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e15f24052cc912a4622f1ff67d4123809f308809;p=postgis Fix for ticket #1635. Added explicit ~ and && operators on raster and geometry. git-svn-id: http://svn.osgeo.org/postgis/trunk@9372 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/raster/rt_pg/rtpostgis.sql.in.c b/raster/rt_pg/rtpostgis.sql.in.c index 6721e29dc..24aed350c 100644 --- a/raster/rt_pg/rtpostgis.sql.in.c +++ b/raster/rt_pg/rtpostgis.sql.in.c @@ -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 ----------------------------------------------------------------------- diff --git a/raster/test/regress/rt_contain.sql b/raster/test/regress/rt_contain.sql index d705492dc..d9a3755cb 100644 --- a/raster/test/regress/rt_contain.sql +++ b/raster/test/regress/rt_contain.sql @@ -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; diff --git a/raster/test/regress/rt_contain_expected b/raster/test/regress/rt_contain_expected index 354f3a751..697b93d2a 100644 --- a/raster/test/regress/rt_contain_expected +++ b/raster/test/regress/rt_contain_expected @@ -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) diff --git a/raster/test/regress/rt_overlap.sql b/raster/test/regress/rt_overlap.sql index 52cc5602d..cc15b7496 100644 --- a/raster/test/regress/rt_overlap.sql +++ b/raster/test/regress/rt_overlap.sql @@ -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 diff --git a/raster/test/regress/rt_overlap_expected b/raster/test/regress/rt_overlap_expected index 807742d4e..bcc3f8bee 100644 --- a/raster/test/regress/rt_overlap_expected +++ b/raster/test/regress/rt_overlap_expected @@ -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)