MapInfoGIS应用系统二次开发技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MapInfoGIS应用系统二次开发技术

吕丽英,耿云峰

(河北省第三测绘院,河北石家庄050031)

[摘要]

对MapInfo基本产品进行了介绍,系统阐述了三种利用MapInfo产品进行的二次开发模式:

MapInfo作为独立开发平台,利用MapBasic进行二次开发模式;将MapInfo作为OLE对象的开发模式;利用基于ActiveX的MapX控件所进行的开发模式。

[关键词]地理信息系统;MapInfo产品;二次开发;MapBasic;OLE对象;MapX控件[中图分类号]P208

[文献标识码]A

[文章编号]1007-3000

(2008)02-4[收稿日期]2007-12-13

[作者简介]吕丽英(1976-),女,汉族,河北省石家庄人,工程师,主要从事航测遥感及地理信息系统应用开发工作。

常用的地理信息系统平台产品种类很多,但是由于这类产品具有广泛的适用性,因此用户在进行本行业内的地理信息应用系统建设时,往往需要进行这些系统的二次开发,以适应具体业务的需要。

MapInfo系列产品具有良好的性价比,在国

内外的GIS应用中相当普及,易于进行各种方式的二次开发,根据所积累的实践经验,下面简要介绍如何利用MapInfo部分产品进行地理信息系统的二次开发。

1MapInfo基本产品介绍

MapInfo是美国MapInfo公司1986年推出的

桌面地图信息系统,至今已从最初的MapInfofor

DOS1.0发展到了MapInfoprofessional8.5。MapInfo产品定位在桌面地图信息系统上,与ArcInfo等大型GIS系统相比,因MapInfo图元数

据不含拓扑结构,它的制图及空间分析能力相对较弱,但对大众化的PC桌面数据可视及信息地图化应用来说,MapInfo小巧玲珑,易学易用,价位较低,是一个优选GIS产品。

在MapInfo的系列产品中,应用最为广泛的是MapInfoProfessional。MapInfoProfessional是一种基于普通PC微机的通用桌面地理信息系统软件,作为基础的MapInfo产品模块,其主要技术特点如下:

1)快速数据查询,高速屏幕刷新,用户界面具

有良好的图形显示效果;

2)集成能力强,能够根据数据的地理属性分

析信息的应用开发工具,有功能强大的地图数据组织和显示软件包;

3)数据可视化和数据分析能力较强,可以直

接访问多种数据库的数据,如Oracle、Microsoft

Access、Informix、SQLServer、Dbase等;

4)专题地图制作方便,数据地图化方便;5)同时支持16/32位的应用开发,适用于多

种计算机操作系统,如Windows3.1、Windows95、

WindowsNT、OS/2等;

6)完整的Client/Server体系结构;7)完善的图形无缝连接技术;

8)支持OLE2.0标准,使得其它开发语言如

VisualBasic、VisualC++、PB、Dephi等能运用IntegratedMapping技术将MapInfo作为OLE对

象进行开发。

MapInfo的开发模式

MapInfo提供了自己的二次开发平台,用户

可以在平台上开发各自的GIS应用。二次开发方法归结起来有三种,MapInfo作为独立开发平台,利用MapBasic所进行的二次开发模式;将

MapInfo作为OLE对象的开发模式;利用基于ActiveX的MapX控件所进行的开发模式。2.1MapInfo作为独立开发平台,

利用

MapBasic的二次开发模式

MapInfoProfessional提供了基本的GIS功

能,如数据接收功能、建库功能、图形功能、数据

查询与检索功能、专题图制作功能、简单分析功能、数据输出功能等。而MapBasic是建立在MapInfo平台上的用户开发语言,是针对MapInfoProfessional进行的二次开发,完善MapInfoProfessional的功能和灵活地进行各种专业所需功能的开发。它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在MapInfo软件平台上运行,早期的MapInfo二次开发都是基于MapBasic进行的。MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展MapInfo功能。

2.2将MapInfo作为OLE对象的开发模式尽管MapInfoProfessional和MapBasic具有强大的功能,可以实现一般的GIS功能,但是随着用户需求的不断变化,其功能毕竟还是有限的。对于任何GIS软件平台而言,为了能够维持其生命力,就必须要求该平台具有可扩展能力,即支持OLE标准。MapInfo有效地解决了这个问题,允许其它开发语言将它作为OLE对象来进行开发。

1)建立MapInfo自动化对象

OLE自动化开发的首要一步就是建立MapInfo自动化对象,以Delphi为例(后面都是如此),设定一个variant类型的全程变量代表OLE自动化对象,假设该变量名为oleMapInfo,那么有代码:

oleMapInfo:=createoleobject('MapInfo.application')

一旦OLE自动化对象建立,也就是后台MapInfo成功启动,就可以使用该对象的do方法向MapInfo发送命令,如代码:

oleMapInfo.do('setnextdocument.nbspparent'+winhand+'style1')

这一命令使MapInfo窗口成为应用程序的子窗口,winhand是地图窗口句柄,style1是没有边框的窗口类型。另外还可以使用自动化对象的eval方法返回MapBasic表达式的值,如下面语句返回当前所打开的表数,代码如下:

tablesnum:=oleMapInfo.eval('numtables()')

也可以直接调用MapInfo菜单或按钮命令对地图窗口进行操作,如地图放大显示,代码如下:

oleMapInfo.runmenucommand(1705)

2)建立客户自动化对象触发callback

基于OLE自动化开发的难点在于所谓的callback。MapInfo服务器对客户程序地图窗口的反应叫callback,假如在地图窗口中移动地图目标,MapInfo能返回信息告诉你地图目标当前的坐标位置,这就是callback功能。如果想定制自己的地图操作工具或菜单命令,就必须依靠callback。但是想捕获callback信息,你的客户程序必须具备接收callback信息的能力,为此需要在客户程序中定义自己的OLE自动化对象,如代码:

//定义界面

imycallback=interface(idispatch)

['{2f4e1fa1-6bc7-11d4-9632-913682d1e638}']

Functionwindowcontentschanged(varwindowid:integer)

:scode;safecall;

functionsetstatustext(varstatustext:widestring)

:scode;safecall;

//定义界面实现

tmycallback=class(tautoobject,imycallback)functionsetstatustext(varstatustext:widestring):scode;safecall;

functionwindowcontentschanged(varwindowid:integer)

:scode;safecall;

其中,windowcontentschanged函数用于返回变化窗口的id号,即当地图窗口变化时(如放大、缩小),让MapInfo将地图窗口的id号返回给客户程序;另一个setstatustext函数返回MapInfo状态条变化信息。编程人员不能随意定义这些函数,因为只有在三种情况下MapInfo服务器的callback才会被触发:(1)地图窗口发生变化,触发函数为windowcontentschanged;(2)MapInfo状态条信息改变,触发函数为setstatustext;(3)用户选择自定义工具或菜单命令在地图窗口上操作,如用户定制的画线工具,当用户在地图窗口画线时触发MapInfo的callback返回线的坐标位置。

建立客户自动化对象后,调用MapInfo自动化对象的setcallback方法可将客户自己定义的自动化对象告诉MapInfo。只要程序一运行,客户自动化对象就会自动在注册表中注册,然后就能

相关文档
最新文档