遥感影像数据管理(二)
ArcSDE 9.2
美国环境系统研究所公司(Environmental Systems Research Institute, Inc. 简称ESRI公司)是世界最大的地理信息系统(Geographic Information System,GIS)技术提供商。其产品体系非常庞大,ArcSDE是一个从ARC/INFO系列中SDE产品发展而来的,历经数十年的改进,目前成为主要用于访问存储于关系数据库管理系统(RDBMS)中的海量多用户地理数据库的服务器软件产品。它是ArcGIS 中所集成的一部分,也是任何企业GIS 解决方案中的核心要素。ArcSDE是ArcGIS与关系数据库之间的GIS通道,它允许用户在多种数据管理系统中管理地理信息,并使所有的ArcGIS应用程序都能够使用这些数据; 同时,ArcSDE是多用户ArcGIS系统的一个关键部件,它为DBMS提供了一个开放接口,允许ArcGIS在多种数据库平台上管理地理信息。最新的ArcSDE9.2版本支持的数据库平台包括Oracle,Oracle with Spatial/Locator,Microsoft SQL Server, IBM DB2,和Informix。
1 ArcSDE介绍
Ø 运行在关系数据库上的实现空间数据管理的网关
Ø 提供GIS客户端和关系数据库通讯手段
Ø 空间数据库中心
– 管理大型,连续空间数据
– 快速空间查找
– 多源空间数据存储和管理方案
ArcSDE对栅格数据的管理提供了很好的支持。
Ø 能够将ArcGIS支持的任何栅格数据导入到多用户 (SDE) GeoDatabase
Ø 加载的工具在 ArcToolbox, ArcCatalog中
– 创建金字塔索引
– 将多个栅格数据组合成一个栅格数据
Ø 栅格数据只能被存储在企业GeoDatabases中
ArcSDE将遥感影像分块储存:
Ø ArcSDE 把影像分成块
– 自动分块
Ø 块号自定义缺省128x128
Ø 以块为单位存取
– 每块存在SDE_BLK_<id>中存为一个记录
Ø 通过块号存取
– 于矢量的GX,GY类似
2 体系结构
通过ArcSDE可以实现用关系型数据库管理系统(RDBMS)管理空间数据。在RDBMS中融入空间数据后,ArcSDE可以提供对空间、非空间数据进行高效操作的数据库服务。ArcSDE采用Clinet/Server体系结构,适于大量用户同时并发地对同一数据进行操作。ArcSDE的体系结构如图所示:
3 实现部分
大体实现思路如下:
Ø 利用ArcGIS公司提供的ArcCatalog软件,连接已经构建数据库环境,建立Raster Catalog并连接数据库;
Ø 利用ArcGIS公司的Developer Kit在.NET环境下提供的ArcGIS Windows Forms开发
3.1 建立Raster Catalog
1、构建数据库环境
本文采用的是Oracle10g。在安装ArcSDE的过程中,会逐步创建SDE用户,并为其创建专门表空间和相应的表,大部分只需要按照缺省参数即可。在创建完SDE用户后,会创建一个sde_esri的服务程序,用于连接Oracle。
2、连接数据库
在ArcCatalog软件中,选择Add Spatial Database Connection。
3、创建Raster Catalog
选择New Raster Catalog。
4、导入栅格数据
需要声明的是:上述操作中,除了构建数据库以外,其他步骤均可在.NET中用程序实现,可见ArcSDE提供了很多很强大的操作类。
3.2 .NET下开发
1、利用ArcGIS公司的Developer Kit在.NET环境下提供的ArcGIS Windows Forms开发
2、几个关键函数
1)、//连接GeoDatabase
private IRasterWorkspaceEx OpenSDEGeodatabase()
{
IPropertySet pConn = new PropertySet();
pConn.SetProperty("server", "dbrg-32k-8");
pConn.SetProperty("instance", "esri_sde");
pConn.SetProperty("user", "sde");
pConn.SetProperty("password", "cg");
pConn.SetProperty("version", "sde.DEFAULT");
IWorkspaceFactory pFact = new SdeWorkspaceFactory();
return (IRasterWorkspaceEx)pFact.Open(pConn, 0);
}
2)、//连接Raster Catalog
private void LoadDirtoRasterCatalog(object outRasterCatalog, string inputDir)
{
//Initialize GeoProcessor
ESRI.ArcGIS.Geoprocessor.Geoprocessor geoProcessor = new ESRI.ArcGIS.Geoprocessor.Geoprocessor();
//CreateRasterCatalog GP tool
WorkspaceToRasterCatalog workspaceToRasterCatalog = new WorkspaceToRasterCatalog();
//Set parameters
workspaceToRasterCatalog.in_raster_catalog = outRasterCatalog;
workspaceToRasterCatalog.in_workspace = inputDir;
//Execute the tool to load rasters in the directory to raster catalog
geoProcessor.Execute(workspaceToRasterCatalog, null);
}
3)、//显示栅格数据
private void AddRasterCatalogLayer(ESRI.ArcGIS.Carto.IActiveView activeView, ESRI.ArcGIS.Geodatabase.IRasterCatalog rasterCatalog)
{
//create a raster catalog layer
ESRI.ArcGIS.Carto.IGdbRasterCatalogLayer rastercatalogLayer = new GdbRasterCatalogLayerClass();
rastercatalogLayer.Setup((ITable)rasterCatalog);
//Add it to map if the layer is valid
if (!(rastercatalogLayer == null))
{
ESRI.ArcGIS.Carto.IMap map = activeView.FocusMap;
map.AddLayer((ILayer)rastercatalogLayer);
}
}