Flujo de trabajo: Actualizar los datos de píxel en un valor ST_Raster

Complejidad: Intermedio Requisitos de datos: Usar datos propios Objetivo: Aprenda dos maneras de capturar ST_PixelData de un valor ST_Raster, editarlo, y escribir nuevamente los píxeles editados en el valor ST_Raster.

El flujo de trabajo de edición de datos de píxel incluye:

  1. Capturar el ST_PixelData de un valor ST_Raster
  2. Editar los píxeles del ST_PixelData
  3. 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.

Pasos:
  1. 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.

Pasos:
  1. 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);
  2. 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;
  3. 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;
  4. 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;

Temas relacionados


7/11/2012