[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