工作流:更新 ST_Raster 值中的像素数据
像素数据编辑工作流涉及以下操作:
- 从 ST_Raster 值中提取 ST_PixelData
- 编辑 ST_PixelData 的像素
- 将编辑后的 ST_PixelData 像素写回到 ST_Raster 值中
您可以将 ST_PixelData 提取到变量中,还可以将其插入到像素表中。如果将值提取到变量中,则所有这三个步骤可以作为同一 SQL 语句的一部分来完成。如果将值插入到表中,则会保留该值,您可以分开执行工作流的每一步。
要完成该工作流,请使用 ST_Raster getPixelData 函数从 ST_Raster 值提取 ST_PixelData,然后使用 ST_Raster 镶嵌函数将其回写。
通过 ST_PixelData 临时变量更新 ST_Raster 值
可声明一个 ST_PixelData 变量,然后使用 getPixelData 函数从 ST_Raster 值中将 ST_PixelData 提取到该变量中。
步骤:
-
声明一个变量,将像素数据提取到该变量中,编辑这些像素,然后将变更值镶嵌回 ST_Raster 值中。
在这些示例中,从 urban_area 表的 ST_Raster 列提取 ST_PixelData 值,然后插入到 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_PixelData 列更新 ST_Raster 值
可将 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);
- 在 INSERT 语句内部使用 getPixelData 函数,将 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 表中的变更值镶嵌到 urban_area 表的 ST_Raster 值中。
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;
相关主题
3/7/2012