工作流:使用 SQL 创建栅格目录
栅格目录是 ArcObjects 组件,用于存储具有空间参考的栅格数据集。遵循本主题中提供的工作流,可以通过 SQL 使用 ST_Raster 类型创建并填充栅格目录。
下面每个部分都包含在每个数据库管理系统中完成创建栅格目录的任务的示例。可修改这些示例以匹配您的数据。
创建包含 ST_Raster 列的表
- 打开 SQL 编辑器,例如 SQL*Plus for Oracle、pgsql for PostgreSQL 或 pgAdminIII for PostgreSQL,或者在 Microsoft Management Studio for SQL Server 中打开“查询编辑器”窗口。
-
使用 CREATE TABLE 语句创建包含 ST_Raster 列和字符串列的表。
在这些示例中,将创建名为 urban_area 的表。该表包含两列:name 和 raster。
Oracle
CREATE TABLE urban_area (name varchar2(255), sde.st_raster raster);
PostgreSQL
CREATE TABLE urban_area (name varchar(255), sde.st_raster raster);
SQL Server
CREATE TABLE urban_area (name varchar(255), dbo.st_raster raster);
初始化 ST_Raster 列以存储栅格值
使用 ST_Raster_Util 初始化函数来初始化 ST_Raster 列。此函数将栅格列的参考添加到 ArcSDE 栅格元数据表中,并且创建栅格块表和栅格辅助表以及栅格列的插入、更新和删除触发器。执行此函数后,栅格列即注册到 ArcSDE,从而可用于其功能。将向 table_registry、column_registry 和 raster_columns 系统表中添加记录。但是,只有将栅格列注册到地理数据库才能作为 ArcGIS 栅格目录对象进行访问。
-
使用 ST_Raster 初始化工具对 urban_area 表中的 ST_Raster 列进行初始化。
Oracle
BEGIN SDE.ST_RASTER_UTIL.INITIALIZE ('urban_area','raster',4326,'defaults'); END; /
PostgreSQL
SELECT st_raster_util_initialize ('urban_area','raster',4326,'DEFAULTS');
SQL Server
EXEC ST_Raster_Util.Initialize 'sde','bobby','urban_area','raster',4326,NULL,'DEFAULTS'
将栅格值插入 ST_Raster 列
使用 INSERT 语句向表中添加行。
在这些示例中,使用字符串“MILWAUKEE”填充 name 列,ST_Raster 构造函数将 GeoTIFF 文件转换为 ST_Raster 类型。
-
使用 SQL INSERT 语句向 ST_Raster 列中插入图像。确保使用您自己的 TIFF 文件来代替 milwakee.tif。
Oracle
INSERT INTO URBAN_AREA ('MILWAUKEE',SDE.ST_RASTER('C:\milwaukee.tif')); COMMIT;
PostgreSQL
INSERT INTO urban_area ('milwaukee',sde.st_raster('C:\milwaukee.tif'));
SQL Server
INSERT INTO urban_area ('milwaukee',dbo.ST_Raster::construct('C:\milwaukee.tif'));
警告:确保为 TIFF 文件指定的路径对于数据库和文件所在的服务器有效。
-
使用 SQL UPDATE 语句镶嵌到现有栅格列。
Oracle
UPDATE URBAN_AREA T SET RASTER = T.RASTER.MOSAIC('C:\milwaukee2.tif') WHERE NAME = 'MILWAUKEE'; COMMIT;
PostgreSQL
UPDATE urban_area SET raster = mosaic(RASTER,'C:\milwaukee2.tif') WHERE name = 'milwaukee';
SQL Server
UPDATE urban_area SET raster = raster.mosaic('C:\milwaukee2.tif') WHERE name = 'milwaukee';
构建金字塔
加载完源数据后,使用 ST_Raster buildPyramid 函数构建金字塔。可以为所有栅格值构建金字塔,也可以使用 WHERE 子句限定要构建金字塔的栅格值。
所有金字塔均使用双线性金字塔插值法进行构建。
-
使用 buildPyramid 函数。
在这些示例中,指定了 WHERE 子句来限定哪些栅格值必须使用最邻近插值法或双线性插值法来构建金字塔。
Oracle
UPDATE URBAN_AREA T SET RASTER = T.RASTER.BUILDPYRAMID('nearest,level=-1') WHERE NAME = 'MILWAUKEE'; COMMIT; UPDATE URBAN_AREA T SET RASTER = T.RASTER.BUILDPYRAMID('bilinear,level=-1') WHERE NAME = 'TOKYO'; COMMIT;
PostgreSQL
UPDATE urban_area SET raster = buildpyramid(raster,'nearest,level=-1') WHERE name = 'milwaukee'; UPDATE urban_area SET raster = buildpyramid(raster,'bilinear,level=-1') WHERE name = 'tokyo';
SQL Server
UPDATE urban_area SET raster = raster.buildPyramid('bilinear,level=-1') WHERE name = 'milwaukee'; UPDATE urban_area SET raster = raster.buildPyramid('nearest,level=-1') WHERE name = 'tokyo';
构建栅格统计数据
一些栅格数据需要通过显示渲染器拉伸,以使其可分辨。否则,这些数据将显示为黑色、灰色或白色。此类数据需要构建栅格统计数据。可在 UPDATE 语句中通过 ST_Raster buildStats 函数完成此操作。
如果必须限定表的哪些行需要构建统计数据,请使用 WHERE 子句。
-
在 SQL UPDATE 语句中使用 buildStats 函数。
Oracle
UPDATE URBAN_AREA T SET RASTER = T.RASTER.BUILDSTATS() WHERE NAME = 'MILWAUKEE'; COMMIT;
PostgreSQL
UPDATE urban_area SET raster = buildstats(raster) WHERE name = 'milwaukee';
SQL Server
UPDATE urban_area SET raster = raster.buildStats(NULL) WHERE name = 'milwaukee';
默认情况下,将在栅格值的基础等级计算统计数据,这将提供最准确的统计数据结果。为了节省时间可在指定的金字塔等级计算统计数据,但这样准确性可能降低。使用的金字塔等级越高,计算统计数据的速度越快,但代价是统计数据的准确性降低。当然,需要构建了指定的金字塔等级才能在其上计算统计数据。
-
使用 buildStats 函数并提供要在其上构建统计数据的等级。
在这些示例中,将在第六个金字塔等级上计算统计数据。
提示:如果未包括任何等级,则默认为基础等级,该等级可指定为值 0。
Oracle
UPDATE URBAN_AREA T SET RASTER = T.RASTER.BUILDSTATS(6) WHERE NAME = 'MILWAUKEE';
PostgreSQL
UPDATE urban_area SET raster = buildstats(raster,6) WHERE name = 'milwaukee';
SQL Server
UPDATE urban_area SET raster = buildStats.raster(6) WHERE name = 'milwaukee';
将表注册到地理数据库
包含已注册到 ArcSDE 的单个空间参考栅格列的任何表都可转换为 ArcObjects 栅格目录。ST_Raster_Util 初始化函数将栅格列注册到 ArcSDE,并且执行该函数后,即可通过将表注册到地理数据库来将表转换为栅格目录。由于此工作流示例中的栅格列已初始化,因此可将其注册到地理数据库。
使用 ArcGIS Desktop 将表注册到地理数据库,从而创建栅格目录。
- 启动 ArcMap 并打开 Catalog 窗口,或启动 ArcCatalog。
-
连接到包含 urban_area 表的地理数据库。
在目录树中的数据库连接节点下创建地理数据库连接。确保以 urban_area 表的所有者身份登录到地理数据库。
- 右键单击 urban_area 表,然后单击注册到地理数据库 (Geodatabase)。
-
在出现的提示您将向表中添加对象 ID 列的警告对话框中,单击是。
地理数据库要求存在此唯一的非空对象 ID 列。
表图标更改为栅格目录图标,表示表已转换为栅格目录。
更新数据库统计数据
为了获得最佳性能,进行更新或查询时,ArcSDE 都将依靠 DBMS 基于成本的优化器来选择适当的执行计划。基于成本的优化器反过来依靠最新的 DBMS 统计数据来选择最佳执行计划。
更新地理数据库中数据的 DBMS 统计数据的最简单方法是通过 ArcCatalog 图形用户界面。使用 ArcGIS Desktop 中的“分析”命令更新统计数据。
- 在目录树的数据库连接节点下,右键单击地理数据库中的 urban_areas 栅格目录。
- 单击分析。
- 选中栅格表和业务表复选框。
- 单击确定。