Arbeitsablauf: Aktualisieren der Pixeldaten in einem ST_Raster-Wert

Komplexität: Fortgeschritten Erforderliche Daten: Eigene Daten verwenden Ziel: Sie haben zwei Möglichkeiten, "ST_PixelData" aus einem ST_Raster-Wert zu extrahieren, zu bearbeiten und die bearbeiteten Pixel zurück in den ST_Raster-Wert zu schreiben.

Die Bearbeitung der Pixeldaten beinhaltet Folgendes:

  1. Abrufen der "ST_PixelData" aus einem ST_Raster-Wert
  2. Bearbeiten der Pixel der "ST_PixelData"
  3. Schreiben der bearbeiteten Pixel der "ST_PixelData" zurück in den ST_Raster-Wert

Sie können die "ST_PixelData" in eine Variable extrahieren oder in eine Pixeltabelle einfügen. Wenn Sie den Wert in eine Variable extrahieren, können alle drei Schritte als Teil der gleichen SQL-Anweisung ausgeführt werden. Wenn Sie den Wert in eine Tabelle einfügen, wird der Wert beibehalten. Sie können die einzelnen Schritte separat ausführen.

Extrahieren Sie mit der ST_Raster-Funktion "getPixelData" die "ST_PixelData" aus dem ST_Raster-Wert, und schreiben Sie sie mithilfe der ST_Raster-Funktion "Mosaik" zurück.

Aktualisieren eines ST_Raster-Wertes mit der temporären Variable "ST_PixelData"

Sie können die Variable "ST_PixelData" angeben und dann die "ST_PixelData" mit der Funktion "getPixelData" aus einem ST_Raster-Wert in die Variable extrahieren.

Schritte:
  1. Geben Sie eine Variable an, extrahieren Sie die Pixeldaten in die Variable, bearbeiten Sie die Pixel, und mosaikieren Sie die geänderten Werte dann zurück zum ST_Raster-Wert.

    In diesen Beispielen wird der ST_PixelData-Wert aus der ST_Raster-Spalte der Tabelle "urban_area" extrahiert, in die Variable "ST_PixelData" eingefügt, bearbeitet und zurück zum ST_Raster-Wert mosaikiert.

    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;

Aktualisieren eines ST_Raster-Wertes mit der dauerhaften Spalte "ST_PixelData"

Sie können den ST_PixelData-Wert in eine Tabelle extrahieren, bearbeiten und dann zurück zum ST_Raster-Wert mosaikieren. Dies erfolgt in drei separaten Schritten.

Sie können auf diese Weise den extrahierten Wert in der zweiten Tabelle beibehalten.

Schritte:
  1. Erstellen Sie eine Tabelle, um den Pixeldaten-Wert zu speichern.

    In diesen Beispielen wird die Tabelle "pixels" erstellt.

    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. Verwenden Sie die Funktion "getPixelData" in einer INSERT-Anweisung, um die "ST_PixelData" für eine Pixelspalte in der Pixeltabelle zu extrahieren.

    In diesen Beispielen wird der ST_PixelData-Wert in die Pixeltabelle extrahiert.

    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. Extrahieren Sie den Wert aus der Pixeltabelle in eine Variable, aktualisieren Sie die Pixelwerte, und fügen Sie die geänderten Werte dann wieder in der Pixeltabelle ein.

    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. Mosaikieren Sie die geänderten Werte der Pixeltabelle zum ST_Raster-Wert in der Tabelle "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;

Verwandte Themen


3/6/2012