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