<div dir="ltr"><div><div>Many thanks Pierre, <br><br></div>I can create a 100 x 200 x 1000 raster in about 30 seconds. That's quite a lot of pixels organized !<br><br></div><div>For the archives, here's the complete code:<br>--<br>CREATE SCHEMA test;<br></div><div><br>CREATE TABLE test.measure AS
<br>SELECT 
        r as rowy, c as colx, b as band,
        round(random() * 100)::float as v
<br>FROM 
        generate_series(1, 100) as r
        <br>  CROSS JOIN LATERAL 
                generate_series(1, 200) as c
        <br>  CROSS JOIN LATERAL 
                generate_series(1, 1000) as b;
                
<br><br>CREATE TABLE test.rasters AS
<br>SELECT 1 as rid, ST_AddBand(ST_MakeEmptyRaster(200, 100, 1, 1, 1, 1, 0, 0, 0), --width, height
                                <br>  ARRAY[
                        ROW(NULL, '32BF', -9999, -9999) -- 1
                                ]::addbandarg[]) as rast;<br><br>CREATE TABLE test.the_raster AS
<br>WITH rw AS (
<br>  SELECT band, rowy, array_agg(v ORDER BY colx) a
<br>  FROM test.measure
  GROUP BY band, rowy
), <br>valarray AS (
  <br>  SELECT band, array_agg_mult(ARRAY[a] ORDER BY rowy) a
  <br>  FROM rw
  GROUP BY band
), <br>raster AS (
<br>  SELECT rast FROM test.rasters <br>  WHERE rid=1
), <br>newraster AS (
<br>  SELECT ST_AddBand(NULL, array_agg(ST_SetValues(rast, 1, 1, 1, valarray.a) <br>  ORDER BY band), 1) As rast
  <br>  FROM valarray, raster
)
<br>SELECT rast
FROM newraster;<br><br></div>Etienne<br><br><div class="gmail_quote"><div dir="ltr">Le lun. 29 févr. 2016 à 10:31, Pierre Racine <<a href="mailto:Pierre.Racine@sbf.ulaval.ca">Pierre.Racine@sbf.ulaval.ca</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Etienne,<br>
<br>
> Still, I can't figure how to load an arbitrary number of bands using your<br>
> snippet. If I remove WHERE band=1 I still get a unique band.<br>
<br>
This query will work for many bands and will aggregate all of them in a single raster:<br>
<br>
WITH rows AS (<br>
  SELECT band, colx, array_agg(v ORDER BY rowy) a<br>
  FROM test.measure<br>
  GROUP BY band, colx<br>
), valarray AS (<br>
  SELECT band, array_agg_mult(ARRAY[a] ORDER BY colx) a<br>
  FROM rows<br>
  GROUP BY band<br>
), raster AS (<br>
  SELECT rast FROM test.rasters WHERE rid=1<br>
), newraster AS (<br>
  SELECT ST_AddBand(NULL, array_agg(ST_SetValues(rast, 1, 1, 1, valarray.a) ORDER BY band), 1) As rast<br>
  FROM valarray, raster<br>
)<br>
SELECT band, (ST_PixelAsPolygons(rast, band)).*<br>
FROM newraster, generate_series(1,2) band;<br>
<br>
this will work only if they all have the same width/height.<br>
<br>
Pierre<br>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/postgis-users</a></blockquote></div></div>