[postgis-devel] [PostGIS] #493: [wktraster] ST_DumpValues to Dump Pixel values
PostGIS
trac at osgeo.org
Fri Apr 9 09:48:06 PDT 2010
#493: [wktraster] ST_DumpValues to Dump Pixel values
------------------------+---------------------------------------------------
Reporter: robe | Owner: pracine
Type: defect | Status: new
Priority: medium | Milestone: WKTRaster Future
Component: wktraster | Version: trunk
Resolution: | Keywords:
------------------------+---------------------------------------------------
Comment (by robe):
Pierre,
Let me think about this a bit more. It might be better served adding a
range to ST_DumpPolygons or when you raster classification feature is
implemented.
What I had invisioned is I would use your ST_Clip(rast,geom) to get a
raster back
and then I would use ST_DumpValues to polygonize how I preferred based on
a range of DumpValues. This would probably be better if ST_DumpAsPolygons
took a range of Pixel values of interest.
Here is my function to better demonstrate what I mean. Which would be
used to form a multipolygon/polygon only for selected raster bands that
have specified ranges and sampling every 5 pixels. In this example:
{{{
-- return a polygon formed
-- from rast bands 1 and 3
-- with band 1 pixel range 15 to 100
-- or band 2 pixel range 20,30 and sample every 5 pixels across and down
SELECT rutility.upgis_rastertopolygon(rast,ARRAY[1,3], 5,
ARRAY[ARRAY[15,100], ARRAY[20,30]])
FROM pele;
}}}
The function looks like below
{{{
CREATE OR REPLACE FUNCTION rutility.upgis_rastertopolygon(param_rast
raster, param_bands integer[], param_sampling integer, param_valrange
float[][2])
RETURNS geometry AS
$BODY$
DECLARE
var_rows integer := ST_Height(param_rast);
var_cols integer := ST_Width(param_rast);
var_pixsizex float := ST_PixelSizeX(param_rast);
var_pixsizey float := ST_PixelSizeY(param_rast);
var_pixpoly geometry :=
ST_MakeEnvelope(ST_UpperLeftX(param_rast),ST_UpperLeftY(param_rast),
ST_UpperLeftX(param_rast) + var_pixsizex*param_sampling,
ST_UpperLeftY(param_rast) + var_pixsizey*param_sampling,
ST_SRID(param_rast));
var_result geometry;
BEGIN
SELECT ST_Union(ST_Translate(var_pixpoly, x*var_pixsizex,
y*var_pixsizey))
INTO var_result
FROM generate_series(1,var_cols,param_sampling) As
x
CROSS JOIN
generate_series(1,var_rows,param_sampling) As y
WHERE EXISTS (SELECT 1 FROM generate_series(1,
array_upper(param_bands,1)) As i
WHERE ST_Value(param_rast,
param_bands[i],x,y)
BETWEEN param_valrange[i][1] AND
param_valrange[i][2] ) ;
RETURN var_result;
END
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE;
}}}
--
Ticket URL: <http://trac.osgeo.org/postgis/ticket/493#comment:3>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.
More information about the postgis-devel
mailing list