名稱

ST_MapAlgebraFct — 雙波段版本 - 透過對 2 個輸入柵格波段應用有效的 PostgreSQL 函式,並提供像素類型,來建立新的單波段柵格。如果未指定波段,則假設為波段 1。如果未指定,範圍類型預設為 INTERSECTION。

概要

raster ST_MapAlgebraFct(raster rast1, raster rast2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);

raster ST_MapAlgebraFct(raster rast1, integer band1, raster rast2, integer band2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);

說明

[Warning]

ST_MapAlgebraFct 自 2.1.0 版本起已棄用。請改用 ST_MapAlgebra (回呼函式版本)

透過將 tworastuserfunc 指定的有效 PostgreSQL 函式應用於輸入柵格 rast1rast2 來建立新的單波段柵格。如果未指定 band1band2,則假設為波段 1。新的柵格將具有與原始柵格相同的地理參考、寬度和高度,但只會有一個波段。

如果傳入 pixeltype,則新的柵格將具有該像素類型的波段。如果傳入 NULL 或省略像素類型,則新的柵格波段將具有與輸入 rast1 波段相同的像素類型。

tworastuserfunc 參數必須是 SQL 或 PL/pgSQL 函式的名稱和簽名,並強制轉換為 regprocedure。PL/pgSQL 函式的範例為

CREATE OR REPLACE FUNCTION simple_function_for_two_rasters(pixel1 FLOAT, pixel2 FLOAT, pos INTEGER[], VARIADIC args TEXT[])
    RETURNS FLOAT
    AS $$ BEGIN
        RETURN 0.0;
    END; $$
    LANGUAGE 'plpgsql' IMMUTABLE;

tworastuserfunc 可以接受三個或四個參數:雙精度值、雙精度值、可選的整數陣列和可變文字陣列。第一個參數是 rast1 中個別柵格單元格的值(無論柵格資料類型為何)。第二個參數是 rast2 中個別柵格單元格的值。第三個參數是以 '{x,y}' 形式表示的目前處理單元格的位置。第四個參數表示所有剩餘傳遞給 ST_MapAlgebraFct 的參數應傳遞到 tworastuserfunc

regprodedure 引數傳遞給 SQL 函式需要傳遞完整的函式簽名,然後強制轉換為 regprocedure 類型。若要將上述 PL/pgSQL 函式範例作為引數傳遞,則該引數的 SQL 為

'simple_function(double precision, double precision, integer[], text[])'::regprocedure

請注意,引數包含函式名稱、函式引數的類型、名稱和引數類型周圍的引號,以及強制轉換為 regprocedure

tworastuserfunc 的第四個引數是 variadic text 陣列。任何 ST_MapAlgebraFct 呼叫的所有尾隨文字引數都會傳遞到指定的 tworastuserfunc,並包含在 userargs 引數中。

[Note]

如需有關 VARIADIC 關鍵字的詳細資訊,請參閱 PostgreSQL 文件,以及查詢語言 (SQL) 函式的「具有可變數目引數的 SQL 函式」章節。

[Note]

無論您是否選擇將任何引數傳遞給您的使用者函式以進行處理,都必須使用 tworastuserfunctext[] 引數。

可用性:2.0.0

範例:在畫布上將柵格覆蓋為不同的波段

-- define our user defined function --
CREATE OR REPLACE FUNCTION raster_mapalgebra_union(
    rast1 double precision,
    rast2 double precision,
    pos integer[],
    VARIADIC userargs text[]
)
    RETURNS double precision
    AS $$
    DECLARE
    BEGIN
        CASE
            WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN
                RETURN ((rast1 + rast2)/2.);
            WHEN rast1 IS NULL AND rast2 IS NULL THEN
                RETURN NULL;
            WHEN rast1 IS NULL THEN
                RETURN rast2;
            ELSE
                RETURN rast1;
        END CASE;

        RETURN NULL;
    END;
    $$ LANGUAGE 'plpgsql' IMMUTABLE COST 1000;

-- prep our test table of rasters
DROP TABLE IF EXISTS map_shapes;
CREATE TABLE map_shapes(rid serial PRIMARY KEY, rast raster, bnum integer, descrip text);
INSERT INTO map_shapes(rast,bnum, descrip)
WITH mygeoms
    AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(90,90),30) As geom, 'circle' As descrip
            UNION ALL
            SELECT 3 AS bnum,
                ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 15) As geom, 'big road' As descrip
            UNION ALL
            SELECT 1 As bnum,
                ST_Translate(ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 8,'join=bevel'), 10,-6) As geom, 'small road' As descrip
            ),
   -- define our canvas to be 1 to 1 pixel to geometry
   canvas
    AS ( SELECT ST_AddBand(ST_MakeEmptyRaster(250,
        250,
        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
            )
-- return our rasters aligned with our canvas
SELECT ST_AsRaster(m.geom, canvas.rast, '8BUI', 240) As rast, bnum, descrip
                FROM mygeoms AS m CROSS JOIN canvas
UNION ALL
SELECT canvas.rast, 4, 'canvas'
FROM canvas;

-- Map algebra on single band rasters and then collect with ST_AddBand
INSERT INTO map_shapes(rast,bnum,descrip)
SELECT ST_AddBand(ST_AddBand(rasts[1], rasts[2]),rasts[3]), 4, 'map bands overlay fct union (canvas)'
    FROM (SELECT ARRAY(SELECT ST_MapAlgebraFct(m1.rast, m2.rast,
            'raster_mapalgebra_union(double precision, double precision, integer[], text[])'::regprocedure, '8BUI', 'FIRST')
                FROM map_shapes As m1 CROSS JOIN map_shapes As m2
    WHERE m1.descrip = 'canvas' AND m2.descrip <> 'canvas' ORDER BY m2.bnum) As rasts) As foo;

地圖波段疊加(畫布)(R:小路,G:圓形,B:大路)

使用者定義函式,接受額外的引數

CREATE OR REPLACE FUNCTION raster_mapalgebra_userargs(
    rast1 double precision,
    rast2 double precision,
    pos integer[],
    VARIADIC userargs text[]
)
    RETURNS double precision
    AS $$
    DECLARE
    BEGIN
        CASE
            WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN
                RETURN least(userargs[1]::integer,(rast1 + rast2)/2.);
            WHEN rast1 IS NULL AND rast2 IS NULL THEN
                RETURN userargs[2]::integer;
            WHEN rast1 IS NULL THEN
                RETURN greatest(rast2,random()*userargs[3]::integer)::integer;
            ELSE
                RETURN greatest(rast1, random()*userargs[4]::integer)::integer;
        END CASE;

        RETURN NULL;
    END;
    $$ LANGUAGE 'plpgsql' VOLATILE COST 1000;

SELECT ST_MapAlgebraFct(m1.rast, 1, m1.rast, 3,
            'raster_mapalgebra_userargs(double precision, double precision, integer[], text[])'::regprocedure,
                '8BUI', 'INTERSECT', '100','200','200','0')
                FROM map_shapes As m1
    WHERE m1.descrip = 'map bands overlay fct union (canvas)';
                    

使用者定義,具有額外的引數,且來自同一個柵格的不同波段