摘要:以新型的面向图形对象、基于矩阵的交互式数据处理语言(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开始支持独立开发的情形下,昂贵的发布许可费用仍然使得目标系统的应用成本非常高。WWw.133229.COM这对科研应用目的而言,不但开发成本太高,而且灵活性很差。因而尝试在系统的设计开发中,选择基于矩阵运算的交互式数据处理语言(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]: