Name

ST_MapAlgebraFct — Version mit 1 Rasterband: Erzeugt ein neues Rasterband, dass über eine gültige PostgreSQL Funktion für ein gegebenes Rasterband und Pixeltyp erstellt wird. Wenn kein Band bestimmt ist, wird Band 1 angenommen.

Synopsis

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

Beschreibung

[Warning]

ST_MapAlgebraFct Seit der Version 2.1.0 überholt. Benutzen Sie stattdessen bitte ST_MapAlgebra (callback function version)

Erstellt einen neuen Raster mit einem Band, indem eine gültige PostgreSQL Funktion durch tworastuserfunc spezifiziert und auf den gegebenen Raster (rast) angewendet wird. Wenn kein Band angegeben ist, wird Band 1 angenommen. Der Zielraster hat die selbe Georeferenzierung, Breite und Höhe wie der ursprüngliche Raster, hat aber nur ein Band.

Wenn pixeltype angegeben ist, dann hat das Band des neuen Rasters diesen Pixeltyp. Wenn für den Pixeltyp NULL übergeben wird, dann hat das neue Rasterband denselben Pixeltyp wie das gegebene Band von rast

Der Parameter onerasteruserfunc muss der Name und die Signatur einer SQL- oder PL/pgSQL-Funktion sein, die in eine regprocedure umgewandelt wird. Ein sehr einfaches und ziemlich nutzloses PL/pgSQL-Funktionsbeispiel ist:

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

Die Benutzerfunktion kann zwei oder drei Argumente akzeptieren: einen Float-Wert, ein optionales Integer-Array und ein variables Text-Array. Das erste Argument ist der Wert einer einzelnen Rasterzelle (unabhängig vom Rasterdatentyp). Das zweite Argument ist die Position der aktuellen Verarbeitungszelle in der Form '{x,y}'. Das dritte Argument gibt an, dass alle übrigen Parameter an ST_MapAlgebraFct an die Benutzerfunktion weitergegeben werden sollen.

Die Übergabe eines regprodedure Arguments an eine SQL-Funktion erfordert die Übergabe der vollständigen Funktionssignatur und die anschließende Umwandlung in einen regprocedure Typ. Um die obige Beispiel-PL/pgSQL-Funktion als Argument zu übergeben, lautet das SQL für das Argument:

'simple_function(float,integer[],text[])'::regprocedure

Beachten Sie, dass das Argument den Namen der Funktion, die Typen der Funktionsargumente, Anführungszeichen um den Namen und die Argumenttypen sowie einen Cast in eine regprocedure enthält.

Der dritte Übergabewert an die Funktion userfunction ist ein Feld vom Datentyp variadic text. Alle an einen Funktionsaufruf von ST_MapAlgebraFct angehängten Parameter werden an die spezifizierte userfunction durchgereicht und sind in dem Übergabewert args enthalten.

[Note]

Für nähere Information zu dem Schlüsselwort VARIADIC, sehen Sie bitte die PostgreSQL Dokumentation und den Abschnitt "SQL Functions with Variable Numbers of Arguments" unter Query Language (SQL) Functions.

[Note]

Der Übergabewert text[] an die userfunction ist auch dann erforderlich, wenn Sie sonst keine Argumente für die Auswertung an an "userfunction" übergeben.

Verfügbarkeit: 2.0.0

Beispiele

Erzeugt einen Einzelbandraster, der sich durch die Anwendung der Funktion "modulo 2" auf das ursprüngliche Rasterband ergibt.

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
                    

Erzeugt einen neuen Raster mit einem Band und mit dem Pixeltyp 2BUI. Der ursprüngliche Raster wird dabei neu klassifiziert und der NODATA Wert wird an die "user function" (0) übergeben.

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

Original (Spalte "rast_view")

rast_view_ma

Erzeugt einen neuen Raster mit 3 Bändern und demselben Pixeltyp als unser ursprünglicher Raster mit 3 Bändern. Das erste Band wird über einen Map Algebra Ausdruck geändert, die verbleibenden 2 Bänder sind unverändert.

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;