您现在的位置:首页 >> 地理信息 >> 程序开发 >> 内容

基于MapInfo平台的GIS集成开发研究

时间:2013-4-10 10:34:29 点击:

  核心提示:[摘 要]  以MapInfo为基础开发平台,利用其二次开发语言MapBasic和Visual Basic进行集成开发,扩展了MapInfo的功能和应用范围,同时又有应用针对性。集成二次开发既可以充分利用可视化软件开发工具的高效方便的编程功能,又可以充分利用GIS工具软件完备的空间数据可视化分析处理...

1.MapInfo与VB集成开发的基本原理
MapInfo Professional自4.0以上版本提供了一种新的开发方式:OLE Automation。所谓OLE Automation,实际上是一种编程的接口,它允许用户应用程序或组件来控制另一个程序或组件的运行。它包括自动化服务器和自动化控制器。MapInfo与VB集成开发,一般情况下将VB作为自动化控制器,控制和使用自动化对象MapInfo,MapInfo作为自动化服务器,由VB驱动。在这种机制下,用户可以方便地在自己的应用程序中使用MapInfo,包括执行mapbasic命令,向MapInfo中输入数据,以及从中获取数据、修改数据等。
2.MapInfo与VB集成开发GIS分析
(1)建立VB应用程序与Mapinfo OLE的连接
VB应用程序与Mapinfo OLE服务器连接原理是:在VB应用程序中通过OLE Automation技术实现应用程序与Mapinfo的连接,从而实现OLE对Mapinfo的调用。其具体实现方法是:在包含地图窗口的窗体的Load事件中添加代码,首先声明一个Mapinfo对象变量,再创建mapinfo.Application对象。要调用Mapinfo时,通过使用对象变量来传递OLE的可编程对象的程序标识,即:Mapinfo.Application。下面是OLE对象建立的示例:
Private Sub Form_Load()
Dim Mapinfo as Object ‘声明OLE对象变量
Set Mapinfo=CreatcObject("Mapinfo.Application") ‘创建与Mapinfo进行通信的OLE对像,并自动建立连接
End Sub
 (2)在VB应用程序中集成地图窗口
在VB的应用程序中集成Mapinfo的地图窗口,必须在VB的应用程序中为Mapinfo中的应用窗口重新设置父窗口,一般父窗口是窗体,并指定一个Picture控件为集成地图窗口的父窗口。同时还可以设置Mapinfo信息的父窗口和Mapinfo的其它父窗口。这些设置可以使用OLE自动化对象的Do方法来实现。最后,将地图的空间数据、属性数据以及其它数据建立有效的连接。下面是地图集成的一个示例:
‘重新设置mapinfo中的应用窗口的父窗口,其中map是一窗体,picture1是map上的picture控件
MapInfo.do "Set Application Window " & map.hWnd
‘设置picture控件picture1为地图窗口的父窗口
MapInfo.do "Set Next Document Parent " & map.Picture1.hWnd & "Style 1"
‘设置窗口信息的父窗口
MapInfo.do "Set Window Info ReadOnly "
‘打开缺省地图空间
MapInfo.do "Run application""在D:\地图.wor"""
‘将地图数据、属性数据以及其它数据集成
Mapinfo.Do "Register Table ""D:\地图\sx.dbf"" Type dbf'
Mapinfo.Do "Open Table "" D:\地图\sx.dbf" Interactive
‘缺省地图操作
MapInfo.RunMenuCommand 1702
‘在菜单或工具按钮中调用MapInfo的基本功能的方法如下
  MapInfo.RunMenuCommand 1701 ‘选择
  MapInfo.RunMenuCommand 1702 ‘漫游
  MapInfo.RunMenuCommand 1705 ‘放大
  MapInfo.RunMenuCommand 1706 ‘缩小
 (3)在VB应用程序中实现回调
VB应用程序是通过OLE自动化对象对集成的地图窗口进行操作控制的,当VB应用程序在地图窗口进行相关操作,如:地图图形对象的偏辑;地图图形对象的选择;改变地图窗口的状态;选择菜单、按钮等工具控件、窗口内属性数据编辑等。其操作的事件只传递给Mapinfo服务器,而不直接传递给VB应用程序,为了实现在VB应用程序中对事件的处理,就利用Mapinfo对象的SetCallBack回调)方法来处理消息并将其传递给应用程序。当Mapinfo系统通过OLE来实现消息的传递与接收时,首先要建立消息接收和处理的OLE对象类,然后定义不同类型的操作方法,以便处理不同的消息。下面是利用SetCallBack方法来获得不同菜单选项消息进行不同处理的示例。
首先在VB工程中自定义Menultem类,并添加一全程过程:
Public Sub MenuSelect(Byval Menulnfo as Integer) ‘对不同菜单选项消息的处理
Set MenuObject=New Menultem ‘创建接受和处理消息的OLE对象Menu0bject
Mapinfo.Setcallback MenuObject‘实现回调
这样当用户选择不同菜单选项时,MenuObject对象的MenuSelect方法会因Mapinfo系统调用自动执行。
(4)在VB应用程序中调用MapBasic程序
在VB应用程序中处理一些复杂的GIS系统操作时,一般先使用Mapbasic编程方式来处理,再将处理结果返回到VB应用程序中,从而达到其目的。这时可以采用在VB应用程序中调用Mapbasic程序方法来实现。具体方法是:首先声明并创建MBApplications对象,然后利用MBApplications对象的属性和方法进行访问操作。下面是其具体调用示例:
Dim Mapbasic as Object ‘声明对象
Set Mapbasic=Mapinfo.MBApplications ‘创建MBApplica4ons对象
Mapbasic.Do "Run Application" & MbFilename ‘调用Mapbasic程序,其中MbFilename是Mapbasic程序名
(5)允许用户在VB中调整窗口
在VB中用户调整Mapinfo的Map窗口时,Mapinfo并不自动调整Map窗口的内容。如果应用程序允许用户调整Map窗口的尺寸,则需用windows的API函数MoveWindow来调整Map窗口的内容使其与Map窗口新的尺寸一致。
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, _
                                        ByVal x As Long, ByVal y As Long, _
                                        ByVal nWidth As Long, ByVal nHeight As Long, _
                                        ByVal bRepaint As Long) As Long
                                       

Private Sub Form_Resize()
Dim mhwnd As Long
On Error Resume Next
Picture1.Height = Me.Height
Picture1.Width = Me.Width
mhwnd = Val(mainform.mapinfo.Eval("WindowInfo(FrontWindow(),12)"))
MoveWindow mhwnd, 0, 0, ScaleWidth, ScaleHeight, 0
End Sub
(6)标准的回调过程,如状态栏的显示处理等
Maplnfo的状态栏在集成地图应用程序中并不自动显示出来,要在应用程序中有类似Maplnfo的状态栏,还需要使用VB创建一个类,定义以下方法。
①创建SetStatusText方法,它带一个字符串参数。
Public Sub SetStatusText(ByVal StatusText As String)
    Dim OneField As String, TwoField, I As Integer
    Dim Lon As Double
    OneField = GetField(StatusText, 1, Chr(9))
    TwoField = GetField(StatusText, 2, Chr(9))
    I = InStr(OneField, "¡ã")
    If (I > 0) Then
        Lon = Val(Left(OneField, I))
        If (Lon > 180) Then
            fMainForm.sbStatusBar.Panels(1).Text = Format(Lon - 360, "##0.00") + Right(OneField, Len(OneField) - I + 1)
        Else
            fMainForm.sbStatusBar.Panels(1).Text = OneField
        End If
    Else
        fMainForm.sbStatusBar.Panels(1).Text = OneField
    End If
    fMainForm.sbStatusBar.Panels(2).Text = TwoField
End Sub
②如果想要Maplnfo通知客户程序它的地图窗口的变化,创建WindowContentsChange()方法,它带一个整型参数
Public Sub WindowContentsChanged(ByVal WinID As Long)
If WinID = mapWinID Then
        ''UpdateLayerList     '* make sure the layer list is up to date
        ''UpdateMenuAndToolbar    '* make sure menu & toolbar are properly activated
End If
End Sub
③ GetField用于获取Mapinfo返回的指定字段字符串
Private Function GetField(ByVal theStr As String, ByVal whichField As Integer, Delimiter As String) As String
Dim I As Integer
Dim startPos As Integer
Dim argCount As Integer
Dim tmpStr, result As String
If Len(theStr) = 0 Or whichField < 1 Then
    GetField = ""
    Exit Function
End If
argCount = 0
tmpStr = theStr
While InStr(tmpStr, Delimiter) > 0 And argCount < whichField
    argCount = argCount + 1
    result = Left$(tmpStr, InStr(tmpStr, Delimiter) - 1)
    tmpStr = Mid$(tmpStr, InStr(tmpStr, Delimiter) + 1)
Wend
If argCount < whichField Then
    argCount = argCount + 1
    result = tmpStr
End If
If argCount = whichField Then
    GetField = result
Else
    GetField = ""
End If
End Function
3.结束语
以上是将Mapinfo地图集成到VB开发的应用程序中的基本方法及其关键技术。运用此方法开发应用型GIS软件,可以具备普通软件所具有的各种功能,包括放缩、多媒体信息查询、分析、裁剪、图形输出等,可以充分发挥VB开发应用程序时对数据访问和操纵的强大功能和Mapinfo对地图信息管理的强大能力,高效、灵活地开发应用型地理信息系统。

参考文献:
1.Mapinfo 6.0应用开发指南,三味工作室,人民邮电出版社,2001.1
2.Mapbasic程序设计,王晓武等,电子工业出版社,2000.7
3.Visual Basic 6开发使用手册,康博创作室译,机械工业出版社,1999.10

作者:刘成来,任丽秋 来源:网络
相关评论
发表我的评论
  • 大名:
  • 内容:
  • 测绘信息网论文系统(www.othermap.com) © 2018 版权所有 All Rights Reserved.
  • Email:dxbox@163.com 站长QQ:28598865 鄂ICP备13003595号
  • Powered by othermap.comV3.0