]> granicus.if.org Git - postgis/commitdiff
Add ST_Count and ST_Sum functions that are fronts for the count and sum values of...
authorBborie Park <bkpark at ucdavis.edu>
Wed, 25 May 2011 18:28:14 +0000 (18:28 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Wed, 25 May 2011 18:28:14 +0000 (18:28 +0000)
Associated tickets are #985 (ST_Count) and #986 (ST_Sum)

git-svn-id: http://svn.osgeo.org/postgis/trunk@7246 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_pg/rtpostgis.sql.in.c
raster/test/regress/Makefile.in
raster/test/regress/rt_count.sql [new file with mode: 0644]
raster/test/regress/rt_count_expected [new file with mode: 0644]
raster/test/regress/rt_sum.sql [new file with mode: 0644]
raster/test/regress/rt_sum_expected [new file with mode: 0644]

index a6a21845946b102064775d616676064bb508bdc5..9d0ca23e6d7d9a301d3f38037bee747c41c1bc87 100644 (file)
@@ -458,6 +458,192 @@ CREATE OR REPLACE FUNCTION st_approxsummarystats(rastertable text, rastercolumn
        AS $$ SELECT count, sum, mean, stddev, min, max FROM _st_summarystats($1, $2, 1, TRUE, 0.1) $$
        LANGUAGE 'SQL' IMMUTABLE STRICT;
 
+-----------------------------------------------------------------------
+-- ST_Count and ST_ApproxCount
+-----------------------------------------------------------------------
+CREATE OR REPLACE FUNCTION st_count(rast raster, nband int, hasnodata boolean, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, $3, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rast raster, nband int, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rast raster, hasnodata boolean, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, 1, $2, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rast raster, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, 1, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rast raster, nband int, hasnodata boolean, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, $3, $4) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rast raster, nband int, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, TRUE, $3) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rast raster, hasnodata boolean, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, 1, $2, $3) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rast raster, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, 1, TRUE, $2) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rast raster, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, 1, TRUE, 0.1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, nband int, hasnodata boolean, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, $3, $4, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, nband int, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, $3, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, hasnodata boolean, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, 1, $3, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, 1, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, nband int, hasnodata boolean, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, $3, $4, $5) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, nband int, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, $3, TRUE, $4) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, hasnodata boolean, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, 1, $3, $4) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, sample_percent double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, 1, TRUE, $3) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_summarystats($1, $2, 1, TRUE, 0.1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+-----------------------------------------------------------------------
+-- ST_Sum and ST_ApproxSum
+-----------------------------------------------------------------------
+CREATE OR REPLACE FUNCTION st_sum(rast raster, nband int, hasnodata boolean, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rast raster, nband int, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rast raster, hasnodata boolean, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, 1, $2, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rast raster, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, 1, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rast raster, nband int, hasnodata boolean, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, $4) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rast raster, nband int, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, TRUE, $3) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rast raster, hasnodata boolean, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, 1, $2, $3) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rast raster, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, 1, TRUE, $2) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rast raster, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, 1, TRUE, 0.1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, nband int, hasnodata boolean, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, $4, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, nband int, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, hasnodata boolean, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, $3, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, TRUE, 1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, nband int, hasnodata boolean, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, $4, $5) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, nband int, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, TRUE, $4) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, hasnodata boolean, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, $3, $4) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, sample_percent double precision, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, TRUE, $3) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, OUT sum double precision)
+       RETURNS double precision
+       AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, TRUE, 0.1) $$
+       LANGUAGE 'SQL' IMMUTABLE STRICT;
+
 -----------------------------------------------------------------------
 -- ST_Mean and ST_ApproxMean
 -----------------------------------------------------------------------
index c9de18d9da6a3b853334d41114540051e159437a..5829db9287f8d75d8060cb1b6325ed684c34d23c 100644 (file)
@@ -68,6 +68,8 @@ TEST_BANDPROPS = \
        rt_band_properties.sql \
        rt_set_band_properties.sql \
        rt_summarystats.sql \
+       rt_count.sql \
+       rt_sum.sql \
        rt_mean.sql \
        rt_stddev.sql \
        rt_minmax.sql \
diff --git a/raster/test/regress/rt_count.sql b/raster/test/regress/rt_count.sql
new file mode 100644 (file)
index 0000000..e24960f
--- /dev/null
@@ -0,0 +1,78 @@
+SELECT ST_Count(
+       ST_SetValue(
+               ST_SetValue(
+                       ST_SetValue(
+                               ST_AddBand(
+                                       ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                       , 1, '64BF', 0, 0
+                               )
+                               , 1, 1, 1, -10
+                       )
+                       , 1, 5, 4, 0
+               )
+               , 1, 5, 5, 3.14159
+       )
+       , TRUE
+);
+SELECT count FROM ST_Count(
+       ST_SetValue(
+               ST_SetValue(
+                       ST_SetValue(
+                               ST_AddBand(
+                                       ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                       , 1, '64BF', 0, 0
+                               )
+                               , 1, 1, 1, -10
+                       )
+                       , 1, 5, 4, 0
+               )
+               , 1, 5, 5, 3.14159
+       )
+       , TRUE
+);
+SELECT count FROM ST_Count(
+       ST_SetValue(
+               ST_SetValue(
+                       ST_SetValue(
+                               ST_AddBand(
+                                       ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                       , 1, '64BF', 0, 0
+                               )
+                               , 1, 1, 1, -10
+                       )
+                       , 1, 5, 4, 0
+               )
+               , 1, 5, 5, 3.14159
+       )
+       , FALSE
+);
+BEGIN;
+CREATE TEMP TABLE test
+       ON COMMIT DROP AS
+       SELECT
+               rast.rast
+       FROM (
+               SELECT ST_SetValue(
+                       ST_SetValue(
+                               ST_SetValue(
+                                       ST_AddBand(
+                                               ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                               , 1, '64BF', 0, 0
+                                       )
+                                       , 1, 1, 1, -10
+                               )
+                               , 1, 5, 4, 0
+                       )
+                       , 1, 5, 5, 3.14159
+               ) AS rast
+       ) AS rast
+       FULL JOIN (
+               SELECT generate_series(1, 10) AS id
+       ) AS id
+               ON 1 = 1;
+SELECT count FROM ST_Count('test', 'rast', 1, TRUE);
+SELECT count FROM ST_Count('test', 'rast', 1, FALSE);
+SELECT count FROM ST_Count('test', 'rast', 1);
+SELECT count FROM ST_Count('test', 'rast');
+ROLLBACK;
+
diff --git a/raster/test/regress/rt_count_expected b/raster/test/regress/rt_count_expected
new file mode 100644 (file)
index 0000000..9d24877
--- /dev/null
@@ -0,0 +1,9 @@
+2
+2
+100
+BEGIN
+20
+1000
+20
+20
+COMMIT
diff --git a/raster/test/regress/rt_sum.sql b/raster/test/regress/rt_sum.sql
new file mode 100644 (file)
index 0000000..5a7873a
--- /dev/null
@@ -0,0 +1,78 @@
+SELECT round(ST_Sum(
+       ST_SetValue(
+               ST_SetValue(
+                       ST_SetValue(
+                               ST_AddBand(
+                                       ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                       , 1, '64BF', 0, 0
+                               )
+                               , 1, 1, 1, -10
+                       )
+                       , 1, 5, 4, 0
+               )
+               , 1, 5, 5, 3.14159
+       )
+       , TRUE
+)::numeric, 3);
+SELECT round(sum::numeric, 3) FROM ST_Sum(
+       ST_SetValue(
+               ST_SetValue(
+                       ST_SetValue(
+                               ST_AddBand(
+                                       ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                       , 1, '64BF', 0, 0
+                               )
+                               , 1, 1, 1, -10
+                       )
+                       , 1, 5, 4, 0
+               )
+               , 1, 5, 5, 3.14159
+       )
+       , TRUE
+);
+SELECT round(sum::numeric, 3) FROM ST_Sum(
+       ST_SetValue(
+               ST_SetValue(
+                       ST_SetValue(
+                               ST_AddBand(
+                                       ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                       , 1, '64BF', 0, 0
+                               )
+                               , 1, 1, 1, -10
+                       )
+                       , 1, 5, 4, 0
+               )
+               , 1, 5, 5, 3.14159
+       )
+       , FALSE
+);
+BEGIN;
+CREATE TEMP TABLE test
+       ON COMMIT DROP AS
+       SELECT
+               rast.rast
+       FROM (
+               SELECT ST_SetValue(
+                       ST_SetValue(
+                               ST_SetValue(
+                                       ST_AddBand(
+                                               ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1)
+                                               , 1, '64BF', 0, 0
+                                       )
+                                       , 1, 1, 1, -10
+                               )
+                               , 1, 5, 4, 0
+                       )
+                       , 1, 5, 5, 3.14159
+               ) AS rast
+       ) AS rast
+       FULL JOIN (
+               SELECT generate_series(1, 10) AS id
+       ) AS id
+               ON 1 = 1;
+SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast', 1, TRUE);
+SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast', 1, FALSE);
+SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast', 1);
+SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast');
+ROLLBACK;
+
diff --git a/raster/test/regress/rt_sum_expected b/raster/test/regress/rt_sum_expected
new file mode 100644 (file)
index 0000000..cdf1219
--- /dev/null
@@ -0,0 +1,9 @@
+-6.858
+-6.858
+-6.858
+BEGIN
+-6.858
+-6.858
+-6.858
+-6.858
+COMMIT