]> granicus.if.org Git - postgis/commitdiff
Addition of ST_ValuePercent, sibling of ST_ValueCount. This function provides the...
authorBborie Park <bkpark at ucdavis.edu>
Thu, 26 May 2011 20:04:12 +0000 (20:04 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Thu, 26 May 2011 20:04:12 +0000 (20:04 +0000)
Assocated ticket is #990

Also specified STRICT for functions with "searchvalue" (the singular) argument.

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

raster/rt_core/rt_api.c
raster/rt_pg/rt_pg.c
raster/rt_pg/rtpostgis.sql.in.c
raster/test/core/testapi.c
raster/test/regress/Makefile.in
raster/test/regress/rt_valuecount.sql
raster/test/regress/rt_valuecount_expected
raster/test/regress/rt_valuepercent.sql [new file with mode: 0644]
raster/test/regress/rt_valuepercent_expected [new file with mode: 0644]

index d3a9ec19d5751f1ce525ca9f425c7b6138e810f5..13887436dc41bb95eb57eadd47062471efbb556b 100644 (file)
@@ -2145,7 +2145,7 @@ rt_band_get_quantiles(rt_bandstats stats,
 struct rt_valuecount_t {
        double value;
        uint32_t count;
-       double proportion;
+       double percent;
 };
 
 /**
@@ -2276,7 +2276,7 @@ rt_band_get_value_count(rt_band band, int hasnodata,
 
                for (i = 0; i < search_values_count; i++) {
                        vcnts[i].count = 0;
-                       vcnts[i].proportion = 0;
+                       vcnts[i].percent = 0;
                        if (!doround)
                                vcnts[i].value = search_values[i];
                        else
@@ -2307,7 +2307,7 @@ rt_band_get_value_count(rt_band band, int hasnodata,
                                                continue;
 
                                        vcnts[i].count = band->width * band->height;
-                                       vcnts->proportion = 1.0;
+                                       vcnts->percent = 1.0;
                                }
 
                                *rtn_count = vcnts_count;
@@ -2323,7 +2323,7 @@ rt_band_get_value_count(rt_band band, int hasnodata,
 
                                vcnts->value = nodata;
                                vcnts->count = band->width * band->height;
-                               vcnts->proportion = 1.0;
+                               vcnts->percent = 1.0;
 
                                *rtn_count = 1;
                        }
@@ -2383,7 +2383,7 @@ rt_band_get_value_count(rt_band band, int hasnodata,
 
                                vcnts[vcnts_count].value = rpxlval;
                                vcnts[vcnts_count].count = 1;
-                               vcnts[vcnts_count].proportion = 0;
+                               vcnts[vcnts_count].percent = 0;
                                RASTER_DEBUGF(5, "(value, count) => (%0.6f, %d)", vcnts[vcnts_count].value, vcnts[vcnts_count].count);
                                vcnts_count++;
                        }
@@ -2397,7 +2397,7 @@ rt_band_get_value_count(rt_band band, int hasnodata,
 #endif
 
        for (i = 0; i < vcnts_count; i++) {
-               vcnts[i].proportion = (double) vcnts[i].count / total;
+               vcnts[i].percent = (double) vcnts[i].count / total;
                RASTER_DEBUGF(5, "(value, count) => (%0.6f, %d)", vcnts[i].value, vcnts[i].count);
        }
 
index aa1c4eb6a086a7716e7eaa88bef4f670ddcb0b80..a3229e6cdb09b705911103112a6c37553d1a7211 100644 (file)
@@ -3662,7 +3662,7 @@ Datum RASTER_quantile(PG_FUNCTION_ARGS)
 struct rt_valuecount_t {
        double value;
        uint32_t count;
-       double proportion;
+       double percent;
 };
 
 /* get counts of values */
@@ -3879,7 +3879,7 @@ Datum RASTER_valueCount(PG_FUNCTION_ARGS) {
                        values[2],
                        sizeof(char) * (MAX_DBL_CHARLEN + 1),
                        "%f",
-                       vcnts2[call_cntr].proportion
+                       vcnts2[call_cntr].percent
                );
 
                /* build a tuple */
index 93d888f7fb460488200420d12c5959ab15c46ed5..60a5de8be8716faa734c899548c2a9d9e3aac3e4 100644 (file)
@@ -1164,15 +1164,16 @@ CREATE OR REPLACE FUNCTION st_approxquantile(rast raster, hasnodata boolean, qua
        LANGUAGE 'sql' IMMUTABLE STRICT;
 
 -----------------------------------------------------------------------
--- ST_ValueCount
+-- ST_ValueCount and ST_ValuePercent
 -----------------------------------------------------------------------
 CREATE TYPE valuecount AS (
        value double precision,
        count integer,
-       proportion double precision
+       percent double precision
 );
 
--- None of the functions can be strict as "searchvalues" and "roundto" can be NULL
+-- None of the "searchvaleus" functions can be strict as "searchvalues" and "roundto" can be NULL
+-- Allowing "searchvalues" to be NULL instructs the function to count all values
 
 CREATE OR REPLACE FUNCTION _st_valuecount(rast raster, nband integer, hasnodata boolean, searchvalues double precision[], roundto double precision)
        RETURNS SETOF valuecount
@@ -1204,30 +1205,30 @@ CREATE OR REPLACE FUNCTION st_valuecount(rast raster, searchvalues double precis
        AS $$ SELECT value, count FROM _st_valuecount($1, 1, TRUE, $2, 0) $$
        LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rast raster, nband integer, hasnodata boolean, searchvalue double precision, roundto double precision, OUT value double precision, OUT count integer)
-       RETURNS record
-       AS $$ SELECT value, count FROM _st_valuecount($1, $2, $3, ARRAY[$4]::double precision[], $5) $$
-       LANGUAGE 'sql' IMMUTABLE;
+CREATE OR REPLACE FUNCTION st_valuecount(rast raster, nband integer, hasnodata boolean, searchvalue double precision, roundto double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_valuecount($1, $2, $3, ARRAY[$4]::double precision[], $5) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rast raster, nband integer, searchvalue double precision, roundto double precision, OUT value double precision, OUT count integer)
-       RETURNS record
-       AS $$ SELECT value, count FROM _st_valuecount($1, $2, TRUE, ARRAY[$3]::double precision[], $4) $$
-       LANGUAGE 'sql' IMMUTABLE;
+CREATE OR REPLACE FUNCTION st_valuecount(rast raster, nband integer, searchvalue double precision, roundto double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_valuecount($1, $2, TRUE, ARRAY[$3]::double precision[], $4) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rast raster, nband integer, searchvalue double precision, OUT value double precision, OUT count integer)
-       RETURNS record
-       AS $$ SELECT value, count FROM _st_valuecount($1, $2, TRUE, ARRAY[$3]::double precision[], 0) $$
-       LANGUAGE 'sql' IMMUTABLE;
+CREATE OR REPLACE FUNCTION st_valuecount(rast raster, nband integer, searchvalue double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_valuecount($1, $2, TRUE, ARRAY[$3]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rast raster, searchvalue double precision, roundto double precision, OUT value double precision, OUT count integer)
-       RETURNS record
-       AS $$ SELECT value, count FROM _st_valuecount($1, 1, TRUE, ARRAY[$2]::double precision[], $3) $$
-       LANGUAGE 'sql' IMMUTABLE;
+CREATE OR REPLACE FUNCTION st_valuecount(rast raster, searchvalue double precision, roundto double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_valuecount($1, 1, TRUE, ARRAY[$2]::double precision[], $3) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rast raster, searchvalue double precision, OUT value double precision, OUT count integer)
-       RETURNS record
-       AS $$ SELECT value, count FROM _st_valuecount($1, 1, TRUE, ARRAY[$2]::double precision[], 0) $$
-       LANGUAGE 'sql' IMMUTABLE;
+CREATE OR REPLACE FUNCTION st_valuecount(rast raster, searchvalue double precision, OUT count integer)
+       RETURNS integer
+       AS $$ SELECT count FROM _st_valuecount($1, 1, TRUE, ARRAY[$2]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
 
 CREATE OR REPLACE FUNCTION _st_valuecount(rastertable text, rastercolumn text, nband integer, hasnodata boolean, searchvalues double precision[], roundto double precision)
        RETURNS SETOF valuecount
@@ -1320,31 +1321,147 @@ CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, se
        AS $$ SELECT value, count FROM st_valuecount($1, $2, 1, TRUE, $3, 0) $$
        LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, nband integer, hasnodata boolean, searchvalue double precision, roundto double precision, OUT value double precision, OUT count bigint)
-       RETURNS record
-       AS $$ SELECT value, count FROM st_valuecount($1, $2, $3, $4, ARRAY[$5]::double precision[], $6) $$
+CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, nband integer, hasnodata boolean, searchvalue double precision, roundto double precision, OUT count bigint)
+       RETURNS bigint
+       AS $$ SELECT count FROM st_valuecount($1, $2, $3, $4, ARRAY[$5]::double precision[], $6) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, nband integer, searchvalue double precision, roundto double precision, OUT count bigint)
+       RETURNS bigint
+       AS $$ SELECT count FROM st_valuecount($1, $2, $3, TRUE, ARRAY[$4]::double precision[], $5) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, nband integer, searchvalue double precision, OUT count bigint)
+       RETURNS bigint
+       AS $$ SELECT count FROM st_valuecount($1, $2, $3, TRUE, ARRAY[$4]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, searchvalue double precision, roundto double precision, OUT count bigint)
+       RETURNS bigint
+       AS $$ SELECT count FROM st_valuecount($1, $2, 1, TRUE, ARRAY[$3]::double precision[], $4) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, searchvalue double precision, OUT count bigint)
+       RETURNS bigint
+       AS $$ SELECT count FROM st_valuecount($1, $2, 1, TRUE, ARRAY[$3]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, nband integer, hasnodata boolean, searchvalues double precision[], roundto double precision, OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM _st_valuecount($1, $2, $3, $4, $5) $$
        LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, nband integer, searchvalue double precision, roundto double precision, OUT value double precision, OUT count bigint)
-       RETURNS record
-       AS $$ SELECT value, count FROM st_valuecount($1, $2, $3, TRUE, ARRAY[$4]::double precision[], $5) $$
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, nband integer, searchvalues double precision[], roundto double precision, OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM _st_valuecount($1, $2, TRUE, $3, $4) $$
        LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, nband integer, searchvalue double precision, OUT value double precision, OUT count bigint)
-       RETURNS record
-       AS $$ SELECT value, count FROM st_valuecount($1, $2, $3, TRUE, ARRAY[$4]::double precision[], 0) $$
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, nband integer, searchvalues double precision[], OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM _st_valuecount($1, $2, TRUE, $3, 0) $$
        LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, searchvalue double precision, roundto double precision, OUT value double precision, OUT count bigint)
-       RETURNS record
-       AS $$ SELECT value, count FROM st_valuecount($1, $2, 1, TRUE, ARRAY[$3]::double precision[], $4) $$
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, searchvalues double precision[], roundto double precision, OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM _st_valuecount($1, 1, TRUE, $2, $3) $$
        LANGUAGE 'sql' IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION st_valuecount(rastertable text, rastercolumn text, searchvalue double precision, OUT value double precision, OUT count bigint)
-       RETURNS record
-       AS $$ SELECT value, count FROM st_valuecount($1, $2, 1, TRUE, ARRAY[$3]::double precision[], 0) $$
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, searchvalues double precision[], OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM _st_valuecount($1, 1, TRUE, $2, 0) $$
        LANGUAGE 'sql' IMMUTABLE;
 
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, nband integer, hasnodata boolean, searchvalue double precision, roundto double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM _st_valuecount($1, $2, $3, ARRAY[$4]::double precision[], $5) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, nband integer, searchvalue double precision, roundto double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM _st_valuecount($1, $2, TRUE, ARRAY[$3]::double precision[], $4) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, nband integer, searchvalue double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM _st_valuecount($1, $2, TRUE, ARRAY[$3]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, searchvalue double precision, roundto double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM _st_valuecount($1, 1, TRUE, ARRAY[$2]::double precision[], $3) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rast raster, searchvalue double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM _st_valuecount($1, 1, TRUE, ARRAY[$2]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, nband integer, hasnodata boolean, searchvalues double precision[], roundto double precision, OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$
+               SELECT
+                       value,
+                       CASE
+                               WHEN sum(count) != 0
+                                       THEN sum(count) / sum(
+                                               CASE
+                                                       WHEN percent != 0
+                                                               THEN (count / percent)
+                                                       ELSE 0
+                                               END
+                                       )
+                               ELSE 0
+                       END AS percent
+               FROM _st_valuecount($1, $2, $3, $4, $5, $6)
+               GROUP BY 1
+               ORDER BY 1
+       $$ LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, nband integer, searchvalues double precision[], roundto double precision, OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM st_valuepercent($1, $2, $3, TRUE, $4, $5) $$
+       LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, nband integer, searchvalues double precision[], OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM st_valuepercent($1, $2, $3, TRUE, $4, 0) $$
+       LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, searchvalues double precision[], roundto double precision, OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM st_valuepercent($1, $2, 1, TRUE, $3, $4) $$
+       LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, searchvalues double precision[], OUT value double precision, OUT percent double precision)
+       RETURNS SETOF record
+       AS $$ SELECT value, percent FROM st_valuepercent($1, $2, 1, TRUE, $3, 0) $$
+       LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, nband integer, hasnodata boolean, searchvalue double precision, roundto double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM st_valuepercent($1, $2, $3, $4, ARRAY[$5]::double precision[], $6) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, nband integer, searchvalue double precision, roundto double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM st_valuepercent($1, $2, $3, TRUE, ARRAY[$4]::double precision[], $5) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, nband integer, searchvalue double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM st_valuepercent($1, $2, $3, TRUE, ARRAY[$4]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, searchvalue double precision, roundto double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM st_valuepercent($1, $2, 1, TRUE, ARRAY[$3]::double precision[], $4) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION st_valuepercent(rastertable text, rastercolumn text, searchvalue double precision, OUT percent double precision)
+       RETURNS double precision
+       AS $$ SELECT percent FROM st_valuepercent($1, $2, 1, TRUE, ARRAY[$3]::double precision[], 0) $$
+       LANGUAGE 'sql' IMMUTABLE STRICT;
+
 -----------------------------------------------------------------------
 -- ST_Reclass
 -----------------------------------------------------------------------
index 8cff63f95a375f8e5172067b3f187e33cc0cfe78..c47bf5a2d4212332205ee50cc0c56d3bb2d776fb 100644 (file)
@@ -1308,7 +1308,7 @@ static void testRasterToGDAL(rt_raster raster) {
 struct rt_valuecount_t {
        double value;
        uint32_t count;
-       double proportion;
+       double percent;
 };
 static void testValueCount() {
        rt_valuecount vcnts = NULL;
index ce9a7322fe7571f845da05296f731d9dfd418b0e..5d7731095c322153e9ac73011dc7153701b0bb0f 100644 (file)
@@ -76,6 +76,7 @@ TEST_BANDPROPS = \
        rt_histogram.sql \
        rt_quantile.sql \
        rt_valuecount.sql \
+       rt_valuepercent.sql \
        $(NULL)
 
 TEST_PIXEL = \
index 85018f12ed738684568927a50d6a9726d8992216..ad5daa6f9c68b21b9d9bc43c32b503c37ea26a6b 100644 (file)
@@ -118,7 +118,7 @@ SELECT round(value::numeric, 3), count FROM st_valuecount(
                , 1, 5, 5, 3.14159
        )
 , ARRAY[-10, 3]);
-SELECT round(value::numeric, 3), count FROM st_valuecount(
+SELECT count FROM st_valuecount(
        ST_SetValue(
                ST_SetValue(
                        ST_SetValue(
@@ -133,7 +133,7 @@ SELECT round(value::numeric, 3), count FROM st_valuecount(
                , 1, 5, 5, 3.14159
        )
 , 1, TRUE, 3.14, 0.19);
-SELECT round(value::numeric, 3), count FROM st_valuecount(
+SELECT count FROM st_valuecount(
        ST_SetValue(
                ST_SetValue(
                        ST_SetValue(
@@ -148,7 +148,7 @@ SELECT round(value::numeric, 3), count FROM st_valuecount(
                , 1, 5, 5, 3.14159
        )
 , 1, FALSE, 3.14, 0.01);
-SELECT round(value::numeric, 3), count FROM st_valuecount(
+SELECT count FROM st_valuecount(
        ST_SetValue(
                ST_SetValue(
                        ST_SetValue(
@@ -163,7 +163,7 @@ SELECT round(value::numeric, 3), count FROM st_valuecount(
                , 1, 5, 5, 3.14159
        )
 , 1, -10, 0.1);
-SELECT round(value::numeric, 3), count FROM st_valuecount(
+SELECT count FROM st_valuecount(
        ST_SetValue(
                ST_SetValue(
                        ST_SetValue(
@@ -178,7 +178,7 @@ SELECT round(value::numeric, 3), count FROM st_valuecount(
                , 1, 5, 5, 3.14159
        )
 , 1, -10);
-SELECT round(value::numeric, 3), count FROM st_valuecount(
+SELECT count FROM st_valuecount(
        ST_SetValue(
                ST_SetValue(
                        ST_SetValue(
@@ -193,7 +193,7 @@ SELECT round(value::numeric, 3), count FROM st_valuecount(
                , 1, 5, 5, 3.14159
        )
 , -10., 10);
-SELECT round(value::numeric, 3), count FROM st_valuecount(
+SELECT count FROM st_valuecount(
        ST_SetValue(
                ST_SetValue(
                        ST_SetValue(
@@ -238,9 +238,9 @@ SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', 1, ARR
 SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', NULL::double precision[], 0.1);
 SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', ARRAY[-1, 3.1]::double precision[], 0.1);
 
-SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', 1, TRUE, NULL::double precision, 0);
-SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', 1, 3.14, 1);
-SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', 1, -1);
-SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', 3.1, 0.1);
-SELECT round(value::numeric, 3), count FROM st_valuecount('test', 'rast', -9);
+SELECT count FROM st_valuecount('test', 'rast', 1, TRUE, NULL::double precision, 0);
+SELECT count FROM st_valuecount('test', 'rast', 1, 3.14, 1);
+SELECT count FROM st_valuecount('test', 'rast', 1, -1);
+SELECT count FROM st_valuecount('test', 'rast', 3.1, 0.1);
+SELECT count FROM st_valuecount('test', 'rast', -9);
 ROLLBACK;
index 48751d8ab193ef745e7c363cccf23efede1911eb..86f0d88e588ee857aa477f4ac961338c068a70e3 100644 (file)
 -10.000|1
 -10.000|1
 3.000|0
-3.140|1
-3.140|1
--10.000|1
--10.000|1
--10.000|1
-3.142|1
+1
+1
+1
+1
+1
+1
 BEGIN
 -10.000|10
 0.000|980
@@ -28,9 +28,8 @@ BEGIN
 3.100|10
 -1.000|0
 3.100|10
--10.000|10
-3.000|10
--1.000|0
-3.100|10
--9.000|0
+10
+0
+10
+0
 COMMIT
diff --git a/raster/test/regress/rt_valuepercent.sql b/raster/test/regress/rt_valuepercent.sql
new file mode 100644 (file)
index 0000000..1cf0d66
--- /dev/null
@@ -0,0 +1,246 @@
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, TRUE, ARRAY[]::double precision[], 0);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, TRUE, NULL::double precision[], 0);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, FALSE, NULL::double precision[], 0);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, TRUE, NULL::double precision[], 0.1);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, ARRAY[3.1], 0.1);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, ARRAY[-10]);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, ARRAY[-10], 0);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, ARRAY[-10, 3]);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, TRUE, 3.14, 0.19);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, FALSE, 3.14, 0.01);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, -10, 0.1);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 1, -10);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, -10., 10);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent(
+       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
+       )
+, 3.14159);
+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(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 1, FALSE, NULL::double precision[], 0);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 1, ARRAY[-10]::double precision[], 0);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 1, ARRAY[1]::double precision[]);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', NULL::double precision[], 0.1);
+SELECT round(value::numeric, 3), round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', ARRAY[-1, 3.1]::double precision[], 0.1);
+
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 1, TRUE, NULL::double precision, 0);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 1, 3.14, 1);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 1, -1);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', 3.1, 0.1);
+SELECT round(percent::numeric, 3) FROM ST_ValuePercent('test', 'rast', -9);
+ROLLBACK;
diff --git a/raster/test/regress/rt_valuepercent_expected b/raster/test/regress/rt_valuepercent_expected
new file mode 100644 (file)
index 0000000..1a8495f
--- /dev/null
@@ -0,0 +1,35 @@
+-10.000|0.500
+3.142|0.500
+-10.000|0.500
+3.142|0.500
+-10.000|0.010
+0.000|0.980
+3.142|0.010
+-10.000|0.500
+3.100|0.500
+3.100|0.500
+-10.000|0.500
+-10.000|0.500
+-10.000|0.500
+3.000|0.000
+0.500
+0.010
+0.500
+0.500
+0.500
+0.500
+BEGIN
+-10.000|0.010
+0.000|0.980
+3.142|0.010
+-10.000|0.500
+1.000|0.000
+-10.000|0.500
+3.100|0.500
+-1.000|0.000
+3.100|0.500
+0.500
+0.000
+0.500
+0.000
+COMMIT