丰田即将上市小型suv:一个关于Mapinfo数据和数据库的问题

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/03 00:32:20
我用VB6.0编程。
通过编程实现Mapinfo数据中的mif数据的显示,不要用别的插件或者是开发控件。我在附件中放了两个mif文件,其中存储的是几条线的信息。
要求是,第一个功能是通过编程把mif文件中的空间数据导入Access数据库中。第二是把数据库中的空间数据显示出来。
我一个同学是这样做的,先把mif数据转入TXT文件,
再把TXT文件中的空间数据导入数据库,显示的时候是把Access中的空间数据导入TXT文档中,再空间数据显示出来。
老师的要求是把MIF文件中的空间数据直接导入数据库中,显示时在直接提取显示,数据库的连接使用ADO连接的方法。
那位大侠帮我一下,有什么思路,代码,或者资料都成,最好是资料。
我的邮箱是dsfdsf123@yahoo.com.cn

1 Callback

在我们的程序中集成MapInfo应用后,MapInfo能够自动地向客户程序发送信息。例如,在应用程序中,当地图窗口发生变化时,MapInfo将调用客户端程序通知发生变化的窗口的句柄。当发生某一事件导致MapInfo调用客户端程序的这种方法称为Callback(回调)。

在下列情况中,Callback允许MapInfo发送消息给客户应用程序:

·用户使用定制工具与MapInfo窗口进行交互

例如,用户点击并拖动鼠标在MapInfo的地图窗口上画线时,MapInfo能够把用户选择的各点坐标消息发送给应用程序。

·用户选择菜单命令

例如,如果应用程序定制了MapInfo的快捷菜单(即用户右击时弹出的菜单),当用户从快捷菜单中选择了定制的命令后,MapInfo就会把这个菜单事件通知给应用程序。

·地图窗口发生变化

当用户改变地图窗口内容(如添加或删除图层,平移地图时),MapInfo就会将发生变化的窗口句柄告知应用程序(这类似于apasic自身的句柄过程:WinChangedHandler。)?

·MapInfo中状态栏的内容发生变化

2 在P中实现MapInfo的callback

为了使用MapInfo的callback,应用程序必须能作为DDE服务器或OLE自动化服务器。VC++,V,Delphi等开发工具对OLE自动化服务的支持都很好,开发起来很方便。但P对OLE自动化服务的支持不够理想,笔者和周围的许多同行试了很多方法都未能实现Callback。是不是在P里就不能使用MapInfo的Callback呢?通过查阅了大量的文献,终于找到了一个方法实现了Callback。其原理如图1所示。

图1 在P中实现MapInfo的callback的原理图

实现步骤如下:

打开P的库画板,新建一个P库并命名为Ole[CD#*3]Callack.pbl;定义一个立即数变量:integer handle;在库中创建一个不可见自定义用户对象:nuo[CD#*3]Callack,为其添加用户对象函数:public subroutine uf[CD#*3]ini(integer Whnd),无返回值。?

在其脚本中添加代码如下:

handle=Whnd

如果要将MapInfo状态栏的信息反映到客户应用程序的状态栏上,则要添加一个名为SetStatusText用户对象函数,只有一个字符串型(string)的参数。当每次地图窗口发生变化时,需要MapInfo通知应用程序,就要添加一个名为WindowContentsChanged用户对象函数,只有一个四字节整型(integer)的参数。当自定义菜单项或自定义按钮被使用时,如果需要MapInfo通知应用程序,就要添加一个名为与自定义菜单项或自定义按钮的过程名相同的用户对象函,只有一个字符串型(string)的参数。限于篇幅,我们在这里仅添加名为WindowContentsChanged用户对象函数,参数为:integer asresponse,无返回值。

在其脚本中添加代码如下:

send(handle,1024,0,as_response)/*向句柄号为handle的窗口发送系统消息为pbm_custom01的消息,并把as_response也发送过去*/

保存库文件并编译成P运行时链接库Ole_Callack.pbd,这是关键所在。我们的第一阶段工作就完成了,在后面的工作中我们要使用这个链接库。

在P的库画板再新建一个名为Callack_Test.plb的P库,新建一个DI窗口w_main和一个用作w_main的sheet窗口w_sheet。

为w_main新增一个用户自定义事件:ue_MapInfoWCHnd事件号为pbm_custom01,用以接收MapInfo发来的窗口句柄。

在w_main的open事件中编写代码如下:

openSheet(w_sheet,w_main)

在w_main的ue_MapInfoWCHnd事件中编写代码如下:

messagebox(“回调测试”,“MapInfo返回的地图窗口发生变化的窗口

句柄为:”+string(as response))

在w­_sheet的open事件中编写代码如下:

OleObject myPOleObject

myPOleObject=create OleObject/*创建Poweruilder OLE自动化服务对象*/

int Errcode

ErrCode=myPOleObject.ConnectToNewObject(“Poweruilder.Application”)

If ErrCode<>0Then

Messageox(“错误”,“连接Poweruilder服务器错误,退出。”)

Halt Close

end if

/*这就是我们前面编译好的链连库Ole[CD#*3]Callack.pbd的完整路径*/

myPOleObject.LibraryList=“c:\Callack.pbd”

myPOleObject.achineCode=False /*如果你编译成的是机器码就用True,这里是False*/

OleObject UserOleObject /*创建用户自定义OLE对象*/

UserOleObject=Create OleObject

/*链接到不可见自定义用户对象:nuo_Callack*/

UserOleObject=myPOleObject.CreateObject(“nuo_Callack”)

if isNull(UserOleObject)then

messagebox(“没有对象”,“不能创建对象UserOelObject”)

halt close

end if

myPOleObject.uf_int(handle(w[CD#*3]main)/*把主窗口的句柄传递给用户自定义OLE对象*/

OLEObject IOleObject

IOleObject=Create OLEObject

/*连接MapInfo OLE服务器*/

ErrCode=IOleObject.ConnectToNewObject("MapInfo.Application")

If ErrCode<>0Then

Messageox(“连接错误”,“连接地图服务器错误,在使用本程序前要安装MapInfo软件。”)? Halt

End If

/*把我们的自定义OLE对象传递给MapInfo OLE对象的Callack*/

IOleObject.SetCallack(UserOleObject)

/*重新定向MapInfo的地图窗口到w_sheet上*/

IOleObject.Do(“Set Next Document Parent”+String(Handle(this))+“Style 1”)? IOleObject.Do(′Set.Application Window′+String(Handle(this)))

/*打开MapInfo地图并在w_sheet上显示*/

IOleObject.DO(′run application"c:\maptest.wor"′)

编译执行。改变地图窗口的大小或图层,w_main主窗口将会接收到MapInfo发来的消息,将会弹出我们前面的消息窗口显示发生变化地图窗口的句柄,将它替换成相应的代码就可以进行相应的处理了。

3 说 明

本程序在Poweruilder 6.5下编译测试通过,在MapInfo Professional 4.0、MapInfo Professional 4.5和MapInfo Professional 5.0环境下均运行良好。

4 结 论

P对OLE自动化服务的支持并没有VC,V,Delphi等开发工具的支持强大,我们只好采用迂回策略,定制一个P用户自定义OLE对象用来作MapInfo的OLE调用,再把自定义OLE对象接收到的消息发送给我们的应用程序,从而实现了P与MapInfo的交互,进而用这个方法开发出功能完善的大型GIS数据库应用程序。