Рабочий процесс: обновление данных пикселов в значении ST_Raster
Рабочий процесс: редактирования данных пикселов состоит из следующих действий:
- Получение ST_PixelData из значения ST_Raster
- Редактирование пикселов ST_PixelData
- Запись отредактированных пикселов ST_PixelData обратно в значение ST_Raster
Можно получить данные ST_PixelData в переменную или вставить их в таблицу пикселов. Если получить значение в переменную, все три шага можно выполнить в рамках одного выражения SQL. Если вставить значение в таблицу, значение сохраняется, что позволяет выполнить шаги этого рабочего процесса отдельно.
Чтобы завершить этот рабочий процесс, используйте функцию ST_Raster getPixelData для получения ST_PixelData из значения ST_Raster и использования функции мозаики ST_Raster для записывания их обратно.
Обновление значения ST_Raster с помощью временной переменной ST_PixelData
Можно объявить переменную ST_PixelData, затем использовать функцию getPixelData для получения ST_PixelData из значения ST_Raster в переменную.
-
Объявите переменную, получите данные пикселов в переменную, измените пикселы, затем поместите измененные значения обратно в значение ST_Raster в виде мозаики.
В этих примерах значение ST_PixelData извлекается из столбца ST_Raster таблицы urban_area, вставляется в переменную ST_PixelData, редактируется и помещается обратно в значение 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;
Обновление значения ST_Raster с помощью постоянного столбца ST_PixelData
Можно получить значение ST_PixelData в таблицу, отредактировать его, затем поместить обратно в значение ST_Raster в виде мозаики. Это делается в три отдельных шага.
Эту процедуру можно выполнить, если вам необходимо сохранить полученное значение во второй таблице.
- Создайте таблицу для хранения значения данных пикселов.
В этих примерах создается таблица 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);
- Используйте функцию getPixelData в рамках выражения INSERT для получения ST_PixelData в столбец пикселов таблицы pixels.
В этих примерах значение ST_PixelData получается в таблицу 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;
- Получите значение из таблицы pixels в переменную, обновите значения пикселов, затем поместите измененные значения обратно в таблицу 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;
- Поместите измененные значения из таблицы pixels в значение ST_Raster таблицы 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;