Name

ST_MapAlgebraFct — Version mit 2 Rasterbändern: Erstellt einen neuen Einzelbandraster, indem eine gültige PostgreSQL Funktion auf die 2 gegebenen Rasterbänder und den entsprechenden Pixeltyp angewendet wird. Wenn kein Band bestimmt ist, wird Band 1 angenommen. Wenn der "Extent"-Typ nicht angegeben ist, wird standardmäßig INTERSECTION angenommen.

Synopsis

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

Beschreibung

[Warning]

ST_MapAlgebraFct Seit der Version 2.1.0 überholt. Benutzen Sie stattdessen bitte ST_MapAlgebra (Rückruffunktion)

Erstellt einen neuen Raster mit einem Band, indem eine gültige PostgreSQL Funktion (tworastuserfunc) auf die Ausgangsraster (rast1, rast2) angewendet wird. Wenn band1 oder band2 nicht 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 oder kein Wert übergeben wird, dann hat das neue Rasterband denselben Pixeltyp wie das angegebene Band von rast1

Der Parameter tworastuserfunc muss den Namen und die Signatur einer SQL- oder einer PL/pgSQL-Funktion haben und eine Typumwandlung nach "regprocedure" aufweisen. Nachfolgend ein Beispiel für eine PL/pgSQL Funktion:

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;

Die tworastuserfunc akzeptiert drei oder vier Übergabewerte: einen Wert in "Double Precision", einen weiteren Wert in "Double Precision", ein optionales Integerfeld und ein variadisches Textfeld. Der erste Übergabewert entspricht dem Wert einer einzelnen Rasterzelle in rast1 (unabhängig vom Rastertyp). Der zweite Übergabewert entspricht einer einzelnen Rasterzelle in rast2. Der dritte Übergabewert gibt die Position der Rasterzelle in der Form '{x,y} an. Der vierte Übergabewert gibt an, ob alle übrigen Parameter von ST_MapAlgebraFct an tworastuserfunc weitergereicht werden sollen.

Wenn das Argument regprocedure an eine SQL Funktion übergeben werden soll, dann muss die gesamte Signatur der Funktion übergeben werden und anschließend in den Typ regprocedure umgewandelt werden. Um die PL/pgSQL-Funktion des oberen Beispiels als Argument zu übergeben lautet das SQL für dieses Argument:

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

Beachten Sie bitte, dass der Übergabewert unter Anführungszeichen gesetzt ist und den Funktionsnamen und die Datentypen der Funktionsargumente enthält; und dass der Datentyp nach regprocedure umgewandelt wird.

Der vierte Übergabewert an die Funktion tworastuserfunc ist ein Feld mit dem Datentyp variadic text. Alle an eine Funktion ST_MapAlgebraFct angehängten Parameter werden an die tworastuserfunc durchgereicht und sind in dem Übergabewert userargs 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 tworastuserfunc ist auch dann erforderlich, wenn Sie sonst keine Argumente für die Auswertung an an "userfunction" übergeben.

Verfügbarkeit: 2.0.0

Beispiel: Überlagerung von Rastern als Einzelbänder am Canvas

-- die benutzerdefinierte Funktion festlegen --
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;

-- die Testtabelle mit den Rastern aufbereiten
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
            ),
   -- den Canvas definieren - 1 Einheit im Canvas entspricht 1 Pixel
    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
            )
-- die am Canvas ausgerichteten Raster ausgeben
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 auf ein einzelnes Rasterband und mit ST_AddBand zusammenführen
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;
                                        

map bands overlay (Canvas) (R: schmale Straße, G: Kreis, B: breite Straße)

Eine benutzerdefinierte Funktion, die zusätzliche Übergabewerte entgegennimmt

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

Eine benutzerdefinierte Funktion mit zusätzlichen Übergabewerten und unterschiedlichen Bändern des gleichen Raster

Siehe auch

ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue