【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序
摘要:在ArcGIS 9的家族中,增加了兩個新產(chǎn)品:ArcGIS Engine和ArcGIS Server。由于它們各自分別在C/S領(lǐng)域和B/S領(lǐng)域的強大開發(fā)能力,一經(jīng)推出就備受矚目。其中ArcGIS Server更是由于提供了優(yōu)越的再開發(fā)能力吸引了所有ArcGIS用戶的目光。
前言(ArcGIS Engine和Server)
????? 在ArcGIS 9的家族中,增加了兩個新產(chǎn)品:ArcGIS Engine和ArcGIS Server。由于它們各自分別在C/S領(lǐng)域和B/S領(lǐng)域的強大開發(fā)能力,一經(jīng)推出就備受矚目。其中ArcGIS Server更是由于提供了優(yōu)越的再開發(fā)能力吸引了所有ArcGIS用戶的目光。
????? 那么ArcGIS Server到底是什么呢?ArcGIS Server提供了一套開發(fā)集中式的GIS應用程序的平臺。這些應用程序可以通過網(wǎng)絡提供地理信息的服務。ArcGIS Server是一套后臺基于ArcObjects搭建的強大的B/S開發(fā)工具。它既可以像ArcIMS那樣輕松的提供在線地圖發(fā)布和在線地圖瀏覽的功能,而且可以像ArcMap那樣提供在線的地圖分析和地圖編輯功能。而后者正是長期困擾ArcIMS開發(fā)人員的問題以及Server的優(yōu)勢所在。
????? ArcGIS Server的用戶可以有很多種,從最普通的IE瀏覽器(瘦客戶端)到大型的ArcGIS桌面應用程序(胖客戶端)。這兩種客戶端都非常強大,能夠完成從數(shù)據(jù)瀏覽到簡單地圖編輯的各類工作。但其中最為強大的仍然是ArcGIS桌面應用程序或者使用Engine開發(fā)的胖客戶端。因為這種類型的客戶端不但可以跨越網(wǎng)絡完成瘦客戶端能完成的所有功能,更進一步充分施展了ArcGIS Server的在線編輯功能,使得Server這個平臺的功能被利用的更加充分。
????? 那么今天我們就來討論一下,如何使用ArcGIS Engine開發(fā)一個可以跨越網(wǎng)絡連接ArcGIS Server,并實現(xiàn)復雜在線編輯功能的胖客戶端。
????? Engine客戶端連接Server地圖服務的實例
????? 為了讓大家更有信心的開始我們的工作,首先我用Engine為大家開發(fā)一個具有上述功能的實例:ESRI中國(北京)培訓中心Server胖客戶端。
????? 在右側(cè)的選項卡上大家可以看到我們可以通過兩種方式連接Server所發(fā)布的地圖服務:LAN和Internet。這兩種方式基本上解決了我們在日常工作中所接觸到的所有網(wǎng)絡類型。進一步我們可以看到:通過指定Server服務器所在的地址(比如局域網(wǎng)中的V9或者互聯(lián)網(wǎng)中的http://202.111.113.201),我們可以連接任意位置的Server服務并顯示其中的內(nèi)容。在Map Server和Data Frame兩個ComboBox中,我們已經(jīng)可以看到Server所發(fā)布的服務已經(jīng)被拆分并且可以選擇。最后我們在最下方的地圖顯示區(qū)域中可以清楚地看到 Server服務中所發(fā)布的所有內(nèi)容。?
????? 那么這些看上去不可思議的過程到底是如何實現(xiàn)的呢?
????? 首先我們不妨拆分一下這個應用程序。這個應用程序是由下列這些控件所組成的(只列出主要的):
名稱 控件類型 實際功能
cmdConnect CommandButton 提供所有的連接代碼幫助Engine客戶端連接Server
Picture1 PictureBox 顯示Server所發(fā)布的地圖服務中的內(nèi)容
cboMapServer ComboBox 拆分顯示相應地址中所有的Server Objects
cboDataFrame ComboBox 拆分顯示每個Server Objects中所有的地圖對象
cboBookMark ComboBox 獲取Server地圖服務中所有的書簽
????? 我們可以看出,這個Engine應用程序之所以可以連接遠程的Server地圖服務,主要原因由cmdConnect中相應調(diào)用的代碼實現(xiàn)的功能。那么我們不妨來看看這些代碼是如何工作的(代碼的說明添加在代碼的注釋中)。
Private Sub cmdConnect_Click()
Set m_pMapServer = Nothing ‘如果連接時用戶正在和另外一個Server地圖服務交互,釋放這個Server Objects ‘準備連接Server地圖服務,首先創(chuàng)建一個PropertySet類型的對象,就好像我們通常連接SDE時常常做的那樣
Dim pConnectionProps As IPropertySet
Set pConnectionProps = New PropertySet
If optLAN.Value = True Then ‘如果用戶想要連接的是局域網(wǎng)內(nèi)的Server,獲取機器名
????? pConnectionProps.SetProperty "machine", txtServer.Text
Else
????? pConnectionProps.SetProperty "url", txtServer.Text ‘如果用戶想要連接的事互聯(lián)網(wǎng)上的Server,獲取URL地址
End If
????? 通過一個IAGSServerConnectionFactory接口的對象創(chuàng)建AGSServerConnectionFactory的實例,并通過它連接Server地圖服務
Dim pAGSServerConFactory As IAGSServerConnectionFactory
Set pAGSServerConFactory = New AGSServerConnectionFactory
Set m_pAGSServerConnection = pAGSServerConFactory.Open(pConnectionProps, 0) ‘連接成功 ‘獲取這個連接中所有的map server對象
Dim pAGSSObjs As IAGSEnumServerObjectName
Set pAGSSObjs = m_pAGSServerConnection.ServerObjectNames
Dim pAGSSObj As IAGSServerObjectName
Set pAGSSObj = pAGSSObjs.Next
Do Until pAGSSObj Is Nothing
????? If pAGSSObj.Type = "MapServer" Then
??????????? cboMapServer.AddItem pAGSSObj.name
?????????? Set pAGSSObj = pAGSSObjs.Next
????? End If
Loop
End Sub
????? 那么至此為止我們就成功的連接到了一個遠程的Server地圖服務并獲取了它其中的所有Map Server。這是您看的軟件界面應該是下面這個樣子。您肯定會注意到,這時Map Server的ComboBox已經(jīng)處于可選狀態(tài),但是在地圖中沒有任何的內(nèi)容顯示出來。這是為什么呢?其實我們只需要再添加一個叫做“Draw Map”的功能就可以解決這個問題。
????? 從本質(zhì)上來講,ArcGIS Server通過互聯(lián)網(wǎng)發(fā)布地圖服務時本質(zhì)上是在發(fā)送地圖服務的當前圖片。所以我們只需要準確的獲得地圖服務此時的圖片已經(jīng)圖片的狀態(tài)信息就可以在PictureBox中相應的顯示地圖服務中的內(nèi)容了。
????? 下面我們來看看這段代碼是如何將地圖顯示出來的。
Private Function drawMap(pMapDescriptoin As IMapDescription, pMapServer As IMapServer)
Dim it As IImageType,idisp As IImageDisplay
Dim pID As IImageDescription ‘首先設(shè)定image description為地圖服務的圖片輸出
Set it = New ImageType ‘創(chuàng)建一個新的ImageType并將其設(shè)定為JPG
it.Format = esriImageFormat.esriImageJPG
it.ReturnType = esriImageReturnType.esriImageReturnMimeData
Set idisp = New ImageDisplay
idisp.Height = 400
idisp.Width = 500
idisp.DeviceResolution = 150 ‘設(shè)定圖片的顯示大小和設(shè)備分辨率
Set pID = New ImageDescription
pID.Display = idisp
pID.Type = it ‘生成一個新的ImageDescription對象并接受之前設(shè) ‘ImageDisplay和ImageType。
????? 這時我們就有了一個大小為 ‘400*500,設(shè)備分辨率為150的JPG文件了
Dim pMI As IImageResult
Set pMI = pMapServer.ExportMapImage(pMapDescriptoin, pID) ‘將pMapServer中的內(nèi)容倒入到ImageResult中
Dim b() As Byte ‘將Mime的數(shù)據(jù)類型轉(zhuǎn)換成圖片
b() = pMI.MimeData
Dim pMemBlb As IMemoryBlobStreamVariant
Set pMemBlb = New MemoryBlobStream
pMemBlb.ImportFromVariant b
Dim pPersist As IPersistStream,hBitmap As Long,pPicture As IPictureDisp
Dim Pic As PicDesc,pPic As IPicture,IID_IDispatch As GUID
With IID_IDispatch
????? .Data1 = &H20400
????? .Data4(0) = &HC0
????? .Data4(7) = &H46
End With ‘將GUID設(shè)定為IDispatch接口的GUID
With Pic
????? .Size = Len(Pic)
????? .Type = vbPicTypeBitmap
????? .hBmp = hBitmap
????? .hPal = 0
End With ‘創(chuàng)建一個Picture structure專門用來存儲傳入的圖片對象對象
Dim result As Long ‘創(chuàng)建一個新的圖片對象
result = OleCreatePictureIndirect(Pic, IID_IDispatch, True, pPic)
Set pPersist = pPic pPersist.Load pMemBlb
Picture1.Picture = pPic Picture1.Refresh
End Function
????? 那么最終在刷新了PictureBox之后我們就可以看到完整的Server地圖服務的內(nèi)容了。
????? 更多的高級功能
????? 通過剛才的一連串代碼操作,我們已經(jīng)知道了如何使用Engine開發(fā)一個客戶端并且連接任意位置的Server地圖服務了。并且通過操作PictureBox,我們成功的讓地圖服務中的內(nèi)容顯示在了我們的客戶端上。(就像我們常常在瘦客戶端上所完成的功能一樣)。
????? 但這僅僅只是我們工作的一個開始。因為Engine開發(fā)的客戶端和瘦客戶端最大的區(qū)別在于它底層是基于 ArcObjects搭建的,所以我們的客戶端不僅僅只是能夠瀏覽數(shù)據(jù)還可以進一步的處理遠程客戶端上的Server地圖服務。就像我們在上面所看的那樣,通過連接我們已經(jīng)成功地獲得了Map Server。那么大家只要順著這個思路進一步的開發(fā)下去,就可以獲得我們在日常開發(fā)中更為常用的地圖,圖層以及更多的信息。最終,ArcGIS Server變成了Engine客戶端強大的遠程服務器和數(shù)據(jù)庫。大規(guī)模的數(shù)據(jù)雖然存儲在互聯(lián)網(wǎng)的另外一邊,但是在我們的客戶端上仍然可以流暢的進行數(shù)據(jù)的分析和編輯等高級的地理信息操作。
????? 除此之外,ArcGIS Server還賦予了我們更多高級的開發(fā)方式。包括:
????? * Asp.net的WEB應用程序開發(fā)(開發(fā)Server的網(wǎng)站)
????? * 池化和非池化的多種用戶交互模式的開發(fā)(網(wǎng)頁模式的在線編輯)
????? * 拓展ADF的網(wǎng)頁控件開發(fā)(Web應用程序的控件開發(fā))
????? * 拓展ADF的網(wǎng)頁模版開發(fā)
????? * ArcGIS Server的Web Servics的開發(fā)等等(Web Servics)
????? 這些高級的開發(fā)方向不但充分發(fā)揮了ArcGIS Server的功能,更讓您的B/S開發(fā)手段極大的豐富并具有生命力。這些高級的開發(fā)方式都會在ESRI中國(北京)培訓中心的《ArcGIS Server應用程序開發(fā)教程》中。
?
原文:http://www.gissky.net/Article/107.htm
轉(zhuǎn)載于:https://www.cnblogs.com/lauer0246/archive/2010/12/06/1897765.html
總結(jié)
以上是生活随笔為你收集整理的【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好久没来更新过
- 下一篇: du,df,fdisk,mkfs.ext