工作流:将栅格数据镶嵌到现有 ST_Raster 值
可使用 SQL UPDATE 语句和 ST_Raster mosaic 函数将栅格镶嵌到现有 ST_Raster 值。可将图像文件、包含多幅图像的文件夹或从其他 ST_Raster 列提取的值用作输入,以将栅格镶嵌到现有值。
不过,在将栅格镶嵌到现有值之前,必须从现有 ST_Raster 值中移除色彩映射表(如果存在的话)。执行完镶嵌操作之后,可将色彩映射表添回到 ST_Raster 值中。
本主题中的示例说明如何从 urban_area 表中的特定记录里移除色彩映射表,将栅格添加到这些记录中的栅格值里,然后重新应用色彩映射表。
移除色彩映射表
使用 ST_Raster deleteColormap 函数可从 ST_Raster 值中移除色彩映射表。
必须先执行此操作才能将附加栅格镶嵌到指定表中的栅格值中。
-
使用 UPDATE SQL 语句执行 deleteColormap 函数,从 urban_area 表中名称等于 ALL_CITIES 的行的栅格值中移除色彩映射表。
Oracle
UPDATE URBAN_AREA t SET RASTER = t.raster.deleteColormap() WHERE NAME = 'ALL_CITIES';
PostgreSQL
UPDATE urban_area SET raster = deleteColormap(raster) WHERE name = 'all_cities';
SQL Server
UPDATE urban_area SET raster = deleteColormap() WHERE name = 'all_cities';
成功执行完 deleteColormap 之后,栅格值将渲染为灰度值而不是色彩映射值。
将更多栅格数据镶嵌到现有 ST_Raster 值
镶嵌操作以迭代方式将更多栅格数据添加到现有栅格值中。通过这种方式,栅格值可增长到超过数兆兆字节;栅格值仅受到数据库管理系统 (DBMS) 存储容量的限制。
示例 1:将文件夹中的所有栅格插入 ST_Raster 列
可在 SQL UPDATE 语句中使用 mosaic 函数的递归选项,实现在指定文件夹中反复扫描指定类型的文件。在这些示例中,会在 cities 文件夹中以递归方式搜索扩展名为 .tif 的所有文件。然后,将这些文件镶嵌到 urban_area 表中标识为 all_cities 的栅格值中。
-
使用 mosaic 函数和递归选项将指定文件夹下的所有 .tif 文件镶嵌到现有 ST_Raster 值中。
Oracle
UPDATE URBAN_AREA t SET RASTER = t.raster.mosaic('E:\cities\*.tif', 'recursive,log=E:\log.txt') WHERE NAME = 'ALL_CITIES';
PostgreSQL
UPDATE urban_area SET raster = mosaic(image,'E:\data\*.tif', 'recursive,log=E:\log.txt') WHERE name = 'all_cities';
SQL Server
UPDATE urban_area SET raster = raster.mosaic('E:\data\*.tif',NULL, 'recursive,log=E:\log.txt') WHERE name = 'all_cities';
示例 2:提取 ST_PixelData 并将其添加到 ST_Raster 列
将 japan 表(name 列值为 tokyo)中 raster 列的像素的第一个金字塔等级镶嵌到 name 列值为 all_cities 的 urban_area 表的 raster 列。在这种情况下,ST_Raster getPixelData 函数会从 ST_Raster 值中将 ST_PixelData 值提取到名为 data 的预定义 ST_PixelData 变量中。该变量随后将传递到 ST_Raster 构造函数中,从而转换回 ST_Raster 格式。
-
使用 getPixelData 函数从 japan 表中的 ST_Raster 值中提取 ST_PixelData 值,然后将该值插入 urban_area 表的栅格值中。
Oracle
DECLARE data ST_PIXELDATA; BEGIN SELECT t.raster.getPixelData('level=1') INTO data FROM JAPAN t WHERE NAME = 'TOKYO'; UPDATE URBAN_AREA t SET image = t.raster.mosaic(data,'log=E:\log.txt') WHERE NAME = 'ALL_CITIES'; END; /
PostgreSQL
DROP FUNCTION IF EXISTS mosaic_from_pixeldata(); CREATE OR REPLACE FUNCTION mosaic_from_pixeldata() RETURNS integer AS ' DECLARE data sde.st_pixeldata; BEGIN SELECT getPixelData(image) INTO data FROM japan WHERE name = 'tokyo'; UPDATE urban_area SET raster = mosaic(raster,data,''log=E:\log.txt'') WHERE name = ''all_cities''; END;' LANGUAGE plpgsql; SELECT mosaic_from_pixeldata(); DROP FUNCTION IF EXISTS mosaic_from_pixeldata();
SQL Server
DECLARE @data ST_PIXELDATA; SET @data = (SELECT raster.getPixelData('level=1') FROM japan WHERE name = 'tokyo'); UPDATE urban_area SET raster = raster.mosaic(NULL,@data,'log=E:\log.txt');
将色彩映射表应用于更新后的 ST_Raster 值
更新完 ST_Raster 值之后,可重新应用色彩映射表来定义用于显示栅格值的色彩。使用 setColormap 函数将色彩映射表重新应用到栅格。
setColormap 函数要求使用 TIFF 影像文件作为输入。在下列示例中,citycolors.tif 文件中的色彩映射表用于向 urban_area 表中所有名称值等于 all_cities 的行的栅格值中添加色彩映射表。
-
使用 UPDATE SQL 语句和 citycolors.tif 输入影像文件,将色彩映射表添加到含有名称值等于 all_cities 的 urban_area 表中的记录中。
Oracle
UPDATE URBAN_AREA t SET raster = t.raster.setColormap('/net/gis/gis1/citycolors.tif') WHERE name = 'ALL_CITIES';
PostgreSQL
UPDATE urban_area SET raster = setColormap(raster,'/net/gis/gis1/citycolors.tif') WHERE name = 'all_cities';
SQL Server
UPDATE urban_area SET raster = raster.setColormap('/net/gis/gis1/citycolors.tif') WHERE name = 'all_cities';