日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序

發(fā)布時(shí)間:2024/4/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要:在ArcGIS 9的家族中,增加了兩個(gè)新產(chǎn)品:ArcGIS Engine和ArcGIS Server。由于它們各自分別在C/S領(lǐng)域和B/S領(lǐng)域的強(qiáng)大開發(fā)能力,一經(jīng)推出就備受矚目。其中ArcGIS Server更是由于提供了優(yōu)越的再開發(fā)能力吸引了所有ArcGIS用戶的目光。

前言(ArcGIS Engine和Server)

????? 在ArcGIS 9的家族中,增加了兩個(gè)新產(chǎn)品:ArcGIS Engine和ArcGIS Server。由于它們各自分別在C/S領(lǐng)域和B/S領(lǐng)域的強(qiáng)大開發(fā)能力,一經(jīng)推出就備受矚目。其中ArcGIS Server更是由于提供了優(yōu)越的再開發(fā)能力吸引了所有ArcGIS用戶的目光。

????? 那么ArcGIS Server到底是什么呢?ArcGIS Server提供了一套開發(fā)集中式的GIS應(yīng)用程序的平臺(tái)。這些應(yīng)用程序可以通過網(wǎng)絡(luò)提供地理信息的服務(wù)。ArcGIS Server是一套后臺(tái)基于ArcObjects搭建的強(qiáng)大的B/S開發(fā)工具。它既可以像ArcIMS那樣輕松的提供在線地圖發(fā)布和在線地圖瀏覽的功能,而且可以像ArcMap那樣提供在線的地圖分析和地圖編輯功能。而后者正是長期困擾ArcIMS開發(fā)人員的問題以及Server的優(yōu)勢所在。

????? ArcGIS Server的用戶可以有很多種,從最普通的IE瀏覽器(瘦客戶端)到大型的ArcGIS桌面應(yīng)用程序(胖客戶端)。這兩種客戶端都非常強(qiáng)大,能夠完成從數(shù)據(jù)瀏覽到簡單地圖編輯的各類工作。但其中最為強(qiáng)大的仍然是ArcGIS桌面應(yīng)用程序或者使用Engine開發(fā)的胖客戶端。因?yàn)檫@種類型的客戶端不但可以跨越網(wǎng)絡(luò)完成瘦客戶端能完成的所有功能,更進(jìn)一步充分施展了ArcGIS Server的在線編輯功能,使得Server這個(gè)平臺(tái)的功能被利用的更加充分。

????? 那么今天我們就來討論一下,如何使用ArcGIS Engine開發(fā)一個(gè)可以跨越網(wǎng)絡(luò)連接ArcGIS Server,并實(shí)現(xiàn)復(fù)雜在線編輯功能的胖客戶端。

????? Engine客戶端連接Server地圖服務(wù)的實(shí)例

????? 為了讓大家更有信心的開始我們的工作,首先我用Engine為大家開發(fā)一個(gè)具有上述功能的實(shí)例:ESRI中國(北京)培訓(xùn)中心Server胖客戶端。

????? 在右側(cè)的選項(xiàng)卡上大家可以看到我們可以通過兩種方式連接Server所發(fā)布的地圖服務(wù):LAN和Internet。這兩種方式基本上解決了我們?cè)谌粘9ぷ髦兴佑|到的所有網(wǎng)絡(luò)類型。進(jìn)一步我們可以看到:通過指定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)容。?

????? 那么這些看上去不可思議的過程到底是如何實(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ù)中所有的書簽

????? 我們可以看出,這個(gè)Engine應(yīng)用程序之所以可以連接遠(yuǎn)程的Server地圖服務(wù),主要原因由cmdConnect中相應(yīng)調(diào)用的代碼實(shí)現(xiàn)的功能。那么我們不妨來看看這些代碼是如何工作的(代碼的說明添加在代碼的注釋中)。

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

????? 通過一個(gè)IAGSServerConnectionFactory接口的對(duì)象創(chuàng)建AGSServerConnectionFactory的實(shí)例,并通過它連接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),但是在地圖中沒有任何的內(nèi)容顯示出來。這是為什么呢?其實(shí)我們只需要再添加一個(gè)叫做“Draw Map”的功能就可以解決這個(gè)問題。

????? 從本質(zhì)上來講,ArcGIS Server通過互聯(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)容了。

????? 下面我們來看看這段代碼是如何將地圖顯示出來的。

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專門用來存儲(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í)功能

????? 通過剛才的一連串代碼操作,我們已經(jīng)知道了如何使用Engine開發(fā)一個(gè)客戶端并且連接任意位置的Server地圖服務(wù)了。并且通過操作PictureBox,我們成功的讓地圖服務(wù)中的內(nèi)容顯示在了我們的客戶端上。(就像我們常常在瘦客戶端上所完成的功能一樣)。

????? 但這僅僅只是我們工作的一個(gè)開始。因?yàn)镋ngine開發(fā)的客戶端和瘦客戶端最大的區(qū)別在于它底層是基于 ArcObjects搭建的,所以我們的客戶端不僅僅只是能夠?yàn)g覽數(shù)據(jù)還可以進(jìn)一步的處理遠(yuǎn)程客戶端上的Server地圖服務(wù)。就像我們?cè)谏厦嫠吹哪菢?#xff0c;通過連接我們已經(jīng)成功地獲得了Map Server。那么大家只要順著這個(gè)思路進(jìn)一步的開發(fā)下去,就可以獲得我們?cè)谌粘i_發(fā)中更為常用的地圖,圖層以及更多的信息。最終,ArcGIS Server變成了Engine客戶端強(qiáng)大的遠(yuǎn)程服務(wù)器和數(shù)據(jù)庫。大規(guī)模的數(shù)據(jù)雖然存儲(chǔ)在互聯(lián)網(wǎng)的另外一邊,但是在我們的客戶端上仍然可以流暢的進(jìn)行數(shù)據(jù)的分析和編輯等高級(jí)的地理信息操作。

????? 除此之外,ArcGIS Server還賦予了我們更多高級(jí)的開發(fā)方式。包括:

????? * Asp.net的WEB應(yīng)用程序開發(fā)(開發(fā)Server的網(wǎng)站)

????? * 池化和非池化的多種用戶交互模式的開發(fā)(網(wǎng)頁模式的在線編輯)

????? * 拓展ADF的網(wǎng)頁控件開發(fā)(Web應(yīng)用程序的控件開發(fā))

????? * 拓展ADF的網(wǎng)頁模版開發(fā)

????? * ArcGIS Server的Web Servics的開發(fā)等等(Web Servics)

????? 這些高級(jí)的開發(fā)方向不但充分發(fā)揮了ArcGIS Server的功能,更讓您的B/S開發(fā)手段極大的豐富并具有生命力。這些高級(jí)的開發(fā)方式都會(huì)在ESRI中國(北京)培訓(xùn)中心的《ArcGIS Server應(yīng)用程序開發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。