
论文基于空间数据引擎构建gis应用.doc
5页基于空间数据引擎构建GIS应用刘宏建 牛德力解放军信息工程大学测绘学院 河南郑州 450052摘要:本文以利用空间数据引擎构建GIS应用为主要研究内容,从体系结构、核心技术、工作流程等方面对该技术做了详细介绍,又以MapInfo Spatialware为例,给出了基于MapInfo Spatialware构建GIS应用的解决方案关键字:空间数据引擎、SpatialwareAbstract: The main content of the text is the building-up GIS application by using the Spatial Data Engine, which precisely describes its architecture, key-technology, work-flow and etc. And by instance of MapInfo Spatialware, it proposes the solution of the building-up GIS application on the basis of MapInfo Spatialware.1. 引言近年来,随着关系数据库技术的进一步发展与成熟,采用关系数据库来对空间数据和属性数据进行一体化存储和管理,已经成为商用GIS平台发展的一个趋势。
全关系型的GIS软件,利用关系数据库解决了空间数据的集中控制、网络环境下的共享、并发控制等问题,明显地提高了GIS软件管理空间数据的能力空间数据引擎(Spatial Data Engine),实质上就是基于商用关系数据库系统构建空间数据库,以提供空间数据存储、管理能力的系统本论文将对利用空间数据引擎构建GIS应用的一些关键技术作一下深入的探讨2. 体系结构图 1 基于空间数据引擎构造GIS应用的系统部署图 基于空间数据引擎的GIS应用系统,可划分为三个层次:前台客户端、中间层应用服务器和后台的数据库服务器前台的客户端负责数据显示、与用户的交互等工作,它可以是一般的应用程序也可以是Web Browser(浏览器)最底层是数据库服务器,它可以是不同的数据库产品,也有可能运行在异构的操作系统上面,该层又可以称为数据存储层空间数据引擎属于应用服务器层,它向高层的客户端应用提供一套统一的空间数据访问机制,屏蔽掉低层异构数据库和操作系统的差异;中间层应用服务器按照需求还可以包括Web服务器、Web地图服务器等中间层应用服务器的作用是:封装业务逻辑、处理Web客户端的请求、执行空间查询,从数据库获得数据并返回给客户端。
由于空间数据引擎在整个系统中的核心地位和作用,下面将对空间数据引擎的关键技术作一下探讨3. 空间数据引擎核心技术剖析(1) 概述 在OpenGIS体系结构中,将共享领域服务分为了15类,共享域服务的15种基础服务反映的是一些基本的、重要的空间数据操作功能,例如空间数据建模、空间实体操作、空间查询、地图影像操作、坐标系管理等空间数据引擎将空间实体操作、图层管理、数据交换、空间参考系等核心功能集成起来,对外提供调用接口,在构造地图显示、地图数据编辑、空间分析、数据交换等外部系统时,就可以直接对空间数据引擎的功能接口进行操作,从而使外部系统自动获得空间数据操作的基本功能从空间数据引擎构成上考虑,它由空间对象结构、空间索引和空间函数三大部分构成2) 空间对象结构图2 Spatialware空间对象结构空间对象结构是空间数据引擎的基石,它要解决的是地理数据如何表达的问题空间对象结构决定了空间数据引擎能表示什么,不能表示什么,空间对象结构的优劣,很大程度上决定了空间数据引擎的好坏以MapInfo Spatialware为例(图1给出了Spatialware的空间对象结构图),ST_Spatial是所有空间数据类型的基类,在Spatialware For SQL Server中,它是这样定义的:EXEC sp_addtype N'ST_Spatial', N'image', N'null'由上可以看出,SP_Spatial也就是BLOB类型(大二进制对象块),只是换个名字而已。
Spatialware以SP_Spatial为基类,又派生出了ST_Point,ST_Line,ST_Polygon等一系列空间数据类型,空间实体的生成,则要由空间函数来完成3) 空间函数 空间函数所要解决的是如何操纵空间数据与空间分析的问题,它实质上是对关系数据库标准查询语言(SQL, Structure Query Language)的一种扩充,对关系数据库进行功能扩展以适用于空间数据下面是Spatialware中几种比较重要的空间函数n 空间实体构造函数 用于创建空间对象结构中定义的空间实体n 空间聚合函数 对空间数据构成的一个行集(Rows)进行各种方式的计算,比如:HG_Aggunion函数,用来对多个空间实体求并,返回值是多个空间实体的并集;HG_Aggintersection对空间实体求交集;HG_Aggboundingbox求一组空间实体的最小矩形外包等等n 类型转换函数 用于Spatialware定义的空间数据类型和OGC(Open GIS Consrotinum)规定的各种数据类型的转换如;HG_AsBinary将ST_Spatial类型转换为OGC定义的Binary类型HG_GeometryFromBinary将OGC定义的Binary类型转换为ST_Spatial类型。
n 坐标函数 用于对空间参考系统(大地椭球、地图投影)进行处理,在该部分,只有一个函数HG_CSTransform如下:HG_CSTransform(spatial_obj, from_cs, to_cs)该函数将空间实体(spatial_obj)从源坐标系(from_cs),转换到目的坐标系(to_cs)中n 空间量算函数 对空间实体进行各种量算,如计算长度、面积、坡度、高程、方位角n 空间查询函数 该部分最重要的函数是sp_spatial_query,它的功能极其强大,涉及到空间查询的各种形式如:exec sp_spatial_query ‘select ID, ST_Area(sw_geometry) as area from land_use order by area’该代码执行空间查询,从土地利用表中查询土地编号和地块面积,并按面积大小排序4) 空间索引 空间索引要解决的问题是如何快速的找到指定的空间实体,它依据空间实体的位置及分布特征,将整个区域的空间实体用某种数据结构组织起来,该数据结构中包含该对象的标志信息和获得该对象地址所需要的一些信息在MapInfo Spatialware中,采用的是R树索引机制。
R树索引是根据地物的最小外包矩形建立的,R树中每一结点N都对应着磁盘页D(N)和空间区域I(N),如果结点不是叶结点,则该结点的所有子结点的区域都在I(N)范围内,而且存储在磁盘页D(N)中;如果结点是叶结点,那么磁盘页D(N)中存储的将是区域I(N)范围内的一系列空间实体的最小外包矩形在Spatialware中,对一个图层建立空间索引的方法如下:exec sp_sw_create_rtree'
然后,在空间化过的数据库中,创建空间表并将其中的地理数据列空间化.举例如下:create database test_spatialwareexec sp_spatialize_dbcreate table testcon ( sw_member integer not null unique,sw_geometry st_spatial )建立空间数据表后,可以向该表中插入数据最后,对该表建立空间索引(R树索引),就可以在客户端执行各种空间操作了2) 客户端应用的设计客户端是和用户交互的接口,在MapInfo的整体解决方案中,可以采用MapBasic作为客户端进行开发,也可以采用MapX作为客户端进行开发,两者各有优劣采用MapX作为客户端,可以完全脱离MapInfo Professional环境,非常便于和管理信息系统(MIS)的集成.MapX和Saptialware的集成开发,实质上是MapX将空间数据库中的数据加载到它的Layers和Datasets中,进行各种地图操作、专题制图、空间分析等将空间数据加载到MapX图层中,是通过LayerInfo对象实现的,下面给出了加载地图图层,并实现地图自动标注的代码:Sub LoadMapData()Dim LayerInfo As New MapXLib.LayerInfo LayerInfo.Type = miLayerInfoTypeServerLayerInfo.AddParameter "Name", "zz_admin"LayerInfo.AddParameter "ConnectString", DSN=zz_lyxt;UID=sa;river=SQL Server"LayerInfo.AddParameter "query", "Select * from zz_admin"LayerInfo.AddParameter "cache", "on"LayerInfo.AddParameter "MBRSearch", "on"LayerInfo.AddParameter "toolkit", "ODBC"LayerInfo.AddParameter "AutoCreateDataset", 1LayerInfo.AddParameter "datasetname", "zz_admin"MapMain.Layers.Add LayerInfo, 1Set ds = MapMain.Datasets("zz_admin")Set MapMain.Layers("zz_admin").LabelProperties.Dataset = dsSet MapMain.Layers("zz_admin").LabelProperties.DataField=”名称”MapMain.Layers("zz_admin").AutoLabel = TrueMapMain.Layers("zz_admin").Selectable = TrueMapMain.Layers("zz_admin ").RefreshMapMain.AutoRedraw = TrueSet LayerInfo = NothingEnd Sub5. 结语 基于空间数据引擎构建GIS应用,充分利用了关系数据库的优势,解决了GIS中的网络共享、并发控制、平衡负载等问题,逐渐成为GIS开发的主流趋势,具有很好应用的前景。












