IDL在分布式GIS系统中的应用研究

来源:岁月联盟 作者:郭建文 冯 敏 尚庆 时间:2010-08-30

  摘要:以新型的面向图形对象、基于矩阵的交互式数据处理语言(IDL),与空间数据引擎(SDE)结合来构建分布式GIS应用,既发挥了IDL在空间数据处理、三维显示方面的长处,又利用了SDE在空间数据管理方面良好的性能及安全性,同时避免了在购买专业GIS开发组件许可证上的巨额投入,在性能和开发成本之间做到了合适的平衡,是一种可行的应用方案。
  关键词:地理信息系统;交互式数据处理语言;空间数据引擎;C#;分布式应用?

  0引言?
  
  进行GIS应用开发,若直接从底层做起则开发周期长、成本高。目前应用最为广泛的模式是集成二次开发[1],就是以当前成熟的商业GIS平台为基础,以高级开发语言为支持来进行应用开发。然而目前的商业GIS平台价格昂贵,并且由于提供厂商在知识产权保护方面的考虑和限制,有些还不能用来开发完全独立(Standalone)的应用系统。?
  业界应用最广的ESRI[2]公司产品系列中提供了功能强大的基于COM技术的ArcObjects组件作为GIS二次开发工具,开发者可以借助其成熟的空间分析技术以及其与ArcSDE空间数据库之间良好的协作特性,快速地实现GIS应用系统的开发。然而在ArcGIS 9.0之前的版本中,ArcObjects不是独立的软件开发工具包(Software Development Kit,SDK),无法脱离ArcGIS环境开发独立的应用系统[2];即便在新发布的ArcGIS 9.0开始支持独立开发的情形下,昂贵的发布许可费用仍然使得目标系统的应用成本非常高。这对科研应用目的而言,不但开发成本太高,而且灵活性很差。因而尝试在系统的设计开发中,选择基于矩阵运算的交互式数据处理语言(Interactive Data Language,IDL),以及商业化的空间数据管理引擎ArcSDE的集成开发模式,以期在性能和开发成本之间达成一个合理的平衡。?
  
  1开发环境?
  
  IDL是一种新型的面向图形对象、基于矩阵的数据处理语言,自带强大的数学库支持,在数据运算、分析和空间表现方面有出色的性能[3]。ArcSDE是非常成熟的空间数据库引擎。通过结合MS SQL Server或Oracle大型关系数据库系统,可以建立具有良好性能的空间数据库[2];并且通过利用ArcSDE提供的Client APIs(Application Programming Interfaces,应用编程接口)接口进行开发,系统的自主性较强。?
  经过对多种开发环境和编程语言的比较,系统决定采用?.NET作为实现平台。C#是一种新的编程语言,它是专为生成运行在.NET框架上的级应用程序而设计的,同时具备?C/?C++的强大功能及Visual Basic的快速开发能力,是面向下一代操作系统的开发语言[4]。?
  
  2系统开发方案?
  
  2.1系统体系结构?
  系统采用多层逻辑结构的胖客户端/瘦服务器端模式。服务器端由ArcSDE来实现空间数据的管理,结合服务器上的SQL Server构成空间数据库。客户端由C#构建,利用其在应用程序开发方面的性能、快捷性及交互界面开发方面的出色能力,以弥补IDL在此方面的不足。IDL在系统中主要负责实现空间数据(含二维和三维)的本地访问管理和表现,如空间数据的加载、本地管理、地图渲染、三维显示等;系统还可借助IDL强大的数据处理能力实现基于矩阵运算的各种分析功能。IDL部分经过良好的封装被嵌入在客户端的C# Shell中。?
  
  2.2客户端程序框架?
  客户端交互界面由C#和经过.NET封装的IDL DrawWidget开发控件构建。由于IDL并没有像其他专业GIS开发组件(如ESRI的MapObjects或ArcObjects)一样直接提供对GIS应用开发的支持,因而基本的GIS功能需要利用IDL自行实现。图层控件用标准的Windows基本控件组合开发;鹰眼控件和地图控件由经过.NET封装的IDL DrawWidget开发控件来实现;比例尺控件由Windows绘图函数与IDL函数共同实现。?
  
  2.3空间数据管理?
  系统中所有的空间数据由ArcSDE空间数据库统一管理,系统与ArcSDE的交互由C# Shell负责管理,具体的交互功能在体系结构图的Data Acess组件中实现。其中主要使用了经过 .NET封装的ArcSDE C APIs空间数据库访问函数库。?
  
  2.4空间数据处理与显示?
  系统中使用IDL语言来进行对空间数据的处理与运算。IDL是目前对可视化支持较好的语言之一,是一种集成了所有科学计算环境中所需函数的面向矩阵运算、用于数据可视化研究与应用开发的第四代计算机语言,也是易于使用、面向矩阵的语言。它具有高级图像处理能力、交互式二维和三维图形技术、面向对象的编程方式、OpenGL 图形加速、量化可视化表现、集成的数学与统计学算法、灵活的数据输入/输出方式、跨平台图形用户界面工具包、连接ODBC 兼容数据库存取及多种程序连接工具等功能,并且能够运行于多种操作系统和硬件平台之上。本质上,IDL是一个巨大的C程序库,包括了编译器、解释器、图像、算术处理器、用户界面和大量依赖操作系统的代码[5]。利用C#和IDL语言混合开发的系统,既包含了IDL语言强大的科学计算能力,又具备了C#语言对系统开发的灵活性以及系统运行的稳定性,使得两种语言在系统中达到优势互补,是实现科学计算及可视化的一种有效途径。?  

        3SDE访问接口?
  
  系统采用了目前较为成熟的空间数据库引擎ArcSDE与大型关系数据库管理系统SQL Server来实现对空间数据的分布式存储和管理。需要解决的首要问题是如何建立与ArcSDE的远程连接,并与之实现交互操作。?
  ArcSDE提供的访问通道有三条[6,7] 。三条通道中:使用ArcObjects成本太高;而直接数据库连接通过SQL语言直接从关系型数据库中获取以表、行、列为基础的数据,这种方法绕过了ArcSDE,适合于对非空间信息的访问,但处理空间信息的难度很大;ArcSDE的Client APIs是较为基础的一种功能发布形式,具有较长的和非常广泛的应用,它面向开放式系统开发,可以用于客户端与ArcSDE的交互过程。系统中最终采用ArcSDE提供的C语言客户端API方式,以便在保证系统性能的前提下,降低系统的开发和运行成本。?
  ArcSDE的C APIs具有较高的数据访问性能、较完整的矢量和栅格数据访问和管理能力。但是它是一个复杂的体系,包括30个结构、21个枚举以及757个函数,并且不支持面向对象,也没有提供对.NET环境的支持(只提供了C和Java两个版本),因而难以直接在.NET环境中以不安全代码(Unsafe)的方式访问。?
  为解决这一问题,系统开发中利用托管(Managed)?C++语言,将ArcSDE 的C APIs封装为.NET环境支持的模块,然后在?.NET环境中使用。?
  
  4IDL与C#通信机制?
  
  4.1IDL对混合编程的支持?
  IDL为了更好地实现软件开发的灵活性和面向对象的功能,不断地对功能进行扩充,并且增加了许多与其他语言之间的通信接口,并提供了许多与其他语言进行混合编程的内部API函数。IDL 6.0可以与标准C、UNIX C、Visual ?C++、Java、Delphi等高级语言进行混合编程。?

  IDL提供了以下几种混合编程方法[8]:?
  (1)管道;?
  (2)在IDL中调用COM对象或ActiveX控件;?
  (3)IDL DrawWidget ActiveX控件;?
  (4)在IDL中使用Java对象;?
  (5)通过RPC调用IDL(UNIX);?
  (6)通过CALL_EXTERNAL函数调用外部函数。?
  
  4.2目标系统适用的方式?
  由于目标系统是在C#编程环境中使用IDL,IDL的Microsoft Windows版本的ActiveX控件,即IDL DrawWidget最适合本文目标系统开发的要求。IDL DrawWidget控件提供了在Windows程序中以ActiveX组件形式集成IDL功能的机制,为这些程序提供数据的分析和可视化能力。?
  IDL提供的IDL DrawWidget控件的主要特征如下[8]:?
  (1)IDL ActiveX控件能显示IDL直接图形和对象图形,通过设置“图形显示方式”属性,控制图形的显示类型。?
  (2)IDL ActiveX控件能够响应鼠标事件。这些事件可以由外部程序触发,也可以由IDL自己产生。?
  (3)IDL ActiveX控件提供了IDL与外部应用环境之间的数据传输机制,使得IDL与外部程序之间的数据传输变得十分简单。?
  (4) IDL ActiveX控件可以应用于任何支持ActiveX控件的开发环境中。因此,可以将IDL强大的图形显示功能集成到外部应用程序中,脱离IDL环境,具有很强的可塑性。?
  
  4.3通信及数据支持?
  IDL提供了以下Method用于传递数据和命令[8]:?
  (1)SetNamedData——向IDL传递数据,支持所有的Variant数据格式;?
  (2)GetNamedData——支持VT_UI1、VT_I2、VT_I4、VT_R4、VT_R8和VT_BSTR;?
  (3)CopyNamedArray——返回IDL数组的复本;?
  (4)SetNamedArray——在.NET、Delphi等环境下不能实现数据共享,只能传入数据;?
  (5)ExecuteStr——执行标准IDL语句,也可以作为一种数据的传递方式;?
  (6)VariableExists——用于判断IDL环境中是否已经存在给定变量名称的变量;?
  事件传递:?
  (1)鼠标事件由.NET环境处理;?
  (2)保留通过文本结果输出来实现由IDL到.NET环境的主动事件激发的方式。?
  IDL对空间数据存储格式的支持:?
  (1)矢量——支持直接读写Shapefile(通过IDLffShape?类 )、DXF(IDLffDXF);?
  (2)栅格——不支持GRID空间数据,只支持读写图像格式数据。?
  
  4.4C# 与IDL间的数据传递机制?
  由于IDL支持的空间数据格式有限,并且不支持ArcSDE,系统中不直接使用IDL读取空间数据,而是由.NET主环境中的C# Shell负责从空间数据库读取数据,然后再传入IDL环境。?
  IDL与主环境之间的数据传递只处理单值或者数组数据;而点、线、多边形等较为复杂的矢量结构数据,需要首先分解为单值或数组后传递给IDL,再由IDL根据所给数据生成合适的对象图形,实现空间数据的表现和管理。 
  5IDL对象与GIS对象?
  
  IDL不直接支持GIS中空间数据的管理和表现,需要自己定义和实现该部分功能。系统实现中采用从IDL对象图形类继承的方式,扩展已有的IDL图形功能,定义新的空间数据类。空间数据类完成从.NET环境接收单值和表格数据,并进行管理和渲染表现等任务。
  6结束语?
  
  利用IDL、ArcSDE和C# 来集成开发分布式GIS应用系统,三者相辅相成,优势互补。其不但在很短的开发周期内以极低的开发成本建立非常专业的GIS应用系统,而且系统在保证数据安全性及性能的前提下,运行成本也很低廉,为GIS的应用提供了一种新的途径。?
  
  :?
  [1]刘光. 地理信息系统二次开发教程——组件篇[M]. 北京:清华大学出版社,2003: 1-2.?
  [2]ESRI Inc. ESRI:the GIS software leader[EB/OL].[2005].http://www.esri.com.?
  [3]RSI Inc. RSI:data analysis and visualization software[EB/OL].[2005].http://www.rsinc.com/pr/detail.asp?PRID=46.?
  [4]Microsoft Inc. MSDN home page[EB/OL].[2005].http://www.microsoft.com.?
  [5]闫殿武. IDL可视化工具入门与提高[M]. 北京:机械出版社,2003:1-360.?
  [6]ESRI Inc. Understanding ArcSDE[M/CD].[S.l.]:[s.n.],2002.?
  [7]ESRI Inc. ArcSDE 8.3 developer help guide[M/CD].[S.l.]:[s.n.],2003.?
  [8]RSI Inc. External development guide[M/CD].[S.l.]:[s.n.],2003.

图片内容