【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序
摘要:在ArcGIS 9的家族中,增加了兩個(gè)新產(chǎn)品:ArcGIS Engine和ArcGIS Server。由于它們各自分別在C/S領(lǐng)域和B/S領(lǐng)域的強(qiáng)大開(kāi)發(fā)能力,一經(jīng)推出就備受矚目。其中ArcGIS Server更是由于提供了優(yōu)越的再開(kāi)發(fā)能力吸引了所有ArcGIS用戶的目光。
前言(ArcGIS Engine和Server)
????? 在ArcGIS 9的家族中,增加了兩個(gè)新產(chǎn)品:ArcGIS Engine和ArcGIS Server。由于它們各自分別在C/S領(lǐng)域和B/S領(lǐng)域的強(qiáng)大開(kāi)發(fā)能力,一經(jīng)推出就備受矚目。其中ArcGIS Server更是由于提供了優(yōu)越的再開(kāi)發(fā)能力吸引了所有ArcGIS用戶的目光。
????? 那么ArcGIS Server到底是什么呢?ArcGIS Server提供了一套開(kāi)發(fā)集中式的GIS應(yīng)用程序的平臺(tái)。這些應(yīng)用程序可以通過(guò)網(wǎng)絡(luò)提供地理信息的服務(wù)。ArcGIS Server是一套后臺(tái)基于ArcObjects搭建的強(qiáng)大的B/S開(kāi)發(fā)工具。它既可以像ArcIMS那樣輕松的提供在線地圖發(fā)布和在線地圖瀏覽的功能,而且可以像ArcMap那樣提供在線的地圖分析和地圖編輯功能。而后者正是長(zhǎng)期困擾ArcIMS開(kāi)發(fā)人員的問(wèn)題以及Server的優(yōu)勢(shì)所在。
????? ArcGIS Server的用戶可以有很多種,從最普通的IE瀏覽器(瘦客戶端)到大型的ArcGIS桌面應(yīng)用程序(胖客戶端)。這兩種客戶端都非常強(qiáng)大,能夠完成從數(shù)據(jù)瀏覽到簡(jiǎn)單地圖編輯的各類工作。但其中最為強(qiáng)大的仍然是ArcGIS桌面應(yīng)用程序或者使用Engine開(kāi)發(fā)的胖客戶端。因?yàn)檫@種類型的客戶端不但可以跨越網(wǎng)絡(luò)完成瘦客戶端能完成的所有功能,更進(jìn)一步充分施展了ArcGIS Server的在線編輯功能,使得Server這個(gè)平臺(tái)的功能被利用的更加充分。
????? 那么今天我們就來(lái)討論一下,如何使用ArcGIS Engine開(kāi)發(fā)一個(gè)可以跨越網(wǎng)絡(luò)連接ArcGIS Server,并實(shí)現(xiàn)復(fù)雜在線編輯功能的胖客戶端。
????? Engine客戶端連接Server地圖服務(wù)的實(shí)例
????? 為了讓大家更有信心的開(kāi)始我們的工作,首先我用Engine為大家開(kāi)發(fā)一個(gè)具有上述功能的實(shí)例:ESRI中國(guó)(北京)培訓(xùn)中心Server胖客戶端。
????? 在右側(cè)的選項(xiàng)卡上大家可以看到我們可以通過(guò)兩種方式連接Server所發(fā)布的地圖服務(wù):LAN和Internet。這兩種方式基本上解決了我們?cè)谌粘9ぷ髦兴佑|到的所有網(wǎng)絡(luò)類型。進(jìn)一步我們可以看到:通過(guò)指定Server服務(wù)器所在的地址(比如局域網(wǎng)中的V9或者互聯(lián)網(wǎng)中的http://202.111.113.201),我們可以連接任意位置的Server服務(wù)并顯示其中的內(nèi)容。在Map Server和Data Frame兩個(gè)ComboBox中,我們已經(jīng)可以看到Server所發(fā)布的服務(wù)已經(jīng)被拆分并且可以選擇。最后我們?cè)谧钕路降牡貓D顯示區(qū)域中可以清楚地看到 Server服務(wù)中所發(fā)布的所有內(nèi)容。?
????? 那么這些看上去不可思議的過(guò)程到底是如何實(shí)現(xiàn)的呢?
????? 首先我們不妨拆分一下這個(gè)應(yīng)用程序。這個(gè)應(yīng)用程序是由下列這些控件所組成的(只列出主要的):
名稱 控件類型 實(shí)際功能
cmdConnect CommandButton 提供所有的連接代碼幫助Engine客戶端連接Server
Picture1 PictureBox 顯示Server所發(fā)布的地圖服務(wù)中的內(nèi)容
cboMapServer ComboBox 拆分顯示相應(yīng)地址中所有的Server Objects
cboDataFrame ComboBox 拆分顯示每個(gè)Server Objects中所有的地圖對(duì)象
cboBookMark ComboBox 獲取Server地圖服務(wù)中所有的書(shū)簽
????? 我們可以看出,這個(gè)Engine應(yīng)用程序之所以可以連接遠(yuǎn)程的Server地圖服務(wù),主要原因由cmdConnect中相應(yīng)調(diào)用的代碼實(shí)現(xiàn)的功能。那么我們不妨來(lái)看看這些代碼是如何工作的(代碼的說(shuō)明添加在代碼的注釋中)。
Private Sub cmdConnect_Click()
Set m_pMapServer = Nothing ‘如果連接時(shí)用戶正在和另外一個(gè)Server地圖服務(wù)交互,釋放這個(gè)Server Objects ‘準(zhǔn)備連接Server地圖服務(wù),首先創(chuàng)建一個(gè)PropertySet類型的對(duì)象,就好像我們通常連接SDE時(shí)常常做的那樣
Dim pConnectionProps As IPropertySet
Set pConnectionProps = New PropertySet
If optLAN.Value = True Then ‘如果用戶想要連接的是局域網(wǎng)內(nèi)的Server,獲取機(jī)器名
????? pConnectionProps.SetProperty "machine", txtServer.Text
Else
????? pConnectionProps.SetProperty "url", txtServer.Text ‘如果用戶想要連接的事互聯(lián)網(wǎng)上的Server,獲取URL地址
End If
????? 通過(guò)一個(gè)IAGSServerConnectionFactory接口的對(duì)象創(chuàng)建AGSServerConnectionFactory的實(shí)例,并通過(guò)它連接Server地圖服務(wù)
Dim pAGSServerConFactory As IAGSServerConnectionFactory
Set pAGSServerConFactory = New AGSServerConnectionFactory
Set m_pAGSServerConnection = pAGSServerConFactory.Open(pConnectionProps, 0) ‘連接成功 ‘獲取這個(gè)連接中所有的map server對(duì)象
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
????? 那么至此為止我們就成功的連接到了一個(gè)遠(yuǎn)程的Server地圖服務(wù)并獲取了它其中的所有Map Server。這是您看的軟件界面應(yīng)該是下面這個(gè)樣子。您肯定會(huì)注意到,這時(shí)Map Server的ComboBox已經(jīng)處于可選狀態(tài),但是在地圖中沒(méi)有任何的內(nèi)容顯示出來(lái)。這是為什么呢?其實(shí)我們只需要再添加一個(gè)叫做“Draw Map”的功能就可以解決這個(gè)問(wèn)題。
????? 從本質(zhì)上來(lái)講,ArcGIS Server通過(guò)互聯(lián)網(wǎng)發(fā)布地圖服務(wù)時(shí)本質(zhì)上是在發(fā)送地圖服務(wù)的當(dāng)前圖片。所以我們只需要準(zhǔn)確的獲得地圖服務(wù)此時(shí)的圖片已經(jīng)圖片的狀態(tài)信息就可以在PictureBox中相應(yīng)的顯示地圖服務(wù)中的內(nèi)容了。
????? 下面我們來(lái)看看這段代碼是如何將地圖顯示出來(lái)的。
Private Function drawMap(pMapDescriptoin As IMapDescription, pMapServer As IMapServer)
Dim it As IImageType,idisp As IImageDisplay
Dim pID As IImageDescription ‘首先設(shè)定image description為地圖服務(wù)的圖片輸出
Set it = New ImageType ‘創(chuàng)建一個(gè)新的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 ‘生成一個(gè)新的ImageDescription對(duì)象并接受之前設(shè) ‘ImageDisplay和ImageType。
????? 這時(shí)我們就有了一個(gè)大小為 ‘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)建一個(gè)Picture structure專門用來(lái)存儲(chǔ)傳入的圖片對(duì)象對(duì)象
Dim result As Long ‘創(chuàng)建一個(gè)新的圖片對(duì)象
result = OleCreatePictureIndirect(Pic, IID_IDispatch, True, pPic)
Set pPersist = pPic pPersist.Load pMemBlb
Picture1.Picture = pPic Picture1.Refresh
End Function
????? 那么最終在刷新了PictureBox之后我們就可以看到完整的Server地圖服務(wù)的內(nèi)容了。
????? 更多的高級(jí)功能
????? 通過(guò)剛才的一連串代碼操作,我們已經(jīng)知道了如何使用Engine開(kāi)發(fā)一個(gè)客戶端并且連接任意位置的Server地圖服務(wù)了。并且通過(guò)操作PictureBox,我們成功的讓地圖服務(wù)中的內(nèi)容顯示在了我們的客戶端上。(就像我們常常在瘦客戶端上所完成的功能一樣)。
????? 但這僅僅只是我們工作的一個(gè)開(kāi)始。因?yàn)镋ngine開(kāi)發(fā)的客戶端和瘦客戶端最大的區(qū)別在于它底層是基于 ArcObjects搭建的,所以我們的客戶端不僅僅只是能夠?yàn)g覽數(shù)據(jù)還可以進(jìn)一步的處理遠(yuǎn)程客戶端上的Server地圖服務(wù)。就像我們?cè)谏厦嫠吹哪菢?#xff0c;通過(guò)連接我們已經(jīng)成功地獲得了Map Server。那么大家只要順著這個(gè)思路進(jìn)一步的開(kāi)發(fā)下去,就可以獲得我們?cè)谌粘i_(kāi)發(fā)中更為常用的地圖,圖層以及更多的信息。最終,ArcGIS Server變成了Engine客戶端強(qiáng)大的遠(yuǎn)程服務(wù)器和數(shù)據(jù)庫(kù)。大規(guī)模的數(shù)據(jù)雖然存儲(chǔ)在互聯(lián)網(wǎng)的另外一邊,但是在我們的客戶端上仍然可以流暢的進(jìn)行數(shù)據(jù)的分析和編輯等高級(jí)的地理信息操作。
????? 除此之外,ArcGIS Server還賦予了我們更多高級(jí)的開(kāi)發(fā)方式。包括:
????? * Asp.net的WEB應(yīng)用程序開(kāi)發(fā)(開(kāi)發(fā)Server的網(wǎng)站)
????? * 池化和非池化的多種用戶交互模式的開(kāi)發(fā)(網(wǎng)頁(yè)模式的在線編輯)
????? * 拓展ADF的網(wǎng)頁(yè)控件開(kāi)發(fā)(Web應(yīng)用程序的控件開(kāi)發(fā))
????? * 拓展ADF的網(wǎng)頁(yè)模版開(kāi)發(fā)
????? * ArcGIS Server的Web Servics的開(kāi)發(fā)等等(Web Servics)
????? 這些高級(jí)的開(kāi)發(fā)方向不但充分發(fā)揮了ArcGIS Server的功能,更讓您的B/S開(kāi)發(fā)手段極大的豐富并具有生命力。這些高級(jí)的開(kāi)發(fā)方式都會(huì)在ESRI中國(guó)(北京)培訓(xùn)中心的《ArcGIS Server應(yīng)用程序開(kāi)發(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的胖客户端浏览程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 好久没来更新过
- 下一篇: du,df,fdisk,mkfs.ext