名稱

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);

描述

[Warning]

自 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 參數中。

[Note]

有關 VARIADIC 關鍵字的更多資訊,請參閱 PostgreSQL 文件以及「具有可變數量參數的 SQL 函數」部分,網址為 查詢語言 (SQL) 函數

[Note]

無論您是否選擇將任何參數傳遞給您的使用者函數進行處理,都需要使用 userfunctiontext[] 參數。

可用性: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;