ST_MapAlgebraFct — Version à 1 bande - Crée un nouveau raster à une bande formé par l'application d'une fonction PostgreSQL valide sur la bande d'entrée du raster et sur le type de pixel fourni. La bande 1 est utilisée si aucune bande n'est spécifiée.
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)
;
ST_MapAlgebraFct est obsolète depuis 2.1.0. Utilisez plutôt ST_MapAlgebra (callback function version). |
Crée un nouveau raster à une bande formé en appliquant une fonction PostgreSQL valide spécifiée par onerasteruserfunc
sur le raster d'entrée (rast
). Si aucune bande band
n'est spécifiée, la bande 1 est utilisée. Le nouveau raster aura la même géoréférence, la même largeur et la même hauteur que le raster original mais n'aura qu'une seule bande.
Si pixeltype
est fourni, le nouveau raster aura une bande de ce type de pixel. Si pixeltype est NULL, la nouvelle bande raster aura le même type de pixel que la bande d'entrée de rast
.
Le paramètre onerasteruserfunc
doit être le nom et la signature d'une fonction SQL ou PL/pgSQL, transformée en regprocedure. Un exemple de fonction PL/pgSQL très simple et assez inutile est le suivant :
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[]) RETURNS FLOAT AS $$ BEGIN RETURN 0.0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
La fonction utilisateur
peut accepter deux ou trois arguments : une valeur flottante, un tableau d'entiers facultatif et un tableau de texte variable. Le premier argument est la valeur d'une cellule matricielle individuelle (quel que soit le type de données matricielles). Le deuxième argument est la position de la cellule de traitement actuelle sous la forme '{x,y}'. Le troisième argument indique que tous les paramètres restants de ST_MapAlgebraFct doivent être transmis à la fonction utilisateur
.
Passer un argument de type regprodedure à une fonction SQL nécessite de passer la signature complète de la fonction, puis de la convertir en un type regprocedure. Pour passer la fonction PL/pgSQL ci-dessus en tant qu'argument, le code SQL de l'argument est le suivant :
'simple_function(float,integer[],text[])'::regprocedure
Notez que l'argument contient le nom de la fonction, les types des arguments de la fonction, des guillemets autour du nom et des types d'arguments, ainsi qu'un cast vers un regprocedure.
Le troisième paramètre de la fonction userfunction
est un tableau variadic text . Tous les arguments textuels supplémentaires de l'appel à ST_MapAlgebraFct sont transmis à userfunction
, et sont contenus dans l'argument args
.
Pour plus d'informations sur le mot-clé VARIADIC, veuillez vous référer à la documentation PostgreSQL et à la section "SQL Functions with Variable Numbers of Arguments" de Query Language (SQL) Functions. |
Le paramètre text[] de la fonction |
Disponibilité : 2.0.0
Crée une nouveau raster à 1 bande qui est une fonction modulo 2 de la bande du raster original.
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
Crée un nouveau raster à 1 bande de type de pixel 2BUI à partir d'un raster reclassifié avec la valeur nodata fixée via un paramètre passé à la fonction utilisateur (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
|
|
Crée un nouveau raster à 3 bandes de même type de pixel que le raster original à 3 bandes, la première bande étant modifiée par l'algèbre cartographique et les 2 bandes restantes n'étant pas modifiées.
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;
ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue