Workflow : mise à jour des données de pixel dans une valeur ST_Raster
Le workflow de mise à jour des données de pixels implique les éléments suivants :
- Récupération de ST_PixelData d'une valeur ST_Raster
- Mise à jour des pixels de ST_PixelData
- Réécriture des pixels modifiés de ST_PixelData sur la valeur ST_Raster
Vous pouvez récupérer ST_PixelData dans une variable ou l'insérer dans une table de pixels. Si vous récupérez la valeur dans une variable, les trois étapes peuvent être réalisées dans le cadre de la même instruction SQL. Si vous insérez la valeur dans une table, la valeur est conservée, ce qui vous permet de suivre séparément les étapes du workflow.
Pour effectuer ce workflow, utilisez la fonction getPixelData ST_Raster pour récupérer ST_PixelData de la valeur ST_Raster et utilisez la fonction mosaic ST_Raster pour la réécrire.
Mise à jour d'une valeur ST_Raster avec une variable ST_PixelData temporaire
Vous pouvez déclarer une variable ST_PixelData, puis utiliser la fonction getPixelData pour récupérer ST_PixelData d'une valeur ST_Raster dans la variable.
-
Déclarez une variable, récupérez les données de pixels dans la variable, modifiez les pixels, puis mosaïquez les valeurs modifiées sur la valeur ST_Raster.
Dans ces exemples, la valeur ST_PixelData est récupérée de la colonne ST_Raster de la table urban_area, insérée dans une variable ST_PixelData, modifiée, puis mosaïquée sur la valeur ST_Raster.
Oracle
--Define the variable. DECLARE p sde.st_pixeldata; --Fetch the ST_PixelData from the urban_area table into the variable. BEGIN SELECT t.raster.getPixelData() INTO p FROM URBAN_AREA t WHERE t.raster.rasterid = 1; --Reset pixel values FOR i IN 1..256 LOOP FOR j IN 1..256 LOOP IF(p.getvalue(1,i,j)=0) THEN p.setvalue(1,i,j,100); END IF; END LOOP; END LOOP; --Mosaic the altered pixels to the urban_area table. UPDATE URBAN_AREA t SET raster = t.raster.mosaic(p,'compression=lz77,level=-1,nearest') WHERE t.raster.raster_id = 1; END; /
PostgreSQL
--Drop the variable (function) if it already exists. DROP FUNCTION IF EXISTS edit_pixeldata(); --Define a varaible. CREATE OR REPLACE FUNCTION edit_pixeldata() RETURNS integer AS ' DECLARE p st_pixeldata; --Fetch the ST_PixelData from the urban_area table into the variable. BEGIN SELECT getPixelData(raster) INTO p FROM urban_area WHERE raster_id(raster) = 1; --Reset pixel values FOR i IN 1..256 LOOP FOR j IN 1..256 LOOP IF(getvalue(p,1,i,j)=0) THEN p := setvalue(p,1,i,j,100); END IF; END LOOP; END LOOP; --Mosaic the altered pixels to the urban_area table. UPDATE urban_area SET raster = mosaic(raster,p,''compression=lz77,level=-1,nearest'') WHERE raster_id(raster) = 1; END;' LANGUAGE plpgsql; --Drop the variable. SELECT edit_pixeldata(); DROP FUNCTION IF EXISTS edit_pixeldata();
SQL Server
--Define the variable. DECLARE @p ST_PIXELDATA, @i int, @j int; --Fetch the ST_PixelData from the urban_area table into the variable. SET @p = (SELECT raster.getPixelData(NULL) FROM raster.urban_area WHERE raster.raster_id = 1); --Reset pixel values. WHILE( @i<256) BEGIN WHILE(@j<256) BEGIN IF(@p.getValue(1,@i,@j)=0) SELECT @p = @p.setValue(1,@i,@j,100) SET @j=@j+1 END SET @i=@i+1 END --Mosaic the altered pixels to the urban_area table UPDATE raster.urban_area SET raster = raster.mosaic(NULL,@p,'compression=lz77,level=-1,nearest') WHERE raster.raster_id = 1;
Mise à jour d'une valeur ST_Raster avec une colonne ST_PixelData permanente
Vous pouvez récupérer la valeur ST_PixelData dans une table, la modifier, puis la mosaïquer sur la valeur ST_Raster. Cette opération se décompose en trois étapes distinctes.
Vous pouvez utiliser cette méthode si vous devez conserver la valeur récupérée dans la deuxième table.
- Créez une table pour stocker la valeur de données de pixels.
Dans ces exemples, une table nommée pixels est créée.
Oracle
CREATE TABLE pixels (pdata sde.ST_PixelData);
PostgreSQL
CREATE TABLE pixels (pdata sde.ST_PixelData);
SQL Server
CREATE TABLE pixels (pdata dbo.ST_PixelData);
- Utilisez la fonction getPixelData à l'intérieur d'une instruction INSERT pour récupérer ST_PixelData dans une colonne de pixel de la table pixels.
Dans ces exemples, la valeur ST_PixelData est récupérée dans la table pixels.
Oracle
INSERT INTO pixels (pdata) SELECT t.raster.getPixelData(), t.raster.raster_id FROM urban_area t WHERE t.raster.raster_id = 1;
PostgreSQL
INSERT INTO pixels (pdata) SELECT getPixelData(raster,'level=1') FROM urban_area WHERE raster_id(raster) = 1;
SQL Server
INSERT INTO pixels (pdata) SELECT raster.getPixelData('level=1') FROM urban_area WHERE raster.raster_id = 1;
- Récupérez la valeur de la table pixels sur une variable, mettez à jour les valeurs de pixel, puis réinsérez les valeurs modifiées dans la table pixels.
Oracle
DECLARE p sde.st_pixeldata; BEGIN SELECT pdata INTO p FROM PIXELS; FOR i IN 1..256 LOOP FOR j IN 1..256 LOOP IF(p.getvalue(1,i,j)=0) THEN p.setvalue(1,i,j,100); END IF; END LOOP; END LOOP; UPDATE PIXELS t SET pdata = p; END; /
PostgreSQL
DROP FUNCTION EXISTS edit_pixels(); CREATE OR REPLACE FUNCTION EDIT_PIXELS() RETURNS void AS ' DECLARE p st_pixeldata; BEGIN SELECT pdata INTO p FROM pixels; FOR i IN 1..256 LOOP FOR j IN 1..256 LOOP IF(getvalue(p,1,i,j)=0) THEN p := setvalue(p,1,i,j,100); END IF; END LOOP; END LOOP; UPDATE pixels SET pdata = p; END;' LANGUAGE plpgsql;
SQL Server
DECLARE @p sde.st_pixeldata, @i int, @j int; SET @p = (SELECT pdata FROM pixels); SET @i = 0; SET @j = 0; WHILE (@i<256) BEGIN WHILE (@j<256) BEGIN IF(@p.getValue(1,@i,@j)=0) SELECT @p=@p.setValue(1,@i,@j,100); SET @j=@j+1 END SET @i=@i+1 END UPDATE raster.pixels SET pdata = @p;
- Mosaïquez les valeurs modifiées de la table pixels sur la valeur ST_Raster de la table urban_area.
Oracle
DECLARE p sde.st_pixeldata; BEGIN SELECT pdata INTO p FROM PIXELS; UPDATE URBAN_AREA t SET raster = t.raster.mosaic(p,'compression=lz77,level=-1,nearest') WHERE t.raster.raster_id = 1; END; /
PostgreSQL
SELECT edit_pixels(); DROP FUNCTION IF EXISTS edit_pixels(); DROP FUNCTION IF EXISTS update_pixels(); CREATE OR REPLACE FUNCTION UPDATE_PIXELS() RETURNS void AS ' DECLARE p st_pixeldata; BEGIN SELECT pdata INTO p FROM pixels; UPDATE urban_area t SET raster = mosaic(raster,p, ''compression=lz77,level=-1,nearest'') WHERE raster_id(raster) = 1; END;' LANGUAGE plpgsql; SELECT update_pixels(); DROP FUNCTION IF EXISTS update_pixels();
SQL Server
DECLARE @p sde.ST_Pixeldata; SET @p = (SELECT pdata FROM pixels); UPDATE raster.urban_area SET raster = raster.mosaic(NULL,@p,'compression=lz77,level=-1,nearest') WHERE raster.raster_id = 1;