开发GIS应用前的数据准备
Geomedia以数据库的方式存储GIS的特征类和矢量图形数据,而不是文件方式,它可以使用各种数据库,包括mdb,SqlServer2000,Oracle等。
在开发GIS应用前,首先要准备好应用中涉及到的地理信息数据。例如要开发一个水利相关的GIS应用,那么我们需要准备该项目所涉及到的地域的地界信息、河流、测站、城市信息等。这些信息在数据库中的存储都要包括两个必不可少的元素:地理坐标和图形信息,反映在Geomedia的表结构中,则每个特征类表至少包含以下字段:
ID,主键,该字段数据类型为int(整形)
Geometry_XLO,Geometry_YLO,Geometry_XHI,Geometry_YHI,这四个字段为地理要素信息的坐标值,数据类型为float(浮点型)
Geometry,地理图形信息,该字段数据类型为image(图象型)
我们可以通过两种方式形成Geomedia的地理信息数据。一是根据测绘到的实际数据,通过Geomedia Professional逐个录入信息。在Geomedia中地理信息包含六种类型:点信息、面信息、线信息、复合信息、影象信息和文本信息。这些信息都以图形的形式存储在数据表的Geometry字段中。另一种方法是将其他已经存在的数据转换为Geomedia格式的数据。例如将Mapinfo,Arcinfo的地理信息数据源转换为Geomedia数据格式。数据形成以后,可以进入开发阶段了。
连接数据库
Geomedia提供了多种连接数据库的途径,在不同的开发项目中,由于需求的差异,要使用的连接方式也有所区别。访问GIS的矢量图形数据信息,一般使用Geomedia的Connection对象连接或者GDatabase对象连接,Connection对象最为常用。访问其他属性数据信息,使用ADO(VB的数据访问对象)或GDO(Geomedia提供的数据访问对象,类似ADO)。ADO和GDO的使用没有什么特殊,下面主要介绍Connection的使用方法。
使用Connection对象连接mdb数据库:
Dim objConn As New Connection
objConn.Location = "D:\Warehouses\River.mdb"
objConn.Connect
使用Connection对象连接SqlServer数据库,这个连接很重要,实际的应用大都采用这种方式:
Dim objConn As New PClient.Connection
With objConn
.Type = "SQLServerRW.GDatabase" (设置在连接中使用的数据库类型)
.Location = "Sql Server" (连接的定位路径)
.ConnectionName = "conn1" (连接的名称)
.ConnectInfo="uid=sa;pwd=;database=dbName;server=serverName"
(连接的描述信息)
.Mode = gmcModeReadWrite (设置连接的读写权限)
.Connect (连接数据库)
End With
如果和其他类型的大、中型数据库进行连接,连接的方法类似于上面介绍的和SqlServer的连接,只需要修改相应的参数即可。
关键控件
利用Geomedia平台开发GIS应用,需要使用两个不可或缺的控件,一个是GMMapView控件,另一个是EventContral控件。
当安装了Geomedia产品后,在安装目录的program子目录下含有两个ocx文件:mapview.ocx和event.ocx,在VB的组件管理中包含这两个ocx,即可使用其相应功能。
GMMapView对象是一个图形显示的容器,它提供了很多用来显示地图信息的属性和方法以及控制显示、读取数据和扩展自动操作的功能。GMMapView对象主要包含以下一些方法:放大、缩小、区域放缩、显示调整、拖动和地图旋转、窗口坐标和地理坐标的转换、获取查看区域在地理坐标中的范围信息、地图刷新、将选中区域自动调整到适合当前窗口大小的尺寸等等。GMMapView对象的属性信息主要包括如下内容:获取当前图例的背景颜色、获取当前选中对象的颜色、获取当前高亮显示的对象颜色、设置和获取当前放缩比例因子、设置和获取当前比例尺、设置和获取当前图例中选中的对象集的属性、扩展图例的属性和方法、扩展坐标系统的属性和方法等等。
EventContral对象通过EventServer对象与一个或多个GMMapView对象关联起来。EventContral响应其相关联的GMMapView中所发生的事件并提供开放式的自动操作功能,处理GMMapView和事件之间的实际通讯。它的函数提供的功能主要是关联或断开通过EventServer对象和GMMapView建立的联系。它的属性提供的功能主要是设置和获取事件反应时间,设置和获取事件控件的扩展信息等等。
在实际应用中,绝大多数的人机交互操作都是通过针对EventContral控件编程实现的,在VB中应用EventContral对象需要通过三个环节:第一个环节是在Form中放置一个EventContral用户控件,第二个环节是使用References(引用)加载动态链接库pservice.dll和pservice.tlb两个文件。第三个环节是在Form的初始化事件中产生EventServer对象,然后通过EventServer对象将事件控件和GMMapView控件关联起来。其代码描述如下:
Dim objEvSrv As EventServer
Set objEvSrv = CreateObject("Geomedia.EventServer")
EventControl1.HesitationTime = 5
EventControl1.AddMapView GMMapView1.Dispatch, objEvSrv
通过以上操作,系统就可以自动捕获在GMMapView上的任何动作事件,我们可以根据实际需要编写相应的操作处理。
例程解析
下面介绍的例程将在窗口中加载一副地图,地图中包含某个城市中的所有单位。单位特征类的矢量图形信息存储在CityInfo.mdb数据库的Unit表中,Unit表结构如前面数据准备部分所介绍,包含坐标信息、图形信息,其中图形信息是点类型数据,属性信息包含单位编号Unit_ID和单位名称Unit_Name。提供的功能为当点击地图上的某一单位时,系统捕获该单位相关属性并显示该单位的编号和名称。以下介绍实现步骤:
1、在Form中放入GMMapView控件、EventContral控件。GMMapView控件用来载入城市地图,EventContral控件用来控制当点击发生时捕获当前选中对象,并作相应处理。
2、在References(引用)菜单项中选中以下必须的支撑文件:
数据库访问库:Intergraph GDO 1.0 Object Library (GDO.tlb)
基础实用函数库:Intergraph GeoMedia Basic Utilities (PBasic.tlb)
地图功能库:Intergraph GeoMedia Map Viewing (PView.tlb)、
坐标系统库:Intergraph GeoMedia Coordinate Systems (PCSS.tlb)。
3、代码以及所代表的含义解释如下:
变量定义部分,SmartLocateService对象用于定位选中区域的对象,LocatedObjectsCollection对象用于获得由SmartLocateService对象锁定的所有对象结果集,PointGeometry对象描述一个Geometry点。
Option Explicit
Dim objEvSrv As EventServer, objDb As GDatabase
Dim objSmart As New SmartLocateService
Dim objLoc As New LocatedObjectsCollection
Dim objPntGeom As New PointGeometry
Dim objRS As GRecordset
在Form的初始化中创建EventServer对象,将事件控件EventControl1和地图控件GMMapView1关联起来。
Private Sub Form_Initialize()
Set objEvSrv = CreateObject("Geomedia.EventServer")
EventControl1.HesitationTime = 5
EventControl1.AddMapView GMMapView1.Dispatch, objEvSrv
End Sub
在Form的装载事件中,主要进行地理坐标系统的设定,连接GIS数据库,创建地图图例,设置图层的相关属性,加载并显示城市中的单位分布图。
Private Sub Form_Load()
' 创建地理坐标系统和图例
Dim objRLE As RecordLegendEntry
Set GMMapView1.CoordSystemsMgr = New CoordSystemsMgr
Set GMMapView1.Legend = New Legend
' 创建数据库连接
Set objDb = CreateObject("Access.GDatabase")
objDb.OpenDatabase "C:\Warehouses\CityInfo.mdb", , True
' 获得单位和机构特征信息表Unit的全部结果集
Set objRS = objDb.OpenRecordset("Unit", gdbOpenSnapshot)
' 创建用于显示所有机构信息结果集的图例
Set objRLE = CreateObject("Geomedia.RecordLegendEntry")
' 将得到的结果集赋给图例,并且指定图例将要显示的地理信息
' Geometry字段名称。
With objRLE
.GeometryFieldName = "Geometry"
Set .Recordset = objRS
Set .Style = New AreaStyle
.Title = "States"
End With
'在GMMapView1控件中加载图例
If objRLE.ValidateSource Then
GMMapView1.Legend.LegendEntries.Append objRLE
objRLE.LoadData
End If
End If
'地图适中显示,设置LocatedObjectsCollection对象可以返回的最大对象
'个数。
GMMapView1.Legend.Fit
GMMapView1.Legend.Visible = True
GMMapView1.Fit
objSmart.PixelTolerance = 3
objLoc.MaxNumOfObjects = 1
End Sub
编写EventControl1控件的点击事件功能,即当点击有效的单位后,系统弹出该单位的编号、名称信息。
Private Sub EventControl1_Click(ByVal MapviewDispatch As Object, ByVal Button As Long, ByVal Key As Long, ByVal WindowX As Double, ByVal WindowY As Double, ByVal WindowZ As Double, ByVal worldX As Double, ByVal worldY As Double, ByVal worldZ As Double)
' 将点击选中的单位坐标信息传给objPntGeom对象。
objPntGeom.Origin.X = worldX
objPntGeom.Origin.Y = worldY
objPntGeom.Origin.Z = worldZ
objLoc.Clear
GMMapView1.MapViewSelectedObjects.Clear
GMMapView1.Refresh
' 定位选中的对象
objSmart.Locate objPntGeom, GMMapView1.Dispatch, objLoc
GMMapView1.MapViewSelectedObjects.Add objLoc.Item(1)
' 在结果集中标记当前选中的对象点
objRS.Bookmark = objLoc.Item(1).Bookmark
' 显示选中点的单位编号和名称信息
MsgBox "编号 = " & objRS.GFields("Unit_ID").Value
& "名称 = " & objRS.GFields("Unit_Name").Value
End Sub
本例中获得图例要显示的结果集是通过GDO的方法实现,更好的办法是使用Geomedia的管道技术,管道技术通过定义查询规范,直接获得查询结果集,并且和Geomedia的图例、专题等对象紧密衔接,使用起来方便、简洁。由于篇幅所限,本文不再细述。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/