Thanks Bborie. I stuck with variant 1 but added an additional step of using ST_MapAlgebraExpr to burn the values to the udpated reference tile.
CREATE TABLE dummy_rast_updated AS SELECT rt.rid, ST_MapAlgebraExpr(rt.rast, vtr.rast, '[rast2.val]', '8BUI', 'FIRST', '0', '0', '0') as rast FROM dummy_rast as rt, viewshed_rast as vtr; The above expression gives the result I need. I can now string all this together as a 1-step process using pl/pgsql. :-) > > You could try variants 9 or 10 (the last two) described in the docs... > > http://postgis.refractions.net/documentation/manual-svn/RT_ST_AsRaster.html > > You'll probably need to call ST_Rescale afterwards to change the scale > of the resulting raster to match that of your reference raster. > > By default, ST_AsRaster returns a raster having the extent of the input > geometry's bounding box. > > -bborie > > On 06/25/2012 06:48 PM, Mark Wynter wrote: >> Hi Bborie >> >> As part of a pl/pgsql update process, my requirement is to create a "new" >> raster tile with same alignment (AND upperleftx, upperlefty, block >> dimensions) as the reference raster tile. For the new tile, I then want to >> set the pixel values = 100 for those pixels which intersect the "updated" >> vector polygon. I'm not interested in parts of the vector polygon beyond >> the extent of the reference tile. >> >> The reference raster is: >> CREATE TABLE dummy_rast (rid integer, rast raster) WITH (OIDS=FALSE); >> INSERT INTO dummy_rast VALUES(1, ST_MakeEmptyRaster(30, 30, 576000, >> -3780375, 50, -30, 0, 0, 3577)); >> UPDATE dummy_rast SET rast = ST_AddBand(rast, 1, '8BUI', NULL); >> SELECT AddRasterConstraints('dummy_rast'::name, 'rast'::name); >> >> As an approach, my initial thoughts were to rasterise the vector layer using >> ST_AsRaster. >> >> From scratch, the vector layer comprises two overlapping polygons which >> protrude beyond the extent of the reference tile... >> CREATE TABLE viewshed_vectors (gid integer, geometry geometry(polygon, >> 3577)) WITH (OIDS=FALSE); >> INSERT INTO viewshed_vectors VALUES(1, >> ST_Polygon(ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('LINESTRING(576500 >> -3780500, 577000 -3780500, 577000 -3781000, 576500 -3781000, 576500 >> -3780500)')),3577),3577)); >> INSERT INTO viewshed_vectors VALUES(2, >> ST_Polygon(ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('LINESTRING(576750 >> -3780250, 577250 -3780250, 577250 -3780750, 576750 -3780750, 576750 >> -3780250)')),3577),3577)); >> >> To rasterise the viewshed_vectors... >> CREATE TABLE viewshed_rast AS >> WITH vt as (SELECT ST_Union(geometry) as geometry FROM viewshed_vectors) >> SELECT rt.rid, ST_AsRaster(vt.geometry, rt.rast, '8BUI', 100, NULL) as rast >> FROM vt, dummy_rast as rt; >> SELECT AddRasterConstraints('viewshed_rast'::name, 'rast'::name); >> >> SELECT ST_SameAlignment(rt.rast, vt.rast) as sm FROM dummy_rast as rt, >> viewshed_rast as vt; >> sm >> ---- >> t >> >> The result when mapped in QGIS is as per this updated screenshot. >> >> Is there another step I must now do using ST_MapAlgebra to burn the >> (intersecting) viewshed_rast values to the underlying dummy_rast tile? >> What might that expression look like? >> >> Should I be approaching this a different way? >> >> I appreciate your thoughts and help. >> >> Best regards >> >> >> >> >>> >>> Message: 18 >>> Date: Mon, 25 Jun 2012 10:39:52 -0700 >>> From: Bborie Park <bkp...@ucdavis.edu> >>> Subject: Re: [postgis-users] Problem using ST_AsRaster >>> To: postgis-users@postgis.refractions.net >>> Message-ID: <4fe8a268.6050...@ucdavis.edu> >>> Content-Type: text/plain; charset=ISO-8859-1 >>> >>> Hi Mark, >>> >>> Can you elaborate on what you mean by "resultant raster does not map to >>> the reference raster"? >>> >>> The output from ST_AsRaster should result in a raster with the same >>> SRID, scale and skew as the reference raster. The output raster should >>> also be aligned with the reference raster as tested by ST_SameAlignment. >>> >>> -bborie >>> >>> On 06/23/2012 11:04 PM, Mark Wynter wrote: >>>> I can rasterise a vector layer, but I'm having trouble mapping it to a >>>> reference raster. >>>> >>>> The reference raster, called dummy_rast is a 1x1 raster tile with a height >>>> and width of 500pixels, each of 250m in size. I created using a pl/pgsql >>>> function: >>>> SELECT make_tiled_raster('public', 'dummy_rast', 576000, -3780000, 1, 1, >>>> 500, 500, 250, -250); >>>> The result is >>>> >>>> srid | scale_x | scale_y | blocksize_x | blocksize_y | num_bands | >>>> pixel_types | nodata_values >>>> ------+---------+---------+-------------+-------------+-----------+-------------+--------------- >>>> 3577 | 250 | -250 | 500 | 500 | 1 | {8BUI} >>>> | {NULL} >>>> >>>> >>>> I now wish to burn a vector layer onto this raster: >>>> >>>> CREATE TABLE viewshed_rast AS >>>> WITH vt as (SELECT ST_Union(geometry) as geometry FROM viewshed_vectors) >>>> SELECT rt.rid, ST_AsRaster(vt.geometry, rt.rast, '8BUI', 120, 100) as rast >>>> FROM dummy_rast as rt, vt; >>>> >>>> The result is >>>> srid | scale_x | scale_y | blocksize_x | blocksize_y | num_bands | >>>> pixel_types | nodata_values >>>> ------+---------+---------+-------------+-------------+-----------+-------------+--------------- >>>> 3577 | 250 | -250 | 67 | 38 | 1 | {8BUI} >>>> | {100} >>>> (1 row) >>>> >>>> I do not understand why the resultant raster does not map to the reference >>>> raster? Refer screenshot attached showing the resultant layers in QGIS. >>>> The upperleftx and upperlefty, and the block size of the resultant raster >>>> are defined by the extent of the vector layer and not the reference >>>> raster. >>>> >>>> Is there something obvious I'm doing wrong? Thanks. >>>> >
_______________________________________________ postgis-users mailing list postgis-users@postgis.refractions.net http://postgis.refractions.net/mailman/listinfo/postgis-users