Replaced the summarystatsstate type with the summarystats type to avoid defining a new type.

git-svn-id: http://svn.osgeo.org/postgis/trunk@8256 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
Pierre Racine 2011-11-29 16:57:52 +00:00
parent d62d4df2e7
commit 65aab4a7c9

View file

@ -1,63 +1,56 @@
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- ST_SummaryStatsAgg AGGREGATE -- ST_SummaryStatsAgg AGGREGATE
-- Compute summary statistics for an aggregation of raster. -- Compute summary statistics for an aggregation of raster.
-- --
-- Exemple -- Exemple
-- SELECT (aws).count, -- SELECT (ss).count,
-- (aws).sum, -- (ss).sum,
-- (aws).mean, -- (ss).mean,
-- (aws).min, -- (ss).min,
-- (aws).max -- (ss).max
-- FROM (SELECT ST_SummaryStatsAgg(gv) aws -- FROM (SELECT ST_SummaryStatsAgg(gv) ss
-- FROM (SELECT ST_Clip(rt.rast, gt.geom) gv -- FROM (SELECT ST_Clip(rt.rast, gt.geom) gv
-- FROM rasttable rt, geomtable gt -- FROM rasttable rt, geomtable gt
-- WHERE ST_Intersects(rt.rast, gt.geom) -- WHERE ST_Intersects(rt.rast, gt.geom)
-- ) foo -- ) foo
-- GROUP BY gt.id -- GROUP BY gt.id
-- ) foo2 -- ) foo2
---------------------------------------------------------------------
-- DROP TYPE summarystatsstate CASCADE;
CREATE TYPE summarystatsstate AS (
count int,
sum double precision,
min double precision,
max double precision
);
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- raster_summarystatsstate -- raster_summarystatsstate
-- State function used by the ST_SummaryStatsAgg aggregate -- State function used by the ST_SummaryStatsAgg aggregate
CREATE OR REPLACE FUNCTION raster_summarystatsstate(sss summarystatsstate, rast raster, nband int DEFAULT 1, exclude_nodata_value boolean DEFAULT TRUE, sample_percent double precision DEFAULT 1) CREATE OR REPLACE FUNCTION raster_summarystatsstate(ss summarystats, rast raster, nband int DEFAULT 1, exclude_nodata_value boolean DEFAULT TRUE, sample_percent double precision DEFAULT 1)
RETURNS summarystatsstate RETURNS summarystats
AS $$ AS $$
DECLARE DECLARE
newstats summarystats; newstats summarystats;
ret summarystatsstate; ret summarystats;
BEGIN BEGIN
IF rast IS NULL THEN IF rast IS NULL THEN
RETURN sss; RETURN ss;
END IF; END IF;
newstats := _ST_SummaryStats(rast, nband, exclude_nodata_value, sample_percent); newstats := _ST_SummaryStats(rast, nband, exclude_nodata_value, sample_percent);
IF $1 IS NULL THEN IF $1 IS NULL THEN
ret := (newstats.count, ret := (newstats.count,
newstats.sum, newstats.sum,
null,
null,
newstats.min, newstats.min,
newstats.max)::summarystatsstate; newstats.max)::summarystats;
ELSE ELSE
ret := (sss.count + newstats.count, ret := (ss.count + newstats.count,
sss.sum + newstats.sum, ss.sum + newstats.sum,
least(sss.min, newstats.min), null,
greatest(sss.max, newstats.max))::summarystatsstate; null,
least(ss.min, newstats.min),
greatest(ss.max, newstats.max))::summarystats;
END IF; END IF;
RAISE NOTICE 'min=% ',ret.min;
RETURN ret; RETURN ret;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION raster_summarystatsstate(sss summarystatsstate, rast raster) CREATE OR REPLACE FUNCTION raster_summarystatsstate(ss summarystats, rast raster)
RETURNS summarystatsstate RETURNS summarystats
AS $$ AS $$
SELECT raster_summarystatsstate($1, $2, 1, true, 1); SELECT raster_summarystatsstate($1, $2, 1, true, 1);
$$ LANGUAGE 'SQL'; $$ LANGUAGE 'SQL';
@ -65,7 +58,7 @@ CREATE OR REPLACE FUNCTION raster_summarystatsstate(sss summarystatsstate, rast
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- raster_summarystatsfinal -- raster_summarystatsfinal
-- Final function used by the ST_SummaryStatsAgg aggregate -- Final function used by the ST_SummaryStatsAgg aggregate
CREATE OR REPLACE FUNCTION raster_summarystatsfinal(sss summarystatsstate) CREATE OR REPLACE FUNCTION raster_summarystatsfinal(ss summarystats)
RETURNS summarystats RETURNS summarystats
AS $$ AS $$
DECLARE DECLARE
@ -88,13 +81,13 @@ CREATE OR REPLACE FUNCTION raster_summarystatsfinal(sss summarystatsstate)
--------------------------------------------------------------------- ---------------------------------------------------------------------
CREATE AGGREGATE ST_SummaryStatsAgg(raster, int, boolean, double precision) ( CREATE AGGREGATE ST_SummaryStatsAgg(raster, int, boolean, double precision) (
SFUNC=raster_summarystatsstate, SFUNC=raster_summarystatsstate,
STYPE=summarystatsstate, STYPE=summarystats,
FINALFUNC=raster_summarystatsfinal FINALFUNC=raster_summarystatsfinal
); );
CREATE AGGREGATE ST_SummaryStatsAgg(raster) ( CREATE AGGREGATE ST_SummaryStatsAgg(raster) (
SFUNC=raster_summarystatsstate, SFUNC=raster_summarystatsstate,
STYPE=summarystatsstate, STYPE=summarystats,
FINALFUNC=raster_summarystatsfinal FINALFUNC=raster_summarystatsfinal
); );
@ -110,13 +103,13 @@ CREATE OR REPLACE FUNCTION ST_TestRaster(h integer, w integer, val float8)
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';
SELECT id, SELECT id,
(sss).count, (ss).count,
(sss).sum, (ss).sum,
(sss).mean, (ss).mean,
(sss).stddev, (ss).stddev,
(sss).min, (ss).min,
(sss).max (ss).max
FROM (SELECT ST_SummaryStatsAgg(rast) as sss, id FROM (SELECT ST_SummaryStatsAgg(rast) as ss, id
FROM (SELECT 1 id, ST_TestRaster(2, 2, 2) rast FROM (SELECT 1 id, ST_TestRaster(2, 2, 2) rast
UNION ALL UNION ALL
SELECT 1 id, ST_TestRaster(2, 2, 4) rast SELECT 1 id, ST_TestRaster(2, 2, 4) rast