ST_MapAlgebraExpr — 2个栅格波段版本:创建通过对提供的两个输入栅格波段应用有效的PostgreSQL代数运算形成的新单波段栅格。如果未指定波段编号,则假定每个栅格的波段1。生成的栅格将在第一个栅格定义的栅格上对齐(缩放、倾斜和像素角),其范围由“extenttype”参数定义。“extenttype”的值可以是:交集、并集、第一个、第二个。
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(表达式版本) 取而代之的是。 |
通过对由定义的两个波段应用有效的PostgreSQL代数运算来创建新的单波段栅格
expression
关于两个输入栅格波段
rast1
、(
rast2
)。如果没有
band1
,
band2
是指定的,则假定为带1。生成的栅格将在第一个栅格定义的栅格上对齐(缩放、倾斜和像素角)。生成的栅格将具有由
extenttype
参数。
涉及两个栅格的PostgreSQL代数表达式和PostgreSQL定义的函数/运算符,它们将在像素相交时定义像素值。例如([rast1]+[rast2])/2.0)::整数
输出栅格的结果像素类型。必须是中列出的 ST_BandPixelType 、省略或设置为空。如果未传入或设置为空,则默认为第一个栅格的像素类型。
控制生成的栅格的范围
INTERSECTION
-新栅格的范围是两个栅格的交点。这是默认设置。
UNION
-新栅格的范围是两个栅格的并集。
FIRST
-新栅格的范围与第一个栅格的范围相同。
SECOND
-新栅格的范围与第二个栅格的范围相同。
一种仅涉及
rast2
或一个常量,该常量定义当像素的
rast1
是无数据值,并且空间上对应的rast2像素具有值。
一种仅涉及
rast1
或一个常量,该常量定义当像素的
rast2
是无数据值,并且空间上对应的rast1像素具有值。
当空间上对应的rast1和rast2像素都为无数据值时返回的数值常量。
如果
pixeltype
则新栅格将具有该像素类型的带。如果传递的像素类型为空或未指定像素类型,则新栅格波段将具有与输入相同的像素类型
rast1
乐队。
Use the term
[rast1.val]
[rast2.val]
to refer to the pixel value of the original raster bands and
[rast1.x]
,
[rast1.y]
etc. to refer to the column / row positions of the pixels.
可用性: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;
![]() 栅格1
|
![]() 栅格2
|
![]() 栅格3
|
![]() final_rast
|
-- 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;
![]() 蓝线是所选宗地的边界
|
ST_MapAlgebraExpr , ST_AddBand , ST_AsPNG , ST_AsRaster , ST_MapAlgebraFct , ST_BandPixelType , ST_GeoReference , ST_Value , ST_Union , ST_Union