Workflow : mise à jour des données de pixel dans une valeur ST_Raster

Complexité : Intermédiaire Exigences relatives aux données : Utilisez vos propres données Objectif : Découvrez deux façons de récupérer ST_PixelData d'une valeur ST_Raster, de la modifier et de réécrire les pixels modifiés dans la valeur ST_Raster.

Le workflow de mise à jour des données de pixels implique les éléments suivants :

  1. Récupération de ST_PixelData d'une valeur ST_Raster
  2. Mise à jour des pixels de ST_PixelData
  3. 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.

Étapes :
  1. 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.

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

Rubriques associées


3/6/2012