工作流:使用 SQL 创建栅格目录

复杂程度: 高级 数据要求: 使用自己的数据 目标: 了解如何创建栅格表、初始化表中的 ST_Raster 列、向表中添加记录、对 ST_Raster 构建金字塔和统计数据、然后将表注册到地理数据库,从而创建栅格目录。

栅格目录是 ArcObjects 组件,用于存储具有空间参考的栅格数据集。遵循本主题中提供的工作流,可以通过 SQL 使用 ST_Raster 类型创建并填充栅格目录。

下面每个部分都包含在每个数据库管理系统中完成创建栅格目录的任务的示例。可修改这些示例以匹配您的数据。

创建包含 ST_Raster 列的表

步骤:
  1. 打开 SQL 编辑器,例如 SQL*Plus for Oracle、pgsql for PostgreSQL 或 pgAdminIII for PostgreSQL,或者在 Microsoft Management Studio for SQL Server 中打开“查询编辑器”窗口。
  2. 使用 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 栅格目录对象进行访问。

步骤:
  1. 使用 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 类型。

步骤:
  1. 使用 SQL INSERT 语句向 ST_Raster 列中插入图像。确保使用您自己的 TIFF 文件来代替 milwaukee.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 文件指定的路径对于数据库和文件所在的服务器有效。

  2. 此时可应用多条 INSERT 语句,或者可通过 UPDATE 语句将 ST_Raster 镶嵌函数应用于现有的栅格列值。重复这些语句,直到所有数据都加载到 ST_Raster 列中。
  3. 使用 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 子句限定要构建金字塔的栅格值。

所有金字塔均使用双线性金字塔插值法进行构建。

步骤:
  1. 使用 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 子句。

步骤:
  1. 在 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';
    

默认情况下,将在栅格值的基础等级计算统计数据,这将提供最准确的统计数据结果。为了节省时间可在指定的金字塔等级计算统计数据,但这样准确性可能降低。使用的金字塔等级越高,计算统计数据的速度越快,但代价是统计数据的准确性降低。当然,需要构建了指定的金字塔等级才能在其上计算统计数据。

步骤:
  1. 使用 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';
    

将表注册到地理数据库

包含单个空间参考栅格列的任何表都可转换为 ArcObjects 栅格目录。ST_Raster_Util 初始化函数将栅格列注册到 ArcSDE,并且执行该函数后,即可通过将表注册到地理数据库来将表转换为栅格目录。由于此工作流示例中的栅格列已初始化,因此可将其注册到地理数据库。

使用 ArcGIS for Desktop 将表注册到地理数据库,从而创建栅格目录。

步骤:
  1. 启动 ArcMap 并打开 Catalog 窗口,或启动 ArcCatalog。
  2. 连接到包含 urban_area 表的地理数据库。

    在目录树中的数据库连接节点下创建地理数据库连接。确保以 urban_area 表的所有者身份登录到地理数据库。

  3. 右键单击 urban_area 表,然后单击注册到地理数据库 (Geodatabase)
  4. 在出现的提示您将向表中添加 ObjectID 列的警告对话框中,单击

    地理数据库要求存在此唯一的非空 ObjectID 列。

表图标更改为栅格目录图标,表示表已转换为栅格目录。

更新数据库统计数据

为了获得最佳性能,进行更新或查询时,ArcSDE 都将依靠 DBMS 基于成本的优化器来选择适当的执行计划。基于成本的优化器反过来依靠最新的 DBMS 统计数据来选择最佳执行计划。

更新地理数据库中数据的 DBMS 统计数据的最简单方法是通过 ArcGIS。可使用分析数据集地理处理工具(从 ArcGIS for Desktop 中的“分析”命令打开)来更新统计数据。

步骤:
  1. 启动 ArcCatalog 或 ArcMap,然后打开“目录”窗口。
  2. 连接到包含 urban_area 栅格目录的数据库。

    确保以栅格目录所有者的身份进行连接。

  3. 右键单击 urban_area 栅格目录。
  4. 指向管理并单击分析
  5. 确保在待分析数据集列表中选中 urban_area 栅格目录,然后单击列表外部。
  6. 选中分析基表以更新栅格基表中的统计数据。
  7. 单击确定

相关主题

5/25/2014