開發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的圖例、專題等對象緊密銜接,使用起來方便、簡潔。由于篇幅所限,本文不再細述。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/