开篇:润墨网以专业的文秘视角,为您筛选了一篇PowerBuilder与MapInfo结合进行地理信息系统(GIS)二次开发范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:主要探讨了在基于MapInfod的二次开发应用系统中,采用OLE自动化以及与客户/服务器开发工具powerbuilder系统集成开发的基本方法和集成开发中的一些关键技术的实现方法。
关键词:PowerBuilder;mapinfo;MapBasic;OLE自动化
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)34-1564-03
PowerBuilder MapInfo in conjunction with the Geographic Information System (GIS) Secondary Development
ZHENG Tao
(The Information and Control Engineering School, Xi’an University of Architecture and Technology, Xi’an 710055, China)
Abstract: Based on MapInfod discussed in the secondary development of application systems, and by using OLE automation and client / server development tools PowerBuilder integrated development system, the basic method and integrated development in a number of key technology implementation.
Key words: PowerBuilder; MapInfo; MapBasic; OLE Automation
1 引言
MapInfo是由美国MapInfo公司推出的地理信息系统开发平台,其核心包括MapInfo Professional和MapBasic两个部件。MapInfo地理信息系统平台作为一个图形-文字信息完善结合的软件工具,能将所需要的信息资料形象、直观地与地理图形紧密地联结起来,能提供大量常用的分析、查询功能,能将结果以图形或表格的方式显示出来。MapBasic作为与MapInfo配套的开发工。用户使用MapBasic,可以设计、建立符合自己特点和要求的纯用户化的应用系统。作为一种结构化语言,MapBasic提供了380多种函数和命令语句,既简洁明了、易于学习,又具有强大的功能,可以完成用户的各种需求。与传统的GIS软件相比较,良好的软件集成环境和面向对象及事件驱动的编程思想,都是MapBasic的优点。
PowerBuilder 是一个面向对象的用于构造基于客户/服务器(Client/Server)数据库应用系统的开发工具,它通过ODBC可同时支持Sysbase、Oracle、Informix、SQL Server等多种关系数据库,具有强大的数据库应用程序开发功能,尤其是它提供的如数据窗口(Data Window)等工具,使其能够更加方便有效地访问与操纵数据库。
2 对OLE自动化技术简介
其它应用程序与MapInfo的连接,其它应用程序与MapInfo的连接方式。
1) OLE自动化;
2) 回调(CallBake)]\;
3) 动态数据交换(DDE);
4) 运行其它应用程序;
5) 调用动态链接库(DLL)。
其中,运行其它应用程序方法比较简单,这里不赘谈,而调用动态链接库(DLL)方法需要比较高的技巧,且比较繁琐,不利于实际应用,主要针对OLE自动化技术进行简单说明。
MapInfo允许其它支持OLE(Object linking and embedding,对象连接嵌入)功能的应用程序把MapInfo作为一个对象加以调用。MapInfo作为OLE服务器向其它应用程序提供它的对象,而客户应用程序则使用它的对象。其它应用程序通过调用OLE自动化对象(如MapInfo)的方法。属性来操作MapInfo。例如,调用DO(string)的方法向MapInfo
发送命令串来对MapInfo进行操作。Do语句把后面的字符串解释为MapBasic语句,使得MapInfo就像在执行MapBasic交互命令窗口中键入的命令一样执行这个命令字符串。
下面是使用Delfi5.0利用自动化OLE技术与MapInfo建立连接的具体步骤:
1) 对象声明
Var olemapinfo:Variant;//MapInfo应用程序对象
2) 初始化对象
Olemapinfo:=CreatOLEobject(‘olemapinfo.Application’);//启动MapInfo应用程序对象
3) 工作方式(以在窗体的panell中打开地图窗口为例)
Olemapifo.Do (‘Set next Document parent’+panell.Handle +’style 1’);//“重复化”下一个文档窗口(如map)
Olemapifo.Do(‘open table “c:\data\world”+’map from world’);
//打开world地图窗口。
在跨平台集成地图的应用系统中,OLE客户程序必须能够充当自动化OLE的控制器,能够创建接口的诸要素,如窗口、窗体以及控制,同时还必须能够获取窗口的窗口号(HWND)。
3 开发框架
使用PowerBuilder和MapInfo集成开发技术所开发的应用程序,称为集成的地图应用程序(Integrated Mapping Application)。在集成的地图应用程序中,以客户/服务器的开发模式,使用PowerBuilder开发的应用程序称为客户程序。客户程序运行在前台,通过OLE调用在后台运行的作为OLE自动化服务器的Mapinfo。
在集成的地图应用程序中,根据MapInfo提供的Integrated Mapping接口,在PowerBuilder客户程序中使用Outbound OLE Automation(输出OLE自动化)技术,将MapInfo的地图窗口集成到客户程序中,从而使客户程序具备地图处理能力。客户程序使用MapInfo OLE自动化对象、MapBasic OLE自动化对象的有关属性和方法,通过MapInfo OLE自动化服务器对集成的地图窗口进行控制。
4 建立PowerBuilder客户程序和MapInfo OLE服务器的连接
建立PowerBuilder客户程序和MapInfo OLE服务器的连接在原理上是:在PowerBuilder开发的客户程序中,通过使用Outbound OLE Automation技术实现客户程序和MapInfo服务器的连接,借助OLE调用MapInfo服务器。具体实现上是:在包含地图窗口的框架窗口的Open事件中添加代码,创建一个新的OLEObject,而将MapInfo作为这个新的OLEObject的OLE服务器。要调用MapInfo服务,则需调用ConnectToNewObject()函数并传递OLE Programmable Object的程序标识,即“MapInfo.Application”:
//OLEObject对象的实例
OLEObject MapInfo;
//接收错误代码
Integer ErrCode;
//创建一个与MapInfo进行通信的OLE自动化对象
MapInfo = Create OLEObject;
//连接OLE自动化对象到MapInfo服务器
ErrCode = MapInfo.ConnectToNewObject("MapInfo.Application");
If ErrCode 0 Then
MessageBox("Fatal Error", "Error connecting to the map server. Exiting...");
Ruturn;
End If;
在退出应用程序时,要调用DisConnectToObject()函数断开OLE自动化对象和MapInfo OLE自动化服务器之间的连接,并撤消OLE自动化对象,以释放其占用的系统资源。为此,可在上述框架窗口的Close事件中添加代码实现:
//断开与OLE自动化对象与MapInfo服务器的连接
MapInfo.DisConnectToObject();
//释放OLE自动化对象
Destroy MapInfo;
5 将地图窗口集成到PowerBuilder应用程序中
要将MapInfo的地图窗口集成到PowerBuilder开发的客户程序中,必须在客户程序中为MapInfo中的应用窗口重新指定父窗口,并指定一个Picture控件作为集成的地图窗口的父窗口。可以使用OLE自动化对象的Do方法实现上述功能:
//重新指定MapInfo中的应用窗口的父窗口为应用程序窗口
//其中w_map为一个窗口
MapInfo.Application.Do ("Set Application Window " + String(Handle(w_map)));
//指定一个Picture控件p_map为地图窗口的父窗口,将地图窗口集成到客户程序中
MapInfo.Do ("Set Next Document Parent " + string(Handle(p_map)) + " Style 1").gif (11237 字节)" src="/Newspic/20051181642511909.gif" width=681>;
6 实现回调
在PowerBuilder的客户程序中,是通过OLE自动化对象对集成的地图窗口进行控制,如图2所示。当客户程序在地图窗口进行有关的操作后(例如使用某个自定义工具在地图窗口上单击某个地图对象时),对应的事件只传递给MapInfo服务器,而不直接传递给客户程序,为了在客户程序中对事件进行处理,必须采用回调技术。由于在PowerBuilder中不能定义公共的回调类,因此必须编写一个在MapInfo服务器中运行的MapBasic应用程序,用来将回调信息反馈给PowerBuilder客户程序。其实现过程为:
首先,在包含集成地图窗口的PowerBuilder应用窗口创建一个用户自定义事件ue_SelectionMade,事件ID为pbm_Custom01(= 1024)。
然后,编写一个在MapInfo服务器中运行的MapBasic应用程序,在此应用程序中添加对地图窗口事件进行处理的子程序。当对客户程序中的集成地图窗口进行操作时,MapBasic程序中对应的事件处理程序被触发。在事件处理程序中,可以将要传递给客户程序的信息保存到MapBasic中定义的一个全局变量中,然后使用Win32 API函数PostMessage(),以PowerBuilder应用窗口的句柄和该窗口的用户自定义事件的ID为参数,向PowerBuilder客户程序发送消息,这样PowerBuilder客户程序就可以在该窗口的用户自定义事件中处理地图窗口事件了,并且还可以使用MBApplications对象的方法,获取MapBasic全局变量中保存的事件信息。如下代码展示了MapBasic应用程序在接收到地图对象选择事件时的处理的过程:
' 预定义PowerBuilder应用窗口的用户自定义事件的唯一数值标识符
DEFINE SELECTION_MADE 1024;
'响应地图对象选择事件
Sub SelChangedHandler();
'如果选中一个地图对象
If CommandInfo(CMD_INFO_SELTYPE) = 1 Then
'保存地图对象所在的表的名称
g_seltabname = SelectionInfo(SEL_INFO_TABLENAME);
'向PowerBuilder客户程序发送消息
iRc = PostMessage(g_pbhwnd_bg,SELECTION_MADE,0,0);
End If;
End Sub;
下面的程序段中给出了实现回调时PowerBuilder客户程序的处理过程。该处理过程使用了MapBasic编写的mbserver.mbx程序。在MapBasic程序中保存事件信息的变量为g_SelTabName,而g_PbHWnd是MapBasic程序中用来接收PowerBuilder客户程序窗口句柄的全局变量。
//在MapInfo服务器中运行MapBasic应用程序
MapInfo.Do("Run Application ~"" + gs_AppDir + "DataFusion.mbx~"");
//创建对MapBasic应用程序进行控制的OLE自动化对象
MBAppOleObject = Create OleObject;
MBAppOleObject = MapInfo.MBApplications.Item(1);
//传递PowerBuilder客户程序中的窗口句柄给MapBasic应用程序
//以便MapBasic应用程序将返回给PowerBuilder客户程序
MBAppOleObject.MBGlobals.Item("g_pbhwnd_bg").Value = String(Handle(this));
由下面代码所示的PowerBuilder客户程序就可以在窗口w_map的用户自定义事件ue_SelectionMade中处理地图窗口事件:
//在PowerBuilder客户程序的用户自定义事件中使用MBAppOleObject对象获取回调信息
ls_MI_CommandInfo = MBAppOleObject.MBGlobals.Item("g_CommandInfoString").Value;
7 充分利用MapBasic应用程序
MapBasic是MapInfo提供的用户系统开发工具,它具有对地图对象的管理、对含有地图对象的MapInfo表的管理等方面的强大功能。
在将MapInfo地图集成到PowerBuilder的开发应用中,MapBasic不仅仅能用来实现回调,还可实现其它诸多功能。例如,在开发过程中经常会遇到需要保存地图对象类型的中间结果的问题,而在PowerBuilder中没有与之对应的数据类型,又难以通过MapInfo OLE自动化对象的方法和属性实现等诸如此类的问题,若利用MapBasic应用程序以及使用它的OLE自动化对象MBApplications的方法和属性来解决,可以达到事半功倍之效果。
与MapInfo OLE自动化对象相似,MapBasic的OLE自动化对象MBApplications也有自己的Do方法和Eval方法。每当PowerBuilder客户程序调用它们时,MapInfo就会自动调用MapBasic的保留过程RemoteMsgHandler()或RemoteQueryHandler()过程,并可以在过程中通过CommandInfo(CMD_INFO_MSG)得到调用Do方法或Eval方法的参数。
以下代码运用MBApplications的Do方法,实现改变当前选中地图对象的颜色:
//要求将当前选中地图对象的颜色改为兰色
MBAppOleObject.Do("Blue");
MapInfo将自动调用RemoteMsgHandler()过程:
Sub RemoteMsgHandler();
Dim MyObject As Object;
'获取并分析Do方法的参数
CmdInfoStr = CommandInfo(CMD_INFO_MSG);
'改变地图对象的颜色
If CmdStr= "Blue" then
MyObject = Selection.obj;
Alter Object MyObject Info 2, MakeCustomSymbol ("Towe1-32.bmp", RGB(0,0,255), 18, 2);
Update Selection set obj = MyObject Where RowID = 1;
End If;
End Sub;
MBApplications的Eval方法的调用与Do方法的类似,只不过MapInfo将自动调用RemoteQueryHandler()过程,并要求返回一个结果。
8 结束语
本文主要说明了如何将MapInfo地图集成到PowerBuilder的开发应用中的一些基本方法和关键技术。运用此方法开发应用程序,可以充分发挥PowerBuilder强大的数据访问与操纵能力和MapInfo的地图信息管理功能,迅速地、灵活地开发基于地理信息系统的客户/服务器的信息管理系统。
参考文献:
[1] 陈述彭.地理信息系统导论[M].北京:科学出版社,2000.
[2] 张剑平,任福继,叶荣华,等.地理信息系统与MapInfo应用[M].北京:科学出版社,1999.
[3] 龚健雅.地理信息系统基础[M].武汉:科学出版社,1999.