Flujo de trabajo: Actualizar los datos de píxel en un valor ST_Raster
El flujo de trabajo de edición de datos de píxel incluye:
- Capturar el ST_PixelData de un valor ST_Raster
- Editar los píxeles del ST_PixelData
- Escribir nuevamente los píxeles editados del ST_PixelData en el valor ST_Raster
Puede capturar el ST_PixelData en una variable o insertarlo en una tabla de píxel. Si captura el valor en una variable, se pueden hacer los tres pasos como parte de la misma declaración de SQL. Si inserta el valor en una tabla el valor se preserva, lo que le permite realizar los pasos del flujo de trabajo de manera separada.
Para completar este flujo de trabajo, use la función ST_Raster getPixelData para capturar el ST_PixelData a partir del valor ST_Raster, y utilice la función de mosaico ST_Raster para volver a escribirlo.
Actualizar el valor ST_Raster con una variable temporaria ST_PixelData
Puede declarar una variable ST_PixelData y después utilizar la función getPixelData para capturar el ST_PixelData desde un valor ST_Raster en una variable.
-
Declare una variable, capture los datos de píxel en la variable, edite los píxeles, y después vuelva a crear un mosaico con los valores modificados en el valor ST_Raster.
En estos ejemplos, el valor ST_PixelData se captura desde la columna ST_Raster de la tabla urban_area, se inserta en una variable ST_PixelData, se edita y se crea un mosaico en el valor 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;
Actualizar el valor ST_Raster con una columna ST_PixelData persistente
Puede capturar el valor ST_PixelData en una tabla, editarlo, y después crear nuevamente un mosaico en el valor ST_Raster. Esto se hace en tres pasos distintos.
Podría llevar a cabo esto si necesitara preservar el valor capturado en la segunda tabla.
- Cree una tabla para almacenar el valor de datos de píxel.
En estos ejemplos, se crea una tabla llamada pixels.
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);
- Utilice la función getPixelData que está dentro de la declaración INSERT para capturar el ST_PixelData en una columna de píxel de la tabla pixels.
En estos ejemplos, el valor ST_PixelData se captura en la tabla 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;
- Capture el valor desde la tabla pixels en una variable, actualice los valores de píxel, y después ubique nuevamente los valores modificados en la tabla 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;
- Cree un mosaico con los valores modificados de la tabla pixels en el valor ST_Raster de la tabla 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;