飞蛾 羽泉 原版伴奏:基于Geomedia Professional平台的GIS开发(二)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 20:39:39
基于Geomedia Professional平台的GIS开发(二) ......................................................................................................................... 发布时间:2006-1-20 16:00:31     3.几种开发方式

    Geomedia提供了三种开发方式供用户选择。

1)       驱动Geomedia开发

这种开发方式是创建一个应用程序来驱动或运行Geomedia应用程序,这有点类似于VB驱动Excel。使用这种开发方式可以自己对Geomedia Professional这个产品进行定制,例如:你可以去掉不需要的菜单,保留所需要的菜单,添加自己开发的菜单,控制工作流程等。通过这种方式,你可以将Geomedia Professional定制成自己的应用程序。

2)       命令式开发

这种开发方式直接使用Geomedia Professional的应用程序框架,然后通过添加命令来扩展Geomedia的功能。

以VB为例,在VB的AddIns->AddIn Manager里选择调用Geomedia Command Winzard。利用Geomedia Command Winzard可以帮助你一步步地建立命令。该命令包括一个DLL文件和一个INI文件,然后你需要运行在Geomedia Professional\Program目录下的InstallUsrCmd命令来注册所生成的命令。步骤如下:

a)       转到所生成命令所在的目录,然后执行“InstallUsrCmd CommandName.DLL CommandName.INI”,其中CommandName.Dll和CommandName.Ini是你所生成的DLL和INI文件。

b)       进入Geomedia Professional,在Tools->Customize的Menus或Toolbars的Custom找到刚注册的命令,把命令分别放到菜单或工具条的适当的位置,这个命令就会象其它的菜单或工具条一样工作在Geomedia里了。

3)       组件式开发

使用Geomedia对象创建应用程序。这种开发方式是当今GIS开发的主流,容易上手,且开发周期短。由于驱动Geomedia开发和命令式开发不是很常用,所以我们这里将重点介绍的是组件开发方式。

4.组件式开发实例

下面以VB开发工具为例告诉读者如何用组件开发的自定义开发方式显示一幅美国地图(使用的GIS开发平台是Geomedia Professional 5.0,使用的数据库为Geomedia Professional自带的数据库USSampleData.mdb数据库。用到的存储美国国家地图的表是States表。存储空间图形的字段是States表中的类型为BLOB的Geometry字段)。

1)       在VB的Project->References里选择如下的类型库:

Intergraph Geomedia Basic Utilities 5.0
Intergraph Geomedia Client Support 5.0
Intergraph Geomedia Coordinate Systems 5.0
Intergraph Geomedia Database Pipes 5.0
Intergraph Geomedia Services 5.0
Intergraph GDO 1.0
Intergraph Geomedia MapViewing 5.0
Intergraph Geomedia Services Constants 5.0
Intergraph Geomedia Client Commands 5.0
Intergraph Geomedia Geometry Pipes 5.0

在VB的Project->Components里选择如下的控件:
Intergraph Geomedia Mapview Control 5.0(地图视图控件)
Intergraph Geomedia NorthArrow Control 5.0(指北针控件)
Intergraph Geomedia ScaleBar Control 5.0(比例尺控件)

该例子使用一个Form窗体命名为frmMap,在窗体上添加地图视图控件(ocxMapView),指北针控件(GMNorthArrow1)和比例尺控件(GMScaleBar1)。

2)       首先定义一个Connection类型的全局对象gobjConnection,用来进行数据库连接。

Global gobjConnection as new Pclient.Connection

在frmMap窗体的Load事件添加如下代码:

Private Sub Form_Load()

'设置地图窗口的坐标系为缺省的坐标系
    Set ocxMapView.CoordSystemsMgr = New CoordSystemsMgr

'设置地图窗口的图例
Set ocxMapView.Legend = CreateObject("GeoMedia.Legend")
    ocxMapView.Legend.Visible = True

'将指北针和地图窗口联系起来并设置指北针在地图窗口的位置
    Set GMNorthArrow1.MapViewID =  ocxMapView.Dispatch
    GMNorthArrow1.Top = 0
    GMNorthArrow1.Left = Me.ScaleWidth - GMNorthArrow1.Width

'将比例尺和地图窗口联系起来并设置比例尺在地图窗口的位置
Set GMScaleBar1.MapViewID = ocxMapView.Dispatch
   GMScaleBar1.Top = Me.ScaleHeight -  GMScaleBar1.Height
   GMScaleBar1.Left = 0#

'下面这些代码将显示一幅美国地图
    On Error GoTo errorhandler
    Dim objRS As Grecordset
CreateConnection
    CreateRecordset objRS
    If Not (objRS Is Nothing) Then
      MousePointer = vbHourglass
      Dim objLE As RecordLegendEntry
      Set objLE = GetLegendEntry(objRS)
DisplayTheLegendEntry objLE
  MousePointer=gmmvctNWArrow  '设置鼠标为选择箭头

End If
  Exit Sub
errorhandler:
    MsgBox Err.Description, vbOKOnly + vbExclamation, "DisplayFeature Error"
End Sub

最后,在frmMap的Unload事件添加如下代码,释放gobjConnection全局对象所占用的内存。

Private Sub Form_Unload(Cancel As Integer)
    If Not (gobjConnection Is Nothing) Then
        Set gobjConnection = Nothing
    End If
End Sub

在上面的Form_Load代码里用到了四个自定义函数CreateConnection,CreateRecordset,GetLegendEntry和DisplayTheLegendEntry。下面将针 对这四个函数分别进行介绍:

a)       CreateConnection过程
在Geomedia里连接数据库有两种方法,一是用Gdatabase的OpenDatabase方法,另一个是用Connection对象的Connect方法。下面这个过程就是用Connection对象的Connect方法连接Access数据库的,也可用这两个方法连接其他数据库。

过程代码如下:

Public Sub CreateConnection()
'*********************************************************
  '功能描述:建立与数据库的连接,所建立连接是只读的Access数据库连接
'**********************************************************
On Error GoTo errorhandler
With gobjConnection
        .Type = "Access.GDatabase"
        .Location = "C:\Warehouses\USSampleData.mdb"
        .Mode = gmcModeReadOnly
        .Connect
End With

Exit Sub
errorhandler:

MsgBox Err.Description, vbOKOnly + vbExclamation, "CreateConnection_ Failure"
        End Sub

b)       CreateRecordSet过程
在Geomedia里建立记录集也有多种方法。例如:你可以用标准管道,也可以用GDatabase对象的OpenRecordset。这里用的是标准管道的方法建立记录集。
Public Sub CreateRecordset(objRS As GRecordset)
'***************************************************************
  '功能描述:这个过程将建立States特征的记录集
  '输入参数:objRs-GrecordSet类型

'***************************************************************
On Error GoTo errorhandler
    '这里用标准管道建立States记录集
    Dim objOP As OriginatingPipe
    gobjConnection.CreateOriginatingPipe objOP
    objOP.Table = "states"
    Set objRS = objOP.OutputRecordset
    Set objOP = Nothing
'先由扩展属性集来得到用来显示地图的图形字段,如果不能找到,则遍历States '表中的每一个字段,来找到图形字段名
    Dim objEPS As ExtendedPropertySet
    Dim sGeometryField As String
    Set objEPS = objRS.GetExtension("ExtendedPropertySet")
    sGeometryField = objEPS.GetValue("PrimaryGeometryFieldName")
    If sGeometryField = "" Then
      Dim objField As GField
      For Each objField In objRS.GFields
        If objField.Type = gdbGraphic Then
          sGeometryField = objField.Name
          Exit For
        End If
      Next objField
      Set objField = Nothing
      Set objEPS = Nothing
End If
            '建立数据库和地图视图的坐标转换
    If Not (frmMap.ocxMapView.CoordSystemsMgr Is Nothing) Then
      Dim objSTS As New ServerTransService
      Dim objAltTransform As AltCoordSystemPath
objSTS.CreateSimpleTransFromCSMtoServer _
frmMap.ocxMapView.CoordSystemsMgr, _
        objRS.GFields(sGeometryField).CoordSystemGUID, _
        gobjConnection.Database, objAltTransform
      Set objAltTransform = Nothing
      Set objSTS = Nothing
End If
Exit Sub
errorhandler:
  MsgBox Err.Description, vbOKOnly + vbExclamation, "CreateRecordset Error"
  Set objSTS = Nothing
  Set objAltTransform = Nothing
  Set objField = Nothing
  Set objEPS = Nothing
End Sub