From: Bborie Park Date: Thu, 26 May 2011 20:04:12 +0000 (+0000) Subject: Addition of ST_ValuePercent, sibling of ST_ValueCount. This function provides the... X-Git-Tag: 2.0.0alpha1~1558 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=29fd8cc4f121c65671c2d088a6ada05dff325b08;p=postgis Addition of ST_ValuePercent, sibling of ST_ValueCount. This function provides the ability to determine the percentage of a raster's band that is of a user-specified value. 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 --- diff --git a/raster/rt_core/rt_api.c b/raster/rt_core/rt_api.c index d3a9ec19d..13887436d 100644 --- a/raster/rt_core/rt_api.c +++ b/raster/rt_core/rt_api.c @@ -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); } diff --git a/raster/rt_pg/rt_pg.c b/raster/rt_pg/rt_pg.c index aa1c4eb6a..a3229e6cd 100644 --- a/raster/rt_pg/rt_pg.c +++ b/raster/rt_pg/rt_pg.c @@ -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 */ diff --git a/raster/rt_pg/rtpostgis.sql.in.c b/raster/rt_pg/rtpostgis.sql.in.c index 93d888f7f..60a5de8be 100644 --- a/raster/rt_pg/rtpostgis.sql.in.c +++ b/raster/rt_pg/rtpostgis.sql.in.c @@ -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 ----------------------------------------------------------------------- diff --git a/raster/test/core/testapi.c b/raster/test/core/testapi.c index 8cff63f95..c47bf5a2d 100644 --- a/raster/test/core/testapi.c +++ b/raster/test/core/testapi.c @@ -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; diff --git a/raster/test/regress/Makefile.in b/raster/test/regress/Makefile.in index ce9a7322f..5d7731095 100644 --- a/raster/test/regress/Makefile.in +++ b/raster/test/regress/Makefile.in @@ -76,6 +76,7 @@ TEST_BANDPROPS = \ rt_histogram.sql \ rt_quantile.sql \ rt_valuecount.sql \ + rt_valuepercent.sql \ $(NULL) TEST_PIXEL = \ diff --git a/raster/test/regress/rt_valuecount.sql b/raster/test/regress/rt_valuecount.sql index 85018f12e..ad5daa6f9 100644 --- a/raster/test/regress/rt_valuecount.sql +++ b/raster/test/regress/rt_valuecount.sql @@ -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; diff --git a/raster/test/regress/rt_valuecount_expected b/raster/test/regress/rt_valuecount_expected index 48751d8ab..86f0d88e5 100644 --- a/raster/test/regress/rt_valuecount_expected +++ b/raster/test/regress/rt_valuecount_expected @@ -12,12 +12,12 @@ -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 index 000000000..1cf0d668f --- /dev/null +++ b/raster/test/regress/rt_valuepercent.sql @@ -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 index 000000000..1a8495f6a --- /dev/null +++ b/raster/test/regress/rt_valuepercent_expected @@ -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