ST_MapAlgebraFct — 單波段版本 - 透過將有效的 PostgreSQL 函數應用於輸入的影像波段並使用提供的像素類型,建立新的單波段影像。如果沒有指定波段,則假設為波段 1。
raster ST_MapAlgebraFct(
raster rast, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
raster ST_MapAlgebraFct(
raster rast, text pixeltype, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
raster ST_MapAlgebraFct(
raster rast, integer band, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, integer band, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
raster ST_MapAlgebraFct(
raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
![]() |
|
自 2.1.0 版本起,ST_MapAlgebraFct 已被棄用。請改用 ST_MapAlgebra(回調函數版本)。 |
透過將 onerasteruserfunc
指定的有效 PostgreSQL 函數應用於輸入的影像 (rast
),建立新的單波段影像。如果沒有指定 band
,則假設為波段 1。新的影像將具有與原始影像相同的地理參考、寬度和高度,但僅具有一個波段。
如果傳入 pixeltype
,則新的影像將具有該像素類型的波段。如果傳入的像素類型為 NULL,則新的影像波段將具有與輸入 rast
波段相同的像素類型。
onerasteruserfunc
參數必須是 SQL 或 PL/pgSQL 函數的名稱和簽名,並轉換為 regprocedure。一個非常簡單且幾乎沒用的 PL/pgSQL 函數示例是
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[]) RETURNS FLOAT AS $$ BEGIN RETURN 0.0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
userfunction
可以接受兩個或三個參數:一個浮點數值、一個可選的整數數組和一個可變文字數組。第一個參數是單個影像單元的值(無論影像資料類型如何)。第二個參數是以「{x,y}」形式表示的當前處理單元的位置。第三個參數表示所有剩餘的 ST_MapAlgebraFct 參數都應傳遞到 userfunction
。
將 regprodedure 參數傳遞給 SQL 函數需要傳遞完整的函數簽名,然後轉換為 regprocedure 類型。要將上述 PL/pgSQL 函數範例作為參數傳遞,該參數的 SQL 如下:
'simple_function(float,integer[],text[])'::regprocedure
請注意,該參數包含函數名稱、函數參數的類型、名稱和參數類型周圍的引號,以及轉換為 regprocedure。
userfunction
的第三個參數是一個 variadic text 數組。任何 ST_MapAlgebraFct 呼叫的所有尾隨文字參數都會傳遞到指定的 userfunction
,並包含在 args
參數中。
![]() |
|
有關 VARIADIC 關鍵字的更多資訊,請參閱 PostgreSQL 文件以及「具有可變數量參數的 SQL 函數」部分,網址為 查詢語言 (SQL) 函數。 |
![]() |
|
無論您是否選擇將任何參數傳遞給您的使用者函數進行處理,都需要使用 |
可用性:2.0.0
從原始影像建立一個新的單波段影像,該影像的函數是原始影像波段的模數 2。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster; CREATE FUNCTION mod_fct(pixel float, pos integer[], variadic args text[]) RETURNS float AS $$ BEGIN RETURN pixel::integer % 2; END; $$ LANGUAGE 'plpgsql' IMMUTABLE; UPDATE dummy_rast SET map_rast = ST_MapAlgebraFct(rast,NULL,'mod_fct(float,integer[],text[])'::regprocedure) WHERE rid = 2; SELECT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast, 1, i, j) As mapval FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j WHERE rid = 2; origval | mapval ---------+-------- 253 | 1 254 | 0 253 | 1 253 | 1 254 | 0 254 | 0 250 | 0 254 | 0 254 | 0
從原始影像建立一個新的像素類型為 2BUI 的單波段影像,該影像經過重新分類,並將無效值設定為傳遞給使用者函數的參數 (0)。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster; CREATE FUNCTION classify_fct(pixel float, pos integer[], variadic args text[]) RETURNS float AS $$ DECLARE nodata float := 0; BEGIN IF NOT args[1] IS NULL THEN nodata := args[1]; END IF; IF pixel < 251 THEN RETURN 1; ELSIF pixel = 252 THEN RETURN 2; ELSIF pixel > 252 THEN RETURN 3; ELSE RETURN nodata; END IF; END; $$ LANGUAGE 'plpgsql'; UPDATE dummy_rast SET map_rast2 = ST_MapAlgebraFct(rast,'2BUI','classify_fct(float,integer[],text[])'::regprocedure, '0') WHERE rid = 2; SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1, i, j) As mapval FROM dummy_rast CROSS JOIN generate_series(1, 5) AS i CROSS JOIN generate_series(1,5) AS j WHERE rid = 2; origval | mapval ---------+-------- 249 | 1 250 | 1 251 | 252 | 2 253 | 3 254 | 3 SELECT ST_BandPixelType(map_rast2) As b1pixtyp FROM dummy_rast WHERE rid = 2; b1pixtyp ---------- 2BUI
![]() 原始影像(欄位 rast-view) |
![]() rast_view_ma |
從原始的 3 波段影像建立一個新的 3 波段影像,其像素類型相同,其中第一個波段由地圖代數修改,其餘 2 個波段保持不變。
CREATE FUNCTION rast_plus_tan(pixel float, pos integer[], variadic args text[]) RETURNS float AS $$ BEGIN RETURN tan(pixel) * pixel; END; $$ LANGUAGE 'plpgsql'; SELECT ST_AddBand( ST_AddBand( ST_AddBand( ST_MakeEmptyRaster(rast_view), ST_MapAlgebraFct(rast_view,1,NULL,'rast_plus_tan(float,integer[],text[])'::regprocedure) ), ST_Band(rast_view,2) ), ST_Band(rast_view, 3) As rast_view_ma ) FROM wind WHERE rid=167;