ST_MapAlgebraExpr — 2 栅格波段版本:通过对提供的两个输入栅格波段和像素类型应用有效的 PostgreSQL 代数运算来创建新的单波段栅格。 如果未指定波段编号,则假定每个栅格的波段 1。 生成的栅格将在第一个栅格定义的网格上对齐(比例、倾斜和像素角),并具有由“extenttype”参数定义的范围。 “extenttype”的值可以是:INTERSECTION、UNION、FIRST、SECOND。
raster ST_MapAlgebraExpr(
raster rast1, raster rast2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL)
;
raster ST_MapAlgebraExpr(
raster rast1, integer band1, raster rast2, integer band2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL)
;
ST_MapAlgebraExpr 自 2.1.0 起已弃用。 使用 ST_MapAlgebra (expression version)(表达式版本)代替。 |
通过对两个输入栅格波段 rast1
, (rast2
) 上的expression
定义的两个波段应用有效的 PostgreSQL 代数运算,创建一个新的单波段栅格。 如果没有 band1
,则指定 band2
,则假定为 band 1。 生成的栅格将在第一个栅格定义的网格上对齐(比例、倾斜和像素角)。 生成的栅格将具有由extenttype
参数定义的范围。
expression
涉及两个栅格的 PostgreSQL 代数表达式和 PostgreSQL 定义的函数/运算符,用于定义像素相交时的像素值。 例如 (([rast1] [rast2])/2.0)::integer
pixeltype
输出栅格的结果像素类型。 必须是ST_BandPixelType 中列出的一项,可省略或设置为 NULL。 如果未传入或设置为 NULL,将默认为第一个栅格的像素类型。
extenttype
控制生成的栅格的范围
INTERSECTION
- 新栅格的范围是两个栅格的交集。 这是默认设置。
UNION
- 新栅格的范围是两个栅格的并集。
FIRST
- 新栅格的范围与第一个栅格的范围相同。
SECOND
- 新栅格的范围与第二个栅格的范围相同。
nodata1expr
仅涉及 rast2
的代数表达式或定义当 rast1
的像素为无数据值并且空间对应的 rast2 像素具有值时返回的内容的常量。
nodata2expr
仅涉及 rast1
常量的代数表达式,该常量定义当 rast2
的像素为无数据值且空间对应的 rast1 像素具有值时返回的内容。
nodatanodataval
当空间对应的 rast1 和 rast2 像素均为无数据值时要返回的数值常量。
如果传入pixeltype
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL 或未指定像素类型,则新的栅格波段将具有与输入 rast1
波段相同的像素类型。
使用术语 [rast1.val]
[rast2.val]
指代原始栅格波段的像素值,使用 [rast1.x]
、[rast1.y]
等指代像素的列/行位置。
可用性: 2.0.0
根据原始栅格创建一个新的 1 波段栅格,该栅格是原始栅格波段的模 2 的函数。
--Create a cool set of rasters -- DROP TABLE IF EXISTS fun_shapes; CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster); -- Insert some cool shapes around Boston in Massachusetts state plane meters -- INSERT INTO fun_shapes(fun_name, rast) VALUES ('ref', ST_AsRaster(ST_MakeEnvelope(235229, 899970, 237229, 901930,26986),200,200,'8BUI',0,0)); INSERT INTO fun_shapes(fun_name,rast) WITH ref(rast) AS (SELECT rast FROM fun_shapes WHERE fun_name = 'ref' ) SELECT 'area' AS fun_name, ST_AsRaster(ST_Buffer(ST_SetSRID(ST_Point(236229, 900930),26986), 1000), ref.rast,'8BUI', 10, 0) As rast FROM ref UNION ALL SELECT 'rand bubbles', ST_AsRaster( (SELECT ST_Collect(geom) FROM (SELECT ST_Buffer(ST_SetSRID(ST_Point(236229 + i*random()*100, 900930 + j*random()*100),26986), random()*20) As geom FROM generate_series(1,10) As i, generate_series(1,10) As j ) As foo ), ref.rast,'8BUI', 200, 0) FROM ref; --map them - SELECT ST_MapAlgebraExpr( area.rast, bub.rast, '[rast2.val]', '8BUI', 'INTERSECTION', '[rast2.val]', '[rast1.val]') As interrast, ST_MapAlgebraExpr( area.rast, bub.rast, '[rast2.val]', '8BUI', 'UNION', '[rast2.val]', '[rast1.val]') As unionrast FROM (SELECT rast FROM fun_shapes WHERE fun_name = 'area') As area CROSS JOIN (SELECT rast FROM fun_shapes WHERE fun_name = 'rand bubbles') As bub
|
|
-- we use ST_AsPNG to render the image so all single band ones look grey -- WITH mygeoms AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(1,5),10) As geom UNION ALL SELECT 3 AS bnum, ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10,'join=bevel') As geom UNION ALL SELECT 1 As bnum, ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 5,'join=bevel') As geom ), -- define our canvas to be 1 to 1 pixel to geometry canvas AS (SELECT ST_AddBand(ST_MakeEmptyRaster(200, 200, ST_XMin(e)::integer, ST_YMax(e)::integer, 1, -1, 0, 0) , '8BUI'::text,0) As rast FROM (SELECT ST_Extent(geom) As e, Max(ST_SRID(geom)) As srid from mygeoms ) As foo ), rbands AS (SELECT ARRAY(SELECT ST_MapAlgebraExpr(canvas.rast, ST_AsRaster(m.geom, canvas.rast, '8BUI', 100), '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') As rast FROM mygeoms AS m CROSS JOIN canvas ORDER BY m.bnum) As rasts ) SELECT rasts[1] As rast1 , rasts[2] As rast2, rasts[3] As rast3, ST_AddBand( ST_AddBand(rasts[1],rasts[2]), rasts[3]) As final_rast FROM rbands;
|
|
|
|
-- Create new 3 band raster composed of first 2 clipped bands, and overlay of 3rd band with our geometry -- This query took 3.6 seconds on PostGIS windows 64-bit install WITH pr AS -- Note the order of operation: we clip all the rasters to dimensions of our region (SELECT ST_Clip(rast,ST_Expand(geom,50) ) As rast, g.geom FROM aerials.o_2_boston AS r INNER JOIN -- union our parcels of interest so they form a single geometry we can later intersect with (SELECT ST_Union(ST_Transform(geom,26986)) AS geom FROM landparcels WHERE pid IN('0303890000', '0303900000')) As g ON ST_Intersects(rast::geometry, ST_Expand(g.geom,50)) ), -- we then union the raster shards together -- ST_Union on raster is kinda of slow but much faster the smaller you can get the rasters -- therefore we want to clip first and then union prunion AS (SELECT ST_AddBand(NULL, ARRAY[ST_Union(rast,1),ST_Union(rast,2),ST_Union(rast,3)] ) As clipped,geom FROM pr GROUP BY geom) -- return our final raster which is the unioned shard with -- with the overlay of our parcel boundaries -- add first 2 bands, then mapalgebra of 3rd band + geometry SELECT ST_AddBand(ST_Band(clipped,ARRAY[1,2]) , ST_MapAlgebraExpr(ST_Band(clipped,3), ST_AsRaster(ST_Buffer(ST_Boundary(geom),2),clipped, '8BUI',250), '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') ) As rast FROM prunion;
|