从地理信息系统论坛中找到的,你自己看看
可惜图没有了
第二章 组件式GIS与MapX
一、 组件技术
组件技术的兴起
目前,在软件开发领域,一场新的革命正在悄悄兴起,这是由日趋成熟的组件技术引发的。几年以前,当微软公司首先使用OLE的时候,其初衷是为了增强软件的互操作性。然而在使用过程中,人们逐渐认识到这一技术背后的实质性内容和它在软件开发中所扮演的重要角色。组件技术以前所未有的方式提高了软件产业的生产效率,这一点已逐步成为软件开发人员的共识。传统的C/S结构、群件、中间件等大型软件系统的构成形式,都将在组件的基础上重新构造。
组件技术使近二十年来兴起的面向对象技术进入到成熟的实用化阶段。在组件技术的概念模式下,软件系统可以被视为相互协同工作的对象集合,其中每个对象都会提供特定的服务,发出特定的消息,并且以标准形式公布出来,以便其他对象了解和调用。组件间的接口通过一种与平台无关的语言IDL(InterfaceDefineLanguage)来定义,而且是二进制兼容的,使用者可以直接调用执行模块来获得对象提供的服务。早期的类库,提供的是原代码级的重用,只适用于比较小规模的开发形式;而组件则封装得更加彻底,更易于使用,并且不限于C++之类的语言,可以在各种开发语言和开发环境中使用。
由于组件技术的出现,软件产业的形式也随之发生了很大的变化。大量组件生产商涌现出来,并推出各具特色的组件产品;软件集成商则利用适当的组件快速生产出用户需要的某些应用系统;大而全的通用产品逐步减少;很多相对较为专业,但用途广泛的软件,如GIS、语音识别系统等,都以组件的形式组装和扩散到一般的软件产品中。
COM与DCOM
COM是组件式对象模型(Component Object Model)的英文缩写,是组件之间相互接口的规范,是OLE(Object Linking &
Embedding)和ActiveX共同的基础,其作用是使各种软件构件和应用软件能够用一种统一的标准方式进行交互。COM不是一种面向对象的语言,而是一种与源代码无关的二进制标准。COM所建立的是一个软件模块与另一个软件模块之间的链接,当这种链接建立之后,模块之间就可以通过称之为“接口”的机制来进行通信。COM标准增加了保障系统和组件完整的安全机制,并扩展到分布式环境。
COM本质上仍然是客户/服务器模式。客户(通常是应用程序)请求创建COM对象并通过COM对象的接口操纵COM对象。服务器根据客户的请求创建并管理COM对象。客户和服务器这两种角色并不是绝对的。
基于分布式环境下的COM被称作DCOM(Distribute COM,分布式构件对象模型)。DCOM是ActiveX的基础,它实现了COM对象与远程计算机上的另一个对象之间直接进行交互。DCOM规范定义了分散对象创建和对象间通信的机制,规范本身并不依赖于任何特定的编程语言和操作系统,但目前该标准只在Microsoft Windows平台实现,这就意味着其它的操作系统平台(如UNIX)目前还不支持ActiveX。
DCOM的实现采用了DCOM库的形式,当DCOM客户对象需要DCOM服务器对象的服务时,DCOM库负责生成DCOM服务器对象并在客户对象和服务器对象之间建立初始连接,一旦返回服务器对象指针,DCOM库就不再参与客户对象与服务器对象之间的工作,两个对象之间可以自由地进行通信。
DCOM接口实际上时逻辑上和语义上相关联的函数集。服务器对象通过DCOM接口为客户对象提供服务,客户对象不需了解服务器对象的内部数据表示。接口可以看成两个软件构件之间的一种协议,协议表明服务器对象为客户对象提供一种且仅此一种服务。接口采用全局唯一标识符(GUID)来保证服务的唯一性。通常的DCOM构件提供多种服务,那么服务器对象为每一种服务实现一个接口。当客户对象指针指向相应的服务器对象时,它就激活服务器对象接口的相应函数。具体过程是:客户对象通过DCOM对象必须支持的IunKnown接口获得其它接口的指针。客户对象也许并不知道服务器对象的每个接口,但这并不妨碍客户对象对服务器对象的使用,它只用它知道的接口。当客户对象用完服务器对象的服务时,它会通知服务器对象,服务器对象就释放它所占有的内存。
DCOM的好处是显而易见的。由于接口的定义和功能保持不变,DCOM构件开发者可以改变接口功能、为对象增加新功能、用更好的对象来代替原有对象,而建立在构件基础上的应用程序几乎不用修改,大大提高了代码的重用性。
ActiveX与ActiveX控件
(1)、 ActiveX
ActiveX是微软公司的构件技术标准,实际上是对象嵌入与炼接(OLE)的新版本,使OLE接口加强了对数据和特性的管理,效率更高,而且更加便于进行Internet互操作。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。
ActiveX既包含服务器端技术,也包含客户端技术。其主要内容是:
Ø
ActiveX控制(ActiveX Control):用于向WEB页面、Microsoft Word等支持ActiveX 的容器(Container)中插入COM对象;
Ø
ActiveX文档(ActiveXdo
cument):用于在Web Browser或者其它支持ActiveX的容器中浏览复合文档(非HTML文档),例如Microsoft Word文档、Microsoft Excel文档或者用户自定义的文档等;
Ø
ActiveX脚本描述(ActiveX Scripting):用于从客户端或者服务器端操纵ActiveX控制和Java程序、传递数据以及协调它们之间的操作等;
Ø
ActiveX服务器框架(ActiveX Server Framework):提供了一系列针对Web服务器应用程序设计各个方面的函数及其封装类,诸如服务器过滤器、HTML数据流控制等;
Ø
在Internet Explorer中内置Java虚拟机(Java Virtual Machine),从而使Java Applet能够在Internet Explorer上运行,并可以与ActiveX控制通过脚本描述语言进行通信。
(2)、 ActiveX控件
ActiveX控件是充分利用OLE和ActiveX技术的自定义控件,是基于与应用程序无关的思想而设计的,其目标是提供一种面向对象、与操作系统无关、与机器平台无关、可以在应用程序之间互相访问对象地机制。
ActiveX控件是建立在COM标准上的独立的软件元件,提供给用户应用接口,发送相应的事件,开发者则可以截取这些事件,执行相应的功能。ActiveX控件开发端和使用端是完全独立的,可以用Delphi、VB等各种语言来开发,又可以用于不同语言、不同开发平台、不同的系统环境中。ActiveX控件与VBX不同,VBX的标准是建立在16位段式结构的基础上,并不适用于32位环境。ActiveX控件可以在32位环境下提供与VBX相类似的功能。一个或多个ActiveX控件会保存在一个动态链接库中,但它是一种特殊的动态链接库,其扩展名不是DLL而是OCX。
从本质上讲,ActiveX控件是一个ActiveX服务器,它能提供所有的OLE功能和服务,包括可视化编辑、拖放和OLE Automation。与所有的ActiveX服务器一样,要使用ActiveX控件,必须先对ActiveX控件进行注册,应用程序通过注册后得到的类ID号找到控件的数据源进行访问。ActiveX控件可以由VB、VC、Delphi等开发工具生成OCX文件时自动进行注册,也可以手工注册,其实质都是通过运行应用程序Regsvr32.exe来实现。Regsvr32.exe一般在操作系统的系统文件目录下,如Windows 85/98的windowssystem目录、Windows NT的winntsystem32目录。在Regsvr32.exe应用程序的命令行中输入ActiveX控件的网络共享路径。网络路径的形式为/机器名共享目录名文件名。假如,服务器名为mainserver,目录名为controls,控件名为MapX,则注册命令为:
Regsvr32 /mainservercontrolsmapx.ocx
(3)、 ActiveX与ActiveX控件的区别
ActiveX技术是OLE技术在Internet上的重定义,而ActiveX控件则是OLE控件在Internet上的扩展。
ActiveX不等同于ActiveX构件,从上面的介绍可知,ActiveX是一个很宽的技术家族的标识,而ActiveX构件只是那个家族的一个特定技术。
二、 组件技术与GIS的发展
引言
组件式软件技术已经成为当今软件技术的潮流之一,为了适应这种技术潮流,GIS软件象其他软件一样,已经或正在发生着革命性的变化,即由过去厂家提供了全部系统或者具有二次开发功能的软件,过渡到提供组件由用户自己再开发的方向上来。无疑,组件式GIS技术将给整个GIS技术体系和应用模式带来巨大影响。
GIS技术的发展,在软件模式上经历了功能模块、包式软件、核心式软件,从而发展到组件式GIS和WebGIS的过程。传统GIS虽然在功能上已经比较成熟,但是由于这些系统多是基于十多年前的软件技术开发的,属于独立封闭的系统。同时,GIS软件变得日益庞大,用户难以掌握,费用昂贵,阻碍了GIS的普及和应用。组件式GIS的出现为传统GIS面临的多种问题提供了全新的解决思路。
组件式GIS的基本思想是把GIS的各大功能模块划分为几个控件,每个控件完成不同的功能。各个GIS控件之间,以及GIS控件与其它非GIS控件之间,可以方便地通过可视化的软件开发工具集成起来,形成最终的GIS应用。控件如同一堆各式各样的积木,他们分别实现不同的功能(包括GIS和非GIS功能),根据需要把实现各种功能的 “积木”搭建起来,就构成应用系统。
组件式GIS系统的特点
把GIS的功能适当抽象,以组件形式供开发者使用,将会带来许多传统GIS工具无法比拟的优点。
(1)、 小巧灵活、价格便宜
由于传统GIS结构的封闭性,往往使得软件本身变得越来越庞大,不同系统的交互性差,系统的开发难度大。在组件模型下,各组件都集中地实现与自己最紧密相关的系统功能,用户可以根据实际需要选择所需控件,最大限度地降低了用户的经济负担。。组件化的GIS平台集中提供空间数据管理能力,并且能以灵活的方式与数据库系统连接。在保证功能的前提下,系统表现得小巧灵活,而其价格仅是传统GIS开发工具的十分之一,甚至更少。这样,用户便能以较好的性能价格比获得或开发GIS应用系统。
(2)、 无须专门GIS开发语言,直接嵌入MIS开发工具
传统GIS往往具有独立的二次开发语言,对用户和应用开发者而言存在学习上的负担。而且使用系统所提供的二次开发语言,开发往往受到限制,难以处理复杂问题。而组件式GIS建立在严格的标准之上,不需要额外的GIS二次开发语言,只需实现GIS的基本功能函数,按照Microsoft的ActiveX控件标准开发接口。这有利于减轻GIS软件开发者的负担,而且增强了GIS软件的可扩展性。GIS应用开发者,不必掌握额外的GIS开发语言,只需熟悉基于Windows平台的通用集成开发环境,以及GIS各个控件的属性、方法和事件,就可以完成应用系统的开发和集成。目前,可供选择的开发环境很多,如Visual C++、Visual Basic、Visual FoxPro、Borland C++、Delphi、C++ Builder以及Power Builder等都可直接成为GIS或GMIS的优秀开发工具,它们各自的优点都能够得到充分发挥。这与传统GIS专门性开发环境相比,是一种质的飞跃。
(3)、 强大的GIS功能
新的GIS组件都是基于32位系统平台的,采用InProc直接调用形式,所以无论是管理大数据的能力还是处理速度方面均不比传统GIS软件逊色。小小的GIS组件完全能提供拼接、裁剪、叠合、缓冲区等空间处理能力和丰富的空间查询与分析能力。
(4)、 开发简捷
由于GIS组件可以直接嵌入MIS开发工具中,对于广大开发人员来讲,就可以自由选用他们熟悉的开发工具。而且,GIS组件提供的API形式非常接近MIS工具的模式,开发人员可以像管理数据库表一样熟练地管理地图等空间数据,无须对开发人员进行特殊的培训。在GIS或GMIS的开发过程中,开发人员的素质与熟练程度是十分重要的因素。这将使大量的MIS开发人员能够较快地过渡到GIS或GMIS的开发工作中,从而大大加速GIS的发展。
(5)、 更加大众化
组件式技术已经成为业界标准,用户可以象使用其他ActiveX控件一样使用GIS控件,使非专业的普通用户也能够开发和集成GIS应用系统,推动了GIS大众化进程。组件式GIS 的出现使GIS不仅是专家们的专业分析工具,同时也成为普通用户对地理相关数据进行管理的的可视化工具。
组件式GIS开发平台的结构
组件式GIS开发平台通常可设计为三级结构:
Ø
基础组件
面向空间数据管理,提供基本的交互过程,并能以灵活的方式与数据库系统连接;
Ø
高级通用组件
由基础组件构造而成,面向通用功能,简化用户开发过程,如显示工具组件、选择工具组件、编辑工具组件、属性浏览器组件等等。它们之间的协同控制消息都被封装起来。这级组件经过封装后,使二次开发更为简单。如一个编辑查询系统,若用基础平台开发,需要编写大量的代码,而利用高级通用组件,只需几句程序就够了。面向通用功能;
Ø
行业性组件
抽象出行业应用的特定算法,固化到组件中,进一步加速开发过程。以GPS监控为例。对于GPS应用,除了需要地图显示、信息查询等一般的GIS功能外,还需要特定的应用功能,如动态目标显示、目标锁定、轨迹显示等。这些GPS行业性应用功能组件被封装起来后,开发者的工作就可简化为设置显示目标的图例、轨迹显示的颜色、锁定的目标,以及调用、接受数据的方法等。
GIS组件的构成
GIS软件的模型包含若干功能单元,诸如空间数据获取、坐标转换、图形编辑、数据存储、数据查询、数据分析、制图表示等。可以想象要把这些所有的功能放在一个控件中几乎是不可能的,即使实现也会带来系统效率上的低下。一般可以认为GIS构件的设计主要遵循应用领域地需求。例如ESRI地MapObjects就是以空间数据访问、查询、制图为主要目标的GIS构件。
GIS组件产品
GIS组件的代表作应首推MapObjects以及MapX等。其中MapObjects由全球最大的GIS厂商ESRI(美国环境研究所)推出;MapX由著名的桌面GIS厂商美国MapInfo公司推出。另外还有加拿大阿波罗科技集团的TITAN等。下表是MapObjects和MapX的主要功能对比。
功能 MapObjects MapX
显示的地图数据格式 Arcview的SHP、ARC/INFO的coverage、SDE图层 MapInfo的数据格式
叠加栅格图像 有 有
对地图的常用操作 放大、缩小、漫游等 放大、缩小、漫游等
图层控制 增加、移走、设置当前层 增加、移走、设置当前层
属性数据绑定 有 有
地图信息查询方式 1. 通过鼠标选取特征
2. 通过SQL查找特征
3. 通过空间操作选取特征 1. 通过鼠标选取特征
2. 通过SQL查找特征
3. 通过空间操作选取特征
专题地图 较弱 有
GPS集成 有 有
用户绘图图层 无 有
生成/编辑地图对象 较弱 较弱
地图标注 有 有
地图符号化 较弱 较强
分析功能 无 无
地理编码 有 有
可使用的开发语言 VC、VB、PowerBuilder、Delphi、Access等 VC、VB、PowerBuilder、Delphi、Lotus Notes等
表4.1 MapObjects和MapX的主要功能对比
应用及评价
软件的构件化已成为软件技术发展的潮流。基于DCOM的ActiveX构件实现,已成为软件工业的一种标准。伴随着未来其它非Windows平台对ActiveX的支持,ActiveX构件化的GIS软件系统将对GIS的体系结构和GIS将来的应用前景产生深远影响。
虽然采用GIS构件在开发上有许多优势,但是不可避免的也存在一些功能上的欠缺和技术上的不成熟,主要包括以下几个方面:
Ø
与专业的GIS客户端软件相比,采用构件技术不可避免的带来效率上的相对低下,这在访问超大空间数据(如大数据量的遥感图象)的时候表现得尤为明显;
Ø
支持的空间数据量有限;
Ø
支持的功能有限,由于是构件,只覆盖了GIS系统的部分功能,于是对于特殊领域,它就显得无能为力;
Ø
系统的可靠性、容错性有待提高。DCOM的一大特点是:开发及使用过程中必须时刻注意Windows系统OLE系统注册表的正确。
三、 MapInfo相关技术
MapInfo公司及其产品
美国MapInfo公司致力于为用户提供先进的数据可视化、信息地图化技术,并将这些技术与主流业务系统集成,提供完整的解决方案。MapInfo吸取了传统GIS系统的精华,并借助于计算机技术的发展,及时将GIS概念从中大型计算机的专用工作站上介绍至普通桌面PC上,开创了崭新桌面地图信息系统。MapInfo公司的主要系列产品有:
Ø
桌面地理信息系统MapInfo Professional
Ø
网络解决方案MapInfo ProSerev
Ø
数据库服务器产品MapInfo Spatialware
Ø
MapInfo ActiveX
Ø
DEC Alpha NT产品MapInfo Professional for DEC Alpha NT
Ø
开发工具MapInfo MapBasic
MapInfo空间数据的拓扑关系模型
空间数据的拓扑关系模型是地理信息系统的基石。当前商用地理信息系统中,主要采用POLYVRT结构和“空间实体+空间索引”两种模型。
MapInfo采用称作“空间实体+空间索引”的的拓扑关系模型。80年代中后期出现的商用地理信息系统,尤其是桌面地理信息系统大多采用这种方式,包括ESRI的ArcView。而采用POLYVRT模型的系统主要是以Arc/Info为代表的一些专业GIS产品。
“空间实体+空间索引”模型的基础是“空间实体”。空间实体是地理实体的抽象,主要包括点、线、面三种类型。每个空间实体对象都维护着自己的所有属性。多个空间实体组成一个图层。
“空间实体+空间索引”模型的空间查询功能是通过“空间索引”技术来实现的。空间索引的目的是对给定的空间坐标,能够以尽快的速度搜索到坐标范围内的空间对象。MapInfo采用R-Tree技术将空间实体的最小外接矩形(MBR)存储在索引中,并按从大到小的顺序进行索引搜索。建立了空间索引,就能快速地进行空间分析了。
相对于,POLYVRT的优点是多个不同的对象可以共用相同的结点,节省存储空间,但由此产生的问题是其结构更加复杂,数据的编辑和维护比较困难。而“空间实体+空间索引”模型虽然会造成公共结点的重复存储,但是其结构化的实体模型使得对某个对象的更改不会影响到其它对象的定义,从而大大增强了空间数据的可维护性。
另外,基于POLYVRT结构的空间数据组织不能被规范为关系模式,而基于“空间实体+空间索引”模型可以规范为“实体-关系”模型,从而可以与关系数据库系统结合,在关系数据库内实现对空间数据的查询、分析和处理等操作。
主要技术特点
(1)、 以表(Table)的形式组织信息
每一个表都是一组MapInfo文件,这些文件组成了地图文件和数据库文件。为使用MapInfo,就需要有组成表的用户数据和地图文件。这些文件可以来自MapInfo或者由用户创建。用户要想在MapInfo中工作,就必须打开一个或多个表。
MapInfo通过表的形式将数据与地图有机地结合在一起。当用户在MapInfo中打开数据文件时,MapInfo将创建一个表。这个表至少由两个独立的文件组成,一个是包含数据结构的文件,另一个是包含原始数据的文件。一个典型的MapInfo表将主要由*.tab、*.dat、*.wks、*.dbf、*.xls、*.map、*.id、*.ind文件格式组成。
(2)、 图形对象
MapInfo内置的数据库管理系统是一种关系型数据库管理系统,也是用二维表组织数据。与其它关系型数据库不同的是表结构中除可包含常用类型的属性列外,还引入一个图形对象列(OBJ列),用于存储图形对象(如线、区域等)。MapInfo提供许多图形对象的操作接口,利用这些接口可以生成和处理所需要的各种图形。
(3)、 地图图层化
MapInfo是按图层组织计算机地图的。也就是说,将一幅计算机地图加工成多个层层叠加的透明层,这个透明层就称为图层。每个图层包含了整个地图的一个不同方面。例如,第一个图层包含省边界,第二个图层表示省府的符号,第三个图层由标注文本组成,把它们层层叠加就形成一幅完整的地图。在创建每一个图层时,都要为其建立一张表,MapInfo就是通过这种方式使表与地图之间建立了联系。
也就是说,MapInfo是以表的形式来进行管理的,每个表一般包含两部份:地图部分和数据库(属性)部份。
(4)、 专题地图
提供多种数据可视化的专题地图,能将数据库中的信息进行直观的可视化分析。使用专题渲染在地图上显示数据时,可以清楚地看出在数据记录中难以发现的模式或趋势,为用户的决策提供依据。专题地图包括范围值、点密度、柱状图、等级符号、饼图和独立值六种形式。
(5)、 内置ODBC
MapInfo内置ODBC,支持各种关系型数据库,支持SQL查询,从而保证了对原有数据库的沿用和对远程数据库地访问。具备空间查询的功能扩展(如缓冲区、叠加等),采用数据仓库的最新技术OLAP(Online Analytical Processing)的联机事物处理,对于应用程序实现图形查询和表查询提供了强大的手段。
(6)、 支持多种数据格式及其转换
MapInfo既支持数字化仪的图形输入方式,直接生成矢量图,也支持目前市场上流行的图形图象格式。可接受AutoCAD的DWG、DXF标准文件格式,还可通过MIF及MID文件与其它软件建立数据的接口。其中MIF文件内保存有图形信息,MID文件内保存有图形的属性信息。MIF及MID文件通过MapInfo的菜单命令Import和Export来输入和产生。
(7)、 二次开发工具MapBasic
作为一个系统软件,MapInfo提供了可以将其所有的功能用程序来驱动的方法,内置标准的二次开发工具——MapBasic。MapBasic不仅与大众化的Basic语法相一致,具有基本一致的常用函数集(计算、字符串处理、文件I/O、DLL调用等),而且利用MapBasic语言所提供的函数、过程和语句命令可以完成许多有关图形对象管理的复杂操作和运算。它的真正优势在于对MapInfo中的Table及其图形对象的管理所提供的特性和强大功能。采用面向对象及事件驱动编程
(8)、 集成二次开发能力
具有OLE和OLE Automation功能,可以方便地使用Delphi、VB、VC等多种开发工具,保证了新的应用程序与原有的应用界面保持一致,为日后的深层开发提供一个扩展空间。
MapInfo的数据组织
MapInfo采用双数据库存储模式,即其空间数据与属性数据是分开来存储的。属性数据存储在关系数据库的若干属性表中,而空间数据则以MapInfo的自定义格式保存于若干文件中,二者通过一定的索引机制联系起来。为了提高查询和处理效率,MapInfo采用层次结构对空间数据进行组织,即根据不同的专题将地图分层(图层还可以分成若干图幅),每个图层存储为若干个基本文件。
(1)、 属性数据的表结构文件.TAB
属性数据表结构文件定义了地图属性数据的表结构,包括字段数、字段名称、字段类型和字段宽度、索引字段及相应图层的一些关键空间信息描述。.TAB文件实际上是一个文本文件,可以在写字板中打开观察其内容。
(2)、 属性数据文件.DAT
属性数据文件中存放完整的地图属性数据。在文件头之后,为表结构描述,其后首尾相接地紧跟着各条具体地属性数据记录。
(3)、 交叉索引文件.ID
交叉索引文件记录了地图中每一个空间对象在空间数据文件(.MAP)中的位置指针。每四个字节构成一个指针。指针排列的顺序与属性数据文件(.DAT)中属性数据记录存放的顺序一致。交叉索引文件实际上是一个空间对象的定位表。
(4)、 空间数据文件.MAP
具体包含了各地图对象的空间数据。空间数据包括空间对象的几何类型、坐标信息和颜色信息等。另外还描述了与该空间对象对应的属性数据记录在属性数据文件(.DAT)中的记录号。这样,当用户从地图上查询某一地图对象时,就能够方便地查到与之相关的属性信息。
图2.1 MapInfo的文件格式及数据关联机制
(5)、 索引文件.IND
索引文件并不是必须的,只有当用户规定了数据库的索引字段后mapinfo才会自动产生索引文件。索引文件中对应于每个索引字段都有一个索引表。在每个索引表中,先给出总的数据库记录数目,然后按照索引顺序给出每条属性数据记录在对应的索引字段处的具体属性数据和该记录在属性文件(.DAT)及交叉索引文件(.ID)中的记录号。
图2.2表示了MapInfo的索引文件机制。
图2.2 MapInfo的索引文件格式及数据关联机制
四、 MapX研究
MapX简介
MapX是MapInfo公司向用户提供的具有强大地图分析功能的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境如Visual C++、Visual Basic、Delphi、PowerBuilder等。编程人员在开发过程中可以选用自己最熟悉的开发语言,轻松地将地图功能嵌入到应用中,并且可以脱离MapInfo的软件平台运行。利用MapX,能够简单快速地在企业应用中嵌入地图化功能,增强企业应用的空间分析能力,实现企业应用的增值。MapX采用基于MapInfo Professional的相同的地图化技术,可以实现MapInfo Professional具有的绝大部分地图编辑和空间分析功能。而且,MapX提供了各种工具、属性和方法,实现这些功能是非常容易的。
MapX的空间数据结构
空间数据结构,是GIS的基石,GIS就是通过这种地理空间拓扑结构建立地理图形的空间数据模型并定义各空间数据之间的关系,从而实现地理图形和数据库的结合。
图2.3 MapX的空间数据结构
从横向分析,MapX采取的空间数据结构是基于空间实体和空间索引相结合的一种结构。空间实体是地理图形的抽象模型,主要包括点、线、面三种类型。任何点、线、面实体都可以用直角坐标点x、y来表示。点可以表示成一组坐标(x,y),对于线和面,则均被表示成多组坐标(x1,y1;x2,y2;xn,yn)。空间索引是查询空间实体的一种机制,通过空间索引,就能够以尽量快的速度查询到给定坐标范围内的空间实体及其所对应的数据。
从纵向分析,MapX的空间数据结构是一种分层存放的结构。用户可以通过图形分层技术,根据自己的需求或一定的标准对各种空间实体进行分层组合,将一张地图分成不同图层。采用这种分层存放的结构,可以提高图形的搜索速度,便于各种不同数据的灵活调用、更新和管理。
图2.4 MapX的模型结构
MapX组件的模型结构
MapX组件的基本组成单元是Object(单个对象)和Collection(集合)。其中集合包括对象,是多个对象的组合。每种对象和集合负责处理地图某一方面的功能。
由图2.4可以看出,位于顶层的是Map对象本身,其它均由Map对象继承。Layers、DataSets、Annotations是Map对象下面的三个重要的分支。其中Layer主要用于操作地图的图层,DataSet用于访问空间数据表,Annotation用于在地图上增加文本或者符号。
MapX的显著特征
Ø
专题地图
将数据库表中的特定值赋给地图对象的颜色、图案或符号从而创建不同的专题地图;可创建范围值、等级符号、点密度、独立值、直方图和饼图6种方式的专题地图;
Ø
可深入的地图
通过简单的点击方式可浏览与地图对象相连的数据信息;
Ø
数据绑定
地图可通过嵌入OCX的容器与数据库相连,并提供了几种不同的数据绑定方式包括ZIP Code-level地理编码法;
Ø
注解
可提供方向、加亮显示特殊数据,还可加入文本、符号、表格使地图信息更加丰富直观;
Ø
图层
显示和控制图层的缩放、使用或创建无缝地图、还可支持一些特殊的应用,比如用于实时跟踪的活动图层和可绘制特殊图形的用户自定义图层(如logo图案);
Ø
栅格图象
采用栅格图象作为地图的基础图层可使其它图层有一个更细致的背景;
Ø
自动标记
自动在地图上加入标记,同时标记属性和显示;
Ø
选择
可在地图上拖动鼠标以在圆、矩形或特定的点上选择一个或多个对象或记录以供分析;
Ø
对象库
可以使用FeatureFactory对象,创建、联接或删除点、线、区域图形对象;
Ø
工具
使用MapX的标准工具或根据需要自己创建的自定义工具,用户可通过点击或拖拽对地图直接进行操作;
Ø
地图编辑
允许用户添加、修改、删除地图上的文本、编辑区域、点等特殊对象;
Ø
投影与坐标系
MapX允许用户调整地图的显示、用本地坐标系处理X-Y坐标数据;
Ø
远程空间数据服务器
可以访问存储在Oracle8i 和MapInfo SpatialWare中的远程地图数据。空间数据服务器如SpatialWare和Oracle8i等都提供了先进的查询处理能力 ,提高了空间数据组织的性能。将空间数据存储到关系型数据库中,可以增加应用程序的灵活性,同时也要求在地图编辑和大数据集方面做更多的工作。
MapX的基本属性
Ø
Map
每个Map对象主要包括Datasets、Layers、Annotations三个对象集合。
Map对象有一些主要的属性,如Zoom用来设置放大级别(在地图上显示的大小),Rotation控制地图的旋转角度,CenterX和CenterY用于设置x和y的坐标系,这要取决于地图的投影。
Map对象的许多属性本身又是一个对象,比如说一幅地图由多个图层组成,则在一个Map对象中存在一个单独的layers集合,其中包含所有图层的信息。
Ø
Layers
在MapX中,每张单独的地图都被表示成单独的一个图层,所有的图层存储在layers集合中。Layers集合由Layer对象组成,按顺序编号为0到n。Layer对象由features对象组成,features对象又是由Feature对象组成,对应于地图中的点、线、区域或符号。
最上面一层为Layers(1),Layers(2)位于Layers(1)的下面,以次类推。最下面的图层最先绘制,最上面的图层最后绘制。在应用程序中,合理地安排好每层在Layers中的顺序是至关重要的。比如说有两个图层,一层为点,一层为区域,则应将点层放到区域层的上方,否则区域会将点覆盖。
另外,在进行地图选择操作时,根据要求调整图层的顺序也是十分重要的。MapX中的选择工具总是从可选择图层中的最上层开始选择,如果在地图上的同一位置存在多个位于不同层的地图对象,其结果是很难精确地选择到目标对象。因此,最好将被选择图层提到最上层显示。
Ø
GeoSets
GeoSet是在GeoManager中建立好的.GST文件,类似MapInfo中的WorkSpace概念,是图层及其设置的集合,控制程序中显示的地图。也可以在运行阶段设置GeoSet,此时将导致已经加载的所有图层和DataSet被删除而由GeoSet中定义的图层所代替。如果单纯地想删除所有图层,只需给GeoSet赋一个空字符串即可。
可以使用GeoSet Manager程序来管理GeoSet 文件(*.GST)。默认情况下.GST文件存储在…/mapxmaps目录下,可以调用GeoDictionary Manager程序进行修改,指向用户程序数据所在的位置。
Ø
Datasets
Datasets用于实现地图与数据的绑定。举例说明,有一个关于城市销售情况的MSAccess 数据库和一张该城市的地图,则可以将二者绑定,在地图上形象地显示出各城市销售业绩的趋势,这一点是表格数据无法做到的。
建立地图信息与属性数据之间联系的过程称之为自动绑定或自动匹配(autobinding /automatching)。要实现这一过程,必须首先将地图在GeoDictionary 中注册。
属性数据表示的可视化使得创建专题地图成为可能。
数据绑定"Putting Your Data on the Map"
专题地图"Theme Mapping and Analysis"
Ø
Annotations
Annotations集合提供了操纵地图中文字和符号的简单方法。Annotations位于所有其它图层的上方并且不与任何数据连接,有点儿象MapInfo中的透明图层。
Annotations包括以下主要的属性与方法:AddSymbol在Annotations中增加符号,符号类型使用Map.DefaultStyle定义;AddText在 Annotations中增加文本;Remove删除特定的标注.;Type取值为miSymbolAnnotation或miTextAnnotation。
Annotations还有一个非常重要的属性Graphic,其定义为Graphic对象,在该对象中包含了符号或文本的样式、位置等信息,即Graphic的Caption、Position、Style 、X、Y属性。如Annotations的Type属性定义为miTextAnnotation,则可以定义Graphic的Caption属性设置标注的字符串。
Ø
可创建对象
在MapX对象模型中,以下对象是可以被创建的:
AffineTransform、BindLayer、BitmapSymbols、CoordSys、Datum、Feature、Fields、LayerInfo、Map、 ODBCQueryInfo、 Parts、Point、Points、Rectangle、RowValue、RowValues、Style、Variables、NotesQueryInfo、NotesViewInfo。
在Delphi中创建这些对象需要注意一点,即在后面注明MapX的版本。如在本课题实现过程中,由于使用的是MapX 4.0版本,因此创建语句要写成
s := CreateOleObject(´MapX.Style.3&acute
;
五、 MapX的两个实用应用程序
Geodictionary Manager
Geodictionary其实是一个二进制文件,默认文件名为GeoDict.dct,在这个文件中包含了MapX进行自动数据绑定时可以进行匹配的MapInfo表的注册信息。只有能够被匹配的MapInfo表可以在Geodictionary中注册。需要注意的是,没必要将应用程序中用到的所有表(.tab文件)注册,因为注册一些不必要的表将导致额外的开销。
应用程序Geodictionary Manager的作用是用来操纵与管理Geodictionary。可执行文件GeoDictionaryManager40.exe既可以运行于图形界面也可以使用命令行参数,在进行程序安装时,命令行参数可以用来调用GeoDictionaryManager40.exe以注册相关的MapInfo表。
每当创建一幅地图时,MapX就会在注册表的
HKEY_LOCAL_MACHINESoftwareMapInfoMapX4.0 中查询GeoDictionary的注册键值。注册键值主要包括两方面的信息:一是GeoDictionary,用于定位.DCT文件;二是SearchPaths,其值是缺省的数据目录,用于定位.GST文件,可以是多个目录,之间用逗号隔开。
对于注册键可以有三种取值:
①包含Geodictionary文件的完整目录,如C
rogram FilesMapInfo MapXMapsgeodict.dct。 数据目录被设置成相应的目录,在上例中为C
rogram FilesMapInfo MapXMaps。
②只包含目录信息如C
rogram FilesMapInfo MapXMaps。 数据目录也被设置成这个目录。
③为空值
Map.GeoDictionary的缺省值时"GeoDictionary",这就意味着MapX会在注册表中查询HKEY_LOCAL_MACHINESoftwareMapInfoMapX4.0GeoDictionary。
除了使用默认的GeoDict.DCT文件,也可以根据需要自己建立。新建一个.DCT文件,在Geodictionary Manager中打开,注册必要的.TAB文件并进行相应的设置即可。
在MapX 4.0和更高版本中,MapX的运行不再需要一个永久的Geodictionary文件。
GeoSet Manager
在MapX中,地图是分层显示的,每一层都对应一个表,即.TAB文件。我们的工作往往不是只针对某一个表,如果每次开始工作都重复性地将所用到的表一一打开,不仅麻烦,而且浪费时间。通过使用Geoset Manager,可以将所有的工作表集中在一起,连同每一层的设置一并存储到一个.GST文件中,下次使用时,只需打开此文件就可以了。
在Geoset Manager中,可以浏览已定义的GeoSet,也可以建立新的GeoSet。可以调出Layers控制对话框对每一图层分别进行设置,还可以改变投影方式。另外,在tools菜单中提供了Register Layers in GeoDictionary项,可以将当前.GST中的某些或全部.TAB文件直接注册到GeoDictionary中。
难点篇
第三章 关键技术分析与难点攻克
一、 地图的获取
空间地理数据的获取方式
地理信息系统的最主要特点是能以电子地图的形式,直观地表现背景地物信息,并可做图文互查、综合分析等。因此,在系统开发的最初阶段,首要的问题就是准备一张包括相关地理信息的电子地图。
空间地理数据的获取主要有以下几种方式:
Ø
使用数字化仪
使用手扶跟踪数字化仪,通过人工选点或跟踪线段产生坐标数据。一般用于比较规则的地图或原图质量不太理想的地图,可利用AUTOCAD软件进行编辑修改。
Ø
利用扫描仪
利用扫描仪把图纸信息扫描后以栅格数据结构形式存储,再经其它图象处理软件进一步处理改善图象质量,如图形拼接、降噪、细化等,并把栅格数据转换为矢量数据格式。这种方式要求图纸质量较好软件自动化程度高,交互式工具方便可靠。
Ø
键盘键入
顾名思义,就是通过手工在计算机终端上输入地图数据。
Ø
购买商业性数据
商业性数据可以拿来直接使用。目前电子地图作为一种信息商品,日益受到各界青睐,常见的产品有:卫星影象图——地球资源卫星获得的地表景观影象数据;电子地形图——通过分层技术将多种地理要素分成独立的信息层,每层具有同一属性的地理要素,如等高线、行政界线、道路、水系等;专题电子地图——如土壤类型图、人口专题图等。
Ø
从其它部门获得数字拷贝
根据某些部门标准的原始数据文件,进行数据格式转换,最终形成MapInfo可以识别的数据格式。MapInfo虽然没有公开其内部的数据结构,但它给出了用于格式交换的数据结构,即MIF与MID,其中MIF文件保存图形,MID文件保存文本数据。将其它形式的地图数据转成MIF与MID格式,然后利用MapInfo菜单中的Import命令就可以导入,从而完成转换。另外,MapInfo也支持标准的AUTOCAD数据格式.DXF。
应用分析
在上面谈到的多种方式中,前两种方式获取数据比较精确,也十分专业,但是均需要购买昂贵的专用设备及数字化软件包(常用的有AUTOCAD、CorelDraw等),成本太高;纯粹的手工操作费时费力,容易出错,已无法满足现时的需要。
在世行项目中,主要涉及到陕西省行政界线、灌区位置等地理信息,地理数据精度要求不高,不牵涉复杂的拓扑关系及计算。
开始,希望能够直接得到标准的矢量地图数据。在网上反复查找,能够利用的只有“图行天下”网站(WWW.GO2MAP.COM)可供下载的栅格数据。于是,最终采用的方法如下:
(1)、 下载陕西省行政区界地图,存成栅格文件;
(2)、 在MapInfo中调入该文件,设置投影方式;
(3)、以配准后得到的地图为蓝本,采用手工绘制方法,自定义新的图层并绘制相关地理对象,包括行政区划界线、灌区位置、地级市等;
配准方法与投影选择
栅格图象也称为位图,由象素组成。MapInfo支持BMP、GIF、JPEG、PCX、SPOT、TARGA和TIFF七种栅格图象文件格式。
在MapInfo中打开栅格文件时会显示一个信息框,询问是只简单显示还是要进行配准。如果选择简单显示,则MapInfo自动生成一个与该栅格文件同名的.TAB文件,并在地图窗口中显示,此时的图层称为栅格图层。栅格图象只用于显示栅格图层,而不能象矢量图象图层那样附加数据,因此最适合用作矢量图象图层的背景,从而提供比矢量图象更细致的图象。
如果要同时使用栅格图象与矢量图象则必须首先进行图象配准,这样,MapInfo才能在地图窗口中确切地放置图象。配准过程在图象配准对话框中进行,主要有两方面的工作,一是提供准确的控制点信息,二是指定栅格图象的投影。
实际应用中,将从WWW.GO2MAP.COM下载的多幅gif格式的地图在图形处理软件中进行拼接,最终形成一幅完整的陕西省地图,并存为.BMP文件。在MapInfo中打开,新建图层并覆盖在该BMP图象之上,将其作为编辑矢量地图图层的参考。这种基于屏幕图象来进行编辑的过程称为“屏幕数字化”。
由于此处栅格图象只用作背景参考,因此不必进行栅格图象配准;倘若与矢量图象一起使用,则必须进行配准。
投影是一种方法,用于减少球面上的对象显示在平面上时产生的变形。有许多不同类型的投影,每种投影都是针对某一给定区域的,但是允许使用不同的投影来显示同一幅地图。投影最常用于数字化有明确投影的地图。
坐标系是与投影密切相关的一个概念。一个坐标系是一组参数,说明如何判断对象的定位坐标,其中一个参数就是投影。因此可以认为投影是坐标系的一部分。
地图可以区分为地球地图何非地球地图两类,通常需要进行不同的处理。地球地图包含在地球表面有特定位置的对象,坐标一般用经纬度代表对象的位置;非地球地图包含在地球表面没有特定位置的对象且其对象并不显式地参照地球表面位置的地图,如楼层平面图地功能。非地球地图不包含投影。
小结
充分利用现有资源,发挥栅格图在矢量图层建立过程中的作用,大大减少了地图的准备工作,降低了开发过程中的设备投入和成本,缩短了系统的开发周期。因此选用栅格图作为背景地图,无疑对地理信息系统的开发起到很大的帮助。
在数据准备过程中,深刻体会到国家基础地理数据的缺乏。几个大型的GIS专业网站基本上只提供地图的在线浏览和查询,用户无法直接使用相关的地图数据;商品化的地理数据也并不完善;只有国家基础地理信息系统网站提供一些数据的下载,包括国界、省级行政区划、一级河流、二级河流等,无法进行进一步细致的开发。
二、 地图数据与属性数据的关联
开发过程中涉及的数据主要包括两个来源:一部分是Geoset中包含的地图数据文件,即Djqh.tab、Djs.tab和Gq.tab;其它所有的非几何数据即属性数据均由MS SQL Server管理。因此,要实现图文互动,必须建立几何数据和属性数据之间的关系。
MapX支持的外部数据
在MapX中可以引用多种类型的外部数据。
(1)、 地图数据:如果用户已经购买了或是利用MapInfo创建了MapInfo地图,可以直接将它们在应用中打开。
(2)、 远程空间数据库:利用MapX可以访问保存在Oracle8i及MapInfo SpatialWare中的地图数据。其中,对Oracle8i的支持是MapX 4.0的新特性。通过Oracle8 Call Interface(OCI),MapX可以将存储在Oracle8i数据库服务器中的MapInfo空间数据和属性数据同时下载到本地。
(3)、 其它远程数据:MapX支持多种对外远程数据的访问方式,如ADO、DAO、及RDO等,更可以通过ODBC使用更广范围内的数据。
数据库设计原则
GIS系统中涉及的数据包括图形矢量数据、空间属性数据和工程管理数据。为了增强整个系统数据处理的灵活性,采用分开存储的方法。图形矢量数据以MapInfo标准文件格式存储在特定目录下,图形中每个地物均有其对应的唯一的标识(ID号),系统以此为索引建立该地物的图形数据文件。空间属性数据与工程管理数据均采用MS SQL Server来存储,各地物属性记录的关键字为图形文件中该地物的ID号,由此便实现了图形文件与属性文件的一一对应关系。
图3.1 图形数据与属性数据的关联关系
关联属性数据的方法
在MapX中,属性数据与几何数据的关联是通过数据绑定实现的。
(1)、 什么叫数据绑定
数据绑定是将外部数据引入MapX的过程。
可以绑定的数据源包括以下类型:
类型 描述
ADO 使用ADO(Active data objects)
DAO DAO对象,可以是VB中的data control、Access表格等,也可自己创建
Delphi 使用Borland BDE数据源
Global Handle lets you pass in a block of tab-delimited data
Layer 创建一个Dataset,使用MapInfo表字段
Notes View/NotesQuery 专门用于Lotus Notes
ODBC 可以使用ODBC从任何ODBC数据源中获取数据
OLE Data 用于containers,如PowerBuilder
RDO MS Remote Data Objects和RDO结果集对象
safeArra COM数据集,与safearray中的数据进行静态绑定
Unbound 兼容其它
(2)、 数据绑定的强大作用
数据绑定主要有两个作用。
Ø
以地图中的图形对象来显示数据
通过数据绑定,可以将BindLayer对象作为一个参数,使用Datasets.Add方法将自己的表转变为一个DataSet。这将在地图中创建一个新的图层,并且将表中的数据以点等图形对象表示。一旦将数据引入地图,就可以很容易地使用MapX创建应用程序,并实现多种地图功能。
Ø
将属性数据绑定到地图中,并创建专题图
如果地图对象中包含相应的属性信息,也可以使用Datasets.Add方法将某个属性字段添加到地图中,进而就可以按照需要创建相关的专题图。
(3)、 数据绑定的实现方法
使用Datasets.Add可以将用户数据绑定到地图中。
在MapX中,每张地图对应多个图层(Layers),每一个图层(Layer)都有一个Datasets,其中包含DataSet对象。Datasets拥有一些属性和方法,用来在集合中添加和删除Dataset 对象,主要方法包括Add和Remove。
使用Datasets.Add绑定的最终结果是Dataset对象的创建。这个Dataset对象被加入到Datasets集合中,包含了被绑定图层的对象的计算结果。比如说,如果数据被绑定到US_States地图,每一个州将对应一个新的数据值,这个数据值被用来控制地图的绘制。如果数据源中含有某个州的多个记录,则这些记录的值可以进行累加、平均值等计算。使用Dataset的Value方法可以取得地图中每一个对象的计算结果。
DataSets.Add方法详解
Datasets.Add方法的使用主要需确定所绑定数据源的类型、绑定到地图的哪一层以及与地图之间关联的字段。语法如下:
Datasets.Add Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic]
[]中的参数是可选的,程序中可以省略或传递EmptyParam。EmptyParam在Delphi中已定义的OleVariant类型参数,表示未用参数。
Ø
Type
Type的取值范围为DatasetType常量,对应于可绑定的数据类型, DatasetType的定义如下:
DatasetType=[miDatasetADO,miDatasetDelphi,……,miDatasetLayer,miDatasetODBC,miDatasetUnbound]
其中miDatasetLayer表示绑定的是MapInfo表(.TAB),miDatasetODBC表示绑定的是ODBC 数据源中的表。
Ø
SourceData
根据DatasetType的不同,SourceData有不同的取值,如miDatasetLayer对应MapInfo表,miDatasetODBC对应ODBCQueryInfo对象等等。因此,在引如ODBC数据时,需要首先创建ODBCQueryInfo对象,并为其参数ConnectString、Datasource和SqlQuery赋值。
Ø
Name
String类型,唯一标识Dataset,默认名称为Dataset1、Dataset2……。
Ø
Geofield
指定数据源中包含地理信息的字段名称或索引。如果不指定,则MapX会自动在GeoDictionary中搜索,看哪个字段包含地理信息。比如在“世行项目”中,表T_DJQH的xzqybh字段其实就是用来标识地图中地级行政区划的,因此在调用Datasets.Add时Geofield参数即传递xzqybh。
如果要将数据表示为地图上的图形对象,数据源中GeoField所表示的字段必须唯一,并且被用来命名新的图层中的对象。非唯一值将在新的图层中以一点代替,重复记录对应的数据值将被求和。
如果定义了Fields,则Geofield参数将表示Fields中的字段,而不是sourcedata。
可以看到,Geofield在几何数据与属性数据关联中起了绝对关键的作用。
Ø
Secondary Geofield
只有当被绑定的数据集有非唯一主键时才定义该参数。
Ø
BindLayer
指明外部数据应该绑定到地图中的哪一层。.该参数可选,未指定时MapX自动在GeoDictionary中查找相匹配的图层。但是从性能考虑,在肯定的情况下应当明确指定。
Ø
Fields
描述外接数据源中的哪些字段被引用,以及当数据源中有多条记录对应一个地图对象时使用哪些集合函数,默认的集合函数是SUM(求和)。
如果该参数有定义,则Geofield和SecondaryGeofield参数均将其作为参照。
Ø
Dynamic
布耳类型参数,用于控制数据绑定是否动态,默认为False,表示静态绑定,即当数据库被打开时MapX将拷贝所需数据;如果设定为True,MapX会以实时的方式访问数据。
三、 专题图的生成
1、 专题地图的概念
MapInfo的一个显著特征就是能将数据库中的信息进行直观的可视化分析。专题地图就是用于分析和表现数据的一种强有力的方式。用户可以通过使用专题地图的方式将数据图形化,使数据以更直观的形式在地图上体现出来。当使用专题渲染在地图上显示数据时,可以清楚地看出在数据记录中难以发现的模式和趋势,为用户的决策支持提供依据。专题地图是MapInfo中的一个重要概念,是用户使用好MapInfo的一种体现。
制作专题地图是根据某个特定专题对地图进行“渲染”的过程。所谓的专题渲染,就是以某种图案或颜色填充来表明地图对象(点、线、区域)的某些信息(例如人口、大小、年降雨量、日期等等),也就是说,这类渲染存在着主题,经过这样渲染的地图就是专题地图。利用MapInfo,可根据数据库表中特定的值来赋给地图对象颜色、图案或符号,从而创建不同的专题地图。
2、 专题图的六种类型
MapInfo为创建专题地图提供了强有力的支持。用户可以使用范围值、等级符号、点密度、独立值、直方图和饼图等多达六种方式来创建不同的专题地图。
(1)、 范围值
按照设置的范围显示数据。这些范围用颜色和图案进行渲染。范围专题地图能够通过点、线和区域来说明数值,在反映数值和地理区域的关系(如销售数字,家庭收入),或显示比率信息如人口密度(人口除以面积)时是很有用的。
(2)、 等级符号
等级符号为表中每条记录显示一个符号,符号大小与数据值成比例。等级符号地图用特定的数值来显示数据点,对于阐明定量信息(如由高到低依次变化)很有用处。符号的大小与该点对应的数值成比例,数值越大点就越大,数值越小点就越小。因此,等级符号最适合数据值数据。
(3)、 点密度
在地图上用点来显示数据,每一点都代表一定数量,某区域中点的总数与该区域数值成比例。每个点代表一定数量的单元,该数乘以区域内总的点数,就等于该区域的数据值。
(4)、 独立值
按独立数值渲染地图,可以表达多个变量。根据独立值绘制地图对象的专题地图有助于强调数据的类型差异而不是显示定量信息(如给定区域内的商店类型、分区类型等等)。
(5)、 直方图
将表中每条记录的专题变量显示为一个直方图。使用直方图可分析地图中每条记录的多个变量。比较每个直方图中各直方条的大小可考察表中某条记录,比较所有直方图中某一条的大小可考察所有记录的某个变量,而比较各直方图的高度可考察整张表。用直方图来表达负值时,该条会沿直方图反方向伸展。在叠加直方图中不显示负值。
(6)、 饼图
以饼图显示表中各记录的专题变量。饼图可包含多个变量。在地图上使用饼图可一次分析多个变量,比较每个图中饼扇的大小可考察表中某条记录,比较所有饼图中某一个饼扇,可考察所有记录中某个变量的变化,比较各饼图的直径可考察整张表。
3、 MapX对专题图的支持
MapX中使用Themes集合与Theme对象来实现对专题图的支持,每个Themes集合中可以包含多个Theme对象,也就是说,针对一个Dataset,可以创建多幅不同的专题地图。
每个Dataset都拥有一个Themes集合,并以其属性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制专题的添加和删除。
Ø
Add方法:创建一个专题并将其加入到某个特定的DataSet的Themes集合中,
Map1.Datasets(1).Themes.Add(miThemeRanges,’’’area’,’Myranges Theme’)
Ø
Remove方法:从集合中删除某一特定的专题图
Map1.Datasets(1).Themes.Remove "My Ranges Theme"
Ø
RemoveAll方法:从集合中删除所有的的专题图
Map1.Datasets(1).Themes.RemoveAll
Theme对象用于设置每个专题图的属性。
比较重要的有
Ø
Layer:返回一个Layer对象,表示该专题图所在的图层
Ø
Legend:控制 对专题地图的说明,即图例
Ø
ComputeTheme 控制是否可以对原始数据进行计算,默认为True
Ø
Type 即专题图类型,取值范围为ThemeTypeConstants
Ø
Fields 只读属性,返回该专题图所基于的Dataset中的字段集合
ThemeProperties 复合型属性,对应ThemeProperties对象,包含了专题图详尽的定义信息,如范围定义、显示风格设置等。
4、 专题图的规划
在创建专题图的过程中,有几个关键因素,包括专题图变量的确定、属性数据的获取以及专题图层的显示与控制。
(1)、 确定专题图变量
在专题图中显示的数据就是专题图变量。例如在行政区面积专题图中,表示面积的字段“area”就是这个专题地图的专题地图变量。
一个专题变量可以是一个字段或表达式。取决于专题图的类型,在一张地图上可以显示一个或多个专题图变量。范围值、等级符号、点密度和独立值地图都只检查一个变量。可以利用饼图或直方图一次显示多个专题变量。也可以创建双变量专题地图,其中一个地图对象可代表两个不同的数据,入符号的颜色代表一个专题变量,符号的大小代表另一个专题变量。
(2)、 属性数据的获取
在创建专题地图之前,必须确定需要显示何种信息,信息存储在什么位置。它可以在创建地图时所基于的表中,也可以在ODBC支持的外部数据库中。数据来源于Field对象或Field集合,在Themes.Add方法中通过Fields参数传递。
(3)、 创建专题图
首先应将某个产生专题图数据的dataset引入地图中,之后使用Themes.Add方法创建一个Theme对象。
curmap.Datasets(1).Themes.Add(miThemeRanges,‘TotPop’,‘’);
语法: Themes.Add [Type], [Field], [Name]
Type用于定义要创建的专题图的类型,它的取值范围是ThemeTypeConstants,该参数可选,如果没有定义或者定义为miThemeAuto,MapX会根据字段数以及已经存在的专题图类型自动在ThemeTypeConstants中选择一个。如果MapX无法自行确定专题类型,就会产生一个错误。
Field(s)定义在专题图中使用的一个或多个字段,可以通过字段名、字段索引或字段对象来引用。当创建多变量专题图时,可以使用数组表示。该字段是可选的,若不特意指定,MapX会使用DataSet中的第一个数字型字段。
Name,即专题图的名称,String类型参数,若不指定,MapX会自动生成一个名字。
(4)、 专题图类型常量
专题图变量由Theme.Typeproperty取得,其定义如下:
miThemeRanged = 0
miThemeBarChart = 1
miThemePieChart = 2
miTheme GradSymbol = 3
miThemeDotDensity = 4
miThemeIndividualValue = 5
miThemeAuto = 6
miThemeNone = 9
5、 控制专题地图
有两种方法可以控制专题地图。
(1)、 使用Theme.ThemeDlg方法
该方法显示一个对话框,用户可以直接修改专题图特性。语句如下:
curmap.Datasets(1).Themes(1).ThemeDlg;
这种方法虽然简单,但是而且很难与自己的程序风格相一致,用户界面不友好,而且在这个默认的对话框中,用户可以随意改变任何设置,使得程序的控制难度加大。
(2)、 改变ThemeProperties对象属性
通过设置ThemeProperties对象属性,可以使用自己定制的界面,给用户有限的修改能力,实现起来也非常简单,而且对用户的操作有全部的控制权。
ThemeProperties对象是Themes集合中的一员,主要用于定义专题地图的显示,包括颜色、符号等。不同类型的专题图有自己与众不同的一些特性,在ThemeProperties中有其分别的定义。如DotSize专用于设定点密度专题图中点的大小,NumRanges专用于设定范围值专题图中的范围分布,SymbolStyle控制等级符号专题图使用的符号类型,ValuePerDot用于在点密度专题图中每个点所代表的值。
ThemeProperties对象的属性中有许多又属于其他对象,如RangeCategory、IndividualValue、Style 等,可进行更深层次的设定。
6、 自定义图例
专题地图被创建后,MapX会自动生成一个图例来解释颜色、符号或大小所代表的含义。同ThemeDlg一样,可以直接用LegendDlg 方法调用默认的Legend对话框,但更常用的依旧是访问Theme.Legend 属性来进行一些个性化的设置。
如在程序中可以做如下设置:
var lgd: CMapXLegend;
lgd:=curmap.datasets.item(1).themes.item(1).legend;
with lgddo
begin
title:=´面积专题图´;
subtitle:=´图例´;
ShowCount := false;//去掉默认生成的结果个数
end;
需要注意的是,Legend的Width和Height属性是只读的,显示位置应该由Top和Left改变,单位为屏幕象素点。
7、 代码分析
以下是面积专题图的实现代码:
procedure Tmainform.Ntheme1Click(Sender: TObject);
var
par : Variant;
ds : CMapXdataset;
fields: CMapXFields;
begin
try
curmap.datasets.removeall;//清空数据集中的所有Dataset对象
par := CreateOleObject(´MapX.ODBCQueryInfo.4&acute
;//创建ODBCQueryInfo对象
//设定ODBCQueryInfo的参数
par.SqlQuery := ´select * from T_DJQH´;
par.DataSource := maindm.MYDB.AliasName;
//par.ConnectString := ´ODBC;user=user1;pwd=aaa;dlg=2´;
//对应ODBC表将要使用的字段引入fields
fields := CoFields.Create;
fields.Add(´xzqybh´,´xzqybh´,miAggregationIndividual,miTypeNumeric);
fields.Add(´area´, ´area´, miAggregationIndividual,miTypeFloat);
//生成Dataset,并建立关联
ds := Map1.Datasets.Add(miDataSetODBC, par, EmptyParam,
´xzqybh´, EmptyParam, ´Djqh´, fields, EmptyParam);
//专题图
ds.Themes.Add(miThemeIndividualValue, ´area´, ´mytheme1´,true);
//自定义图例
with ds.Themes.Item(1).legenddo
begin
title:=´面积专题图´;
subtitle:=´图例´;
ShowCount := false;
end;
except
on E: EOleExceptiondo
Application.MessageBox(PChar(E.Message),
´错误´, MB_OK or MB_ICONERROR);
end;
end;
说明:
(1)、 curmap是主界面中的地图变量;
(2)、 ds也可定义成variant类型变量,但这时无法使用ds.Themes.Item(1).legend,而且,定义为CmapXdataset后可使用Delphi中的智能代码功能,激活实时帮助系统,编程更方便;
(3)、 当使用Datasets.Add方法连接ODBC数据源数据时,第一个参数dataset类型应为miDatasetODBC,同时需要使用ODBCQueryInfo对象作为Datasets.Add方法的第二个参数,
Ø
DataSource属性
用于设置ODBC数据源的名字。如果保留不写,则在程序运行时会出现一个对话框,要求用户选择。ODBC数据源可以在Windows控制面板中设置。
Ø
SqlQuery属性
即从ODBC数据库中选取数据的SQL字符串。
Ø
ConnectString属性
包含与ODBC数据源连接的信息,通常包括"ODBC;"、"uid=", "pwd=", or "DLG="。"uid="表示登录名, "pwd="表示登录密码,"DLG=" 控制登录对话框的显示:
DLG=0表示不显示对话框
DLG=1表示总显示对话框
DLG=2只有当信息不完整时显示登录对话框。
mapX的基本 性
MapX的基本属性
每个Map对象主要包括Datasets、Layers、Annotations三个对象集合。
Map对象有一些主要的属性,如Zoom用来设置放大级别(在地图上显示的大小),Rotation控制地图的旋转角度,CenterX和CenterY用于设置x和y的坐标系,这要取决于地图的投影。
Map对象的许多属性本身又是一个对象,比如说一幅地图由多个图层组成,则在一个Map对象中存在一个单独的layers集合,其中包含所有图层的信息。
Ø
Layers
在MapX中,每张单独的地图都被表示成单独的一个图层,所有的图层存储在layers集合中。Layers集合由Layer对象组成,按顺序编号为0到n。Layer对象由features对象组成,features对象又是由Feature对象组成,对应于地图中的点、线、区域或符号。
最上面一层为Layers(1),Layers(2)位于Layers(1)的下面,以次类推。最下面的图层最先绘制,最上面的图层最后绘制。在应用程序中,合理地安排好每层在Layers中的顺序是至关重要的。比如说有两个图层,一层为点,一层为区域,则应将点层放到区域层的上方,否则区域会将点覆盖。
另外,在进行地图选择操作时,根据要求调整图层的顺序也是十分重要的。MapX中的选择工具总是从可选择图层中的最上层开始选择,如果在地图上的同一位置存在多个位于不同层的地图对象,其结果是很难精确地选择到目标对象。因此,最好将被选择图层提到最上层显示。
Ø
GeoSets
GeoSet是在GeoManager中建立好的.GST文件,类似MapInfo中的WorkSpace概念,是图层及其设置的集合,控制程序中显示的地图。也可以在运行阶段设置GeoSet,此时将导致已经加载的所有图层和DataSet被删除而由GeoSet中定义的图层所代替。如果单纯地想删除所有图层,只需给GeoSet赋一个空字符串即可。
可以使用GeoSet Manager程序来管理GeoSet 文件(*.GST)。默认情况下.GST文件存储在…/mapxmaps目录下,可以调用GeoDictionary Manager程序进行修改,指向用户程序数据所在的位置。
Ø
Datasets
Datasets用于实现地图与数据的绑定。举例说明,有一个关于城市销售情况的MSAccess 数据库和一张该城市的地图,则可以将二者绑定,在地图上形象地显示出各城市销售业绩的趋势,这一点是表格数据无法做到的。
建立地图信息与属性数据之间联系的过程称之为自动绑定或自动匹配(autobinding /automatching)。要实现这一过程,必须首先将地图在GeoDictionary 中注册。
属性数据表示的可视化使得创建专题地图成为可能。
数据绑定"Putting Your Data on the Map"
专题地图"Theme Mapping and Analysis"
Ø
Annotations
Annotations集合提供了操纵地图中文字和符号的简单方法。Annotations位于所有其它图层的上方并且不与任何数据连接,有点儿象MapInfo中的透明图层。
Annotations包括以下主要的属性与方法:AddSymbol在Annotations中增加符号,符号类型使用Map.DefaultStyle定义;AddText在Annotations中增加文本;Remove删除特定的标注.;Type取值为miSymbolAnnotation或miTextAnnotation。
Annotations还有一个非常重要的属性Graphic,其定义为Graphic对象,在该对象中包含了符号或文本的样式、位置等信息,即Graphic的Caption、Position、Style 、X、Y属性。如Annotations的Type属性定义为miTextAnnotation,则可以定义Graphic的Caption属性设置标注的字符串。
Ø
可创建对象
在MapX对象模型中,以下对象是可以被创建的:
AffineTransform、BindLayer、BitmapSymbols、CoordSys、Datum、Feature、Fields、LayerInfo、Map、 ODBCQueryInfo、 Parts、Point、Points、Rectangle、RowValue、RowValues、Style、Variables、NotesQueryInfo、NotesViewInfo。
在Delphi中创建这些对象需要注意一点,即在后面注明MapX的版本。如在本课题实现过程中,由于使用的是MapX 4.0版本,因此创建语句要写成
s := CreateOleObject(´MapX.Style.3&acute
;