|
MapInfo上的GIS系统开发
|
|
来源: 作者:国学 发布时间:1969-12-31
|
|
Mapinfo是美国Mapinfo公司1986年推出的桌面地图信息系统,至今已从最初的Mapinfo for Dos 1.0 发展到了Mapinfo Professional 6.0。 Mapinfo产品定位在桌面地图信息系统上,与Arc/Info等大型GIS系统相比,因Mapinfo图元数据不含拓扑结构,它的制图及空间分析能力相对较弱,但对大众化的PC桌面数据可视及信息地图化应用来说,Mapinfo小巧玲珑,易学易用,价位较低,是一个优选GIS产品。Mapinfo提供了自己的二次开发平台,用户可以在平台上开发各自的GIS应用。二次开发方法归结起来有三种,它们是基于MapBasic的开发、基于OLE自动化的开发及利用MapX控件的开发。从早期的MapBasic到目前的MapX4.5,Mapinfo上的GIS系统开发变得越来越高效、简捷,下面介绍如何利用MapBasic、OLE自动化和MapX开发GIS应用系统。
一、利用MapBasic开发
MapBasic是Mapinfo自带的二次开发语言,它是一种类似Basic的解释性语言,利用MapBasic编程生成的*.mbx文件能在Mapinfo软件平台上运行,早期的Mapinfo二次开发都是基于MapBasic进行的。MapBasic学起来容易,用起来却束缚多多,无法实现较复杂的自定义功能,用它来建立用户界面也很麻烦,从现在角度看,MapBasic比较适合用于扩展Mapinfo功能。 zgwww.net
二、利用OLE自动化开发
1. 建立Mapinfo自动化对象
基于OLE自动化的开发就是编程人员通过标准化编程工具如VC、VB、Delphi、PB等建立自动化控制器,然后通过传送类似MapBasic语言的宏命令对Mapinfo进行操作。实际上是将Mapinfo用作进程外服务器,它在后台输出OLE自动化对象,供控制器调用它的属性和方法。
OLE自动化开发的首要一步就是建立Mapinfo自动化对象,以Delphi为例(后面都是如此),你可设定一个Variant类型的全程变量代表OLE自动化对象,假设该变量名为olemapinfo,那么有:
oleMapinfo := CreateOleObject('Mapinfo.Application')
一旦OLE自动化对象建立,也就是后台Mapinfo成功启动,你就可以使用该对象的Do方法向Mapinfo发送命令,如:
oleMapinfo.Do('Set Next Document Parent' WinHand 'Style 1')
这一命令使Mapinfo窗口成为应用程序的子窗口,WinHand是地图窗口句柄,style 1 是没有边框的窗口类型。你还可以使用自动化对象的Eval方法返回MapBasic表达式的值,如下面语句返回当前所打开的表数: CHINAGEOG.COM
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}']
function WindowContentsChanged(var WindowID: Integer):SCODE;safecall;
function SetStatusText(var StatusText: WideString): SCODE; safecall; CHINAGEOG.COM
//定义界面实现
TMyCallback = class(TAutoObject, IMyCallback)
function SetStatusText(var StatusText: WideString): SCODE; safecall;
function WindowContentsChanged(var WindowID: Integer): SCODE;safecall;
其中WindowContentsChanged函数用于返回变化窗口的ID号,即当地图窗口变化时(如放大、缩小),让Mapinfo将地图窗口的ID号返回给客户程序; 另一个SetStatusText函数返回Mapinfo状态条变化信息。编程人员不能随意定义这些函数,因为只有在三种情况下Mapinfo服务器的CallBack才会被触发:(1)地图窗口发生变化,触发函数为WindowContentsChanged;(2)Mapinfo状态条信息改变,触发函数为SetStatusText;(3)用户选择自定义工具或菜单命令在地图窗口上操作,如用户定制的画线工具,当用户在地图窗口画线时触发Mapinfo的CallBack返回线的坐标位置。
建立客户自动化对象后,调用MapInfo自动化对象的SetCallback方法将客户自己定义的自动化对象告诉Mapinfo,只要程序一运行,客户自动化对象就会自动在注册表中注册,然后就能收到CallBack信息了,如: CHINAGEOG.COM
My:=MyCallBack.Create
oleMapInfo.SetCallBack(My)
这里打一个比方我想会有助于理解上述机制,客户程序与Mapinfo之间的交互就像舞台指挥与木偶演员的交流,客户程序中的地图窗口或说Mapinfo子窗口只不过是一个牵线木偶,后台的Mapinfo才是真正操纵木偶的演员,所以客户程序必须与后台Mapinfo建立正向、反向的联系机制,才能操纵地图窗口中的图形目标。
三、利用MapX开发
1. 掌握使用MapX
MapX是Mapinfo公司最新推出的ActiveX控件产品,目前已经发展到MapX4.5。由于MapX是基于Windows操作系统的标准控件,因而能支持VC、VB、Delphi、PB等标准化编程工具,使用时只需将控件装入开发环境,装入控件后,开发环境ActiveX工具条上会增加一个控件按钮Map,把它拖放到窗体上就可建立一个TMap类型的ActiveX地图对象Map,通过设置或访问该Map对象的属性、调用该Map对象的方法及事件,便能快捷地将地图操作功能溶入到你的应用程序中。
共3页: 上一页 1 [2] [3] 下一页
|
| |
|
[ 收藏]
[ 推荐]
[ 评论(0条)]
[返回顶部] [打印本页]
[关闭窗口] |
|
|
| |
|
|
|