ST_MapAlgebra (回呼函式版本) — 回呼函式版本 - 傳回一個單頻段柵格,輸入一或多個輸入柵格、頻段索引和一個使用者指定的回呼函式。
raster ST_MapAlgebra(
rastbandarg[] rastbandargset, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast, integer[] nband, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=FIRST, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast, integer nband, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=FIRST, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast1, integer nband1, raster rast2, integer nband2, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast, integer nband, regprocedure callbackfunc, float8[] mask, boolean weighted, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, text[] VARIADIC userargs=NULL)
;
傳回一個單頻段柵格,輸入一或多個輸入柵格、頻段索引和一個使用者指定的回呼函式。
rast,rast1,rast2, rastbandargset
執行地圖代數處理的柵格。
rastbandargset
允許對多個柵格和/或多個頻段使用地圖代數運算。請參閱範例變體 1。
nband, nband1, nband2
要評估的柵格的頻段編號。nband 可以是表示頻段的整數或整數陣列。nband1 是 rast1 上的頻段,nband2 是 rast2 上用於 2 柵格/2 頻段情況的頻段。
callbackfunc
callbackfunc
參數必須是 SQL 或 PL/pgSQL 函式的名稱和簽名,並轉換為 regprocedure。一個 PL/pgSQL 函式範例是
CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], position integer[][], VARIADIC userargs text[]) RETURNS double precision AS $$ BEGIN RETURN 0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
callbackfunc
必須有三個參數:一個 3 維雙精度陣列、一個 2 維整數陣列和一個可變長度的 1 維文字陣列。第一個參數 value
是來自所有輸入柵格的值集(以雙精度浮點數表示)。三個維度(索引從 1 開始)是:柵格編號、列 y、欄 x。第二個參數 position
是來自輸出柵格和輸入柵格的像素位置集。外維度(索引從 0 開始)是柵格編號。外維度索引 0 的位置是輸出柵格的像素位置。對於每個外維度,內維度中有兩個元素,分別用於 X 和 Y。第三個參數 userargs
用於傳遞任何使用者指定的參數。
將 regprocedure 參數傳遞給 SQL 函式需要傳遞完整的函式簽名,然後轉換為 regprocedure 類型。若要將上述範例 PL/pgSQL 函式作為參數傳遞,則該參數的 SQL 為
'sample_callbackfunc(double precision[], integer[], text[])'::regprocedure
請注意,參數包含函式的名稱、函式參數的類型、名稱和參數類型周圍的引號,以及轉換為 regprocedure。
mask
一個 n 維陣列(矩陣),用於篩選傳遞給地圖代數回呼函式的儲存格。0 表示相鄰儲存格值應被視為無資料,1 表示值應被視為資料。如果權重設定為 true,則這些值會作為乘數,乘以相鄰位置中該值的像素值。
weighted
布林值 (true/false),表示遮罩值是否應加權(乘以原始值)或不加權(僅適用於接受遮罩的原型)。
pixeltype
如果傳入 pixeltype
,則新柵格的單頻段將為該像素類型。如果傳入的 pixeltype 為 NULL 或省略,則新的柵格頻段將具有與第一個柵格的指定頻段相同的像素類型(對於範圍類型:INTERSECTION、UNION、FIRST、CUSTOM)或適當柵格的指定頻段(對於範圍類型:SECOND、LAST)。如有疑問,請務必指定 pixeltype
。
輸出柵格的結果像素類型必須是 ST_BandPixelType 中列出的其中一種,或省略或設為 NULL。
extenttype
可能的值為 INTERSECTION(預設)、UNION、FIRST(一個柵格變體的預設值)、SECOND、LAST、CUSTOM。
customextent
如果 extentype
為 CUSTOM,則必須為 customextent
提供一個柵格。請參閱變體 1 的範例 4。
distancex
從 x 方向的參考儲存格開始的像素距離。因此,結果矩陣的寬度將為 2*distancex + 1
。如果未指定,則僅考慮參考儲存格(鄰域為 0)。
distancey
從 y 方向的參考儲存格開始的像素距離。結果矩陣的高度將為 2*distancey + 1
。如果未指定,則僅考慮參考儲存格(鄰域為 0)。
userargs
callbackfunc
的第三個引數是一個 可變長度文字陣列。所有尾隨文字引數都會傳遞到指定的 callbackfunc
,並包含在 userargs
引數中。
![]() |
|
有關 VARIADIC 關鍵字的詳細資訊,請參閱 PostgreSQL 文件和 查詢語言 (SQL) 函數的「具有可變數目引數的 SQL 函數」一節。 |
![]() |
|
無論您是否選擇將任何引數傳遞給回呼函式進行處理,都必須使用 |
變體 1 接受 rastbandarg
陣列,允許對多個柵格和/或多個頻段使用地圖代數運算。請參閱範例變體 1。
變體 2 和 3 對一個柵格的一或多個頻段進行運算。請參閱範例變體 2 和 3。
變體 4 對兩個柵格進行運算,每個柵格有一個頻段。請參閱範例變體 4。
可用性:2.2.0:新增遮罩功能
可用性:2.1.0
一個柵格,一個頻段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast ) SELECT ST_MapAlgebra( ARRAY[ROW(rast, 1)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
一個柵格,多個頻段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast ) SELECT ST_MapAlgebra( ARRAY[ROW(rast, 3), ROW(rast, 1), ROW(rast, 3), ROW(rast, 2)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
多個柵格,多個頻段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast ) SELECT ST_MapAlgebra( ARRAY[ROW(t1.rast, 3), ROW(t2.rast, 1), ROW(t2.rast, 3), ROW(t1.rast, 2)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 1 AND t2.rid = 2
完整的覆蓋範圍圖磚鄰域範例。此查詢僅適用於 PostgreSQL 9.1 或更高版本。
WITH foo AS ( SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast UNION ALL SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, 0, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0) AS rast UNION ALL SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, 0, 1, -1, 0, 0, 0), 1, '16BUI', 3, 0) AS rast UNION ALL SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -2, 1, -1, 0, 0, 0), 1, '16BUI', 10, 0) AS rast UNION ALL SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -2, 1, -1, 0, 0, 0), 1, '16BUI', 20, 0) AS rast UNION ALL SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -2, 1, -1, 0, 0, 0), 1, '16BUI', 30, 0) AS rast UNION ALL SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast ) SELECT t1.rid, ST_MapAlgebra( ARRAY[ROW(ST_Union(t2.rast), 1)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure, '32BUI', 'CUSTOM', t1.rast, 1, 1 ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 4 AND t2.rid BETWEEN 0 AND 8 AND ST_Intersects(t1.rast, t2.rast) GROUP BY t1.rid, t1.rast
與先前範例類似的覆蓋範圍圖磚鄰域範例,但適用於 PostgreSQL 9.0。
WITH src AS ( SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast UNION ALL SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, 0, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0) AS rast UNION ALL SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, 0, 1, -1, 0, 0, 0), 1, '16BUI', 3, 0) AS rast UNION ALL SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -2, 1, -1, 0, 0, 0), 1, '16BUI', 10, 0) AS rast UNION ALL SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -2, 1, -1, 0, 0, 0), 1, '16BUI', 20, 0) AS rast UNION ALL SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -2, 1, -1, 0, 0, 0), 1, '16BUI', 30, 0) AS rast UNION ALL SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast ) WITH foo AS ( SELECT t1.rid, ST_Union(t2.rast) AS rast FROM src t1 JOIN src t2 ON ST_Intersects(t1.rast, t2.rast) AND t2.rid BETWEEN 0 AND 8 WHERE t1.rid = 4 GROUP BY t1.rid ), bar AS ( SELECT t1.rid, ST_MapAlgebra( ARRAY[ROW(t2.rast, 1)]::rastbandarg[], 'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure, '32BUI', 'CUSTOM', t1.rast, 1, 1 ) AS rast FROM src t1 JOIN foo t2 ON t1.rid = t2.rid ) SELECT rid, (ST_Metadata(rast)), (ST_BandMetadata(rast, 1)), ST_Value(rast, 1, 1, 1) FROM bar;
一個柵格,多個頻段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast ) SELECT ST_MapAlgebra( rast, ARRAY[3, 1, 3, 2]::integer[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
一個柵格,一個頻段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast ) SELECT ST_MapAlgebra( rast, 2, 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
兩個柵格,兩個頻段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast ) SELECT ST_MapAlgebra( t1.rast, 2, t2.rast, 1, 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 1 AND t2.rid = 2
WITH foo AS (SELECT ST_SetBandNoDataValue( ST_SetValue(ST_SetValue(ST_AsRaster( ST_Buffer( ST_GeomFromText('LINESTRING(50 50,100 90,100 50)'), 5,'join=bevel'), 200,200,ARRAY['8BUI'], ARRAY[100], ARRAY[0]), ST_Buffer('POINT(70 70)'::geometry,10,'quad_segs=1') ,50), 'LINESTRING(20 20, 100 100, 150 98)'::geometry,1),0) AS rast ) SELECT 'original' AS title, rast FROM foo UNION ALL SELECT 'no mask mean value' AS title, ST_MapAlgebra(rast,1,'ST_mean4ma(double precision[], int[], text[])'::regprocedure) AS rast FROM foo UNION ALL SELECT 'mask only consider neighbors, exclude center' AS title, ST_MapAlgebra(rast,1,'ST_mean4ma(double precision[], int[], text[])'::regprocedure, '{{1,1,1}, {1,0,1}, {1,1,1}}'::double precision[], false) As rast FROM foo UNION ALL SELECT 'mask weighted only consider neighbors, exclude center multi other pixel values by 2' AS title, ST_MapAlgebra(rast,1,'ST_mean4ma(double precision[], int[], text[])'::regprocedure, '{{2,2,2}, {2,0,2}, {2,2,2}}'::double precision[], true) As rast FROM foo;
![]() 原始
|
![]() 無遮罩平均值(與遮罩矩陣中所有值為 1 相同)
|
![]() 遮罩僅考慮鄰居,排除中心
|
![]() 遮罩加權僅考慮鄰居,排除中心,其他像素值乘以 2
|