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

摘要:在ArcGIS 9的家族中,增加了两个新产品:ArcGIS Engine和ArcGIS Server。由于它们各自分别在C/S领域和B/S领域的强大开发能力,一经推出就备受瞩目。其中ArcGIS Server更是由于提供了优越的再开发能力吸引了所有ArcGIS用户的目光。

前言(ArcGIS Engine和Server)

      在ArcGIS 9的家族中,增加了两个新产品:ArcGIS Engine和ArcGIS Server。由于它们各自分别在C/S领域和B/S领域的强大开发能力,一经推出就备受瞩目。其中ArcGIS Server更是由于提供了优越的再开发能力吸引了所有ArcGIS用户的目光。

      那么ArcGIS Server到底是什么呢?ArcGIS Server提供了一套开发集中式的GIS应用程序的平台。这些应用程序可以通过网络提供地理信息的服务。ArcGIS Server是一套后台基于ArcObjects搭建的强大的B/S开发工具。它既可以像ArcIMS那样轻松的提供在线地图发布和在线地图浏览的功能,而且可以像ArcMap那样提供在线的地图分析和地图编辑功能。而后者正是长期困扰ArcIMS开发人员的问题以及Server的优势所在。

      ArcGIS Server的用户可以有很多种,从最普通的IE浏览器(瘦客户端)到大型的ArcGIS桌面应用程序(胖客户端)。这两种客户端都非常强大,能够完成从数据浏览到简单地图编辑的各类工作。但其中最为强大的仍然是ArcGIS桌面应用程序或者使用Engine开发的胖客户端。因为这种类型的客户端不但可以跨越网络完成瘦客户端能完成的所有功能,更进一步充分施展了ArcGIS Server的在线编辑功能,使得Server这个平台的功能被利用的更加充分。

      那么今天我们就来讨论一下,如何使用ArcGIS Engine开发一个可以跨越网络连接ArcGIS Server,并实现复杂在线编辑功能的胖客户端。

      Engine客户端连接Server地图服务的实例

      为了让大家更有信心的开始我们的工作,首先我用Engine为大家开发一个具有上述功能的实例:ESRI中国(北京)培训中心Server胖客户端。

      在右侧的选项卡上大家可以看到我们可以通过两种方式连接Server所发布的地图服务:LAN和Internet。这两种方式基本上解决了我们在日常工作中所接触到的所有网络类型。进一步我们可以看到:通过指定Server服务器所在的地址(比如局域网中的V9或者互联网中的http://202.111.113.201),我们可以连接任意位置的Server服务并显示其中的内容。在Map Server和Data Frame两个ComboBox中,我们已经可以看到Server所发布的服务已经被拆分并且可以选择。最后我们在最下方的地图显示区域中可以清楚地看到 Server服务中所发布的所有内容。 

      那么这些看上去不可思议的过程到底是如何实现的呢?

      首先我们不妨拆分一下这个应用程序。这个应用程序是由下列这些控件所组成的(只列出主要的):

名称 控件类型 实际功能

cmdConnect CommandButton 提供所有的连接代码帮助Engine客户端连接Server

Picture1 PictureBox 显示Server所发布的地图服务中的内容

cboMapServer ComboBox 拆分显示相应地址中所有的Server Objects

cboDataFrame ComboBox 拆分显示每个Server Objects中所有的地图对象

cboBookMark ComboBox 获取Server地图服务中所有的书签

      我们可以看出,这个Engine应用程序之所以可以连接远程的Server地图服务,主要原因由cmdConnect中相应调用的代码实现的功能。那么我们不妨来看看这些代码是如何工作的(代码的说明添加在代码的注释中)。

Private Sub cmdConnect_Click()

Set m_pMapServer = Nothing ‘如果连接时用户正在和另外一个Server地图服务交互,释放这个Server Objects ‘准备连接Server地图服务,首先创建一个PropertySet类型的对象,就好像我们通常连接SDE时常常做的那样

Dim pConnectionProps As IPropertySet

Set pConnectionProps = New PropertySet

If optLAN.Value = True Then ‘如果用户想要连接的是局域网内的Server,获取机器名

      pConnectionProps.SetProperty "machine", txtServer.Text

Else

      pConnectionProps.SetProperty "url", txtServer.Text ‘如果用户想要连接的事互联网上的Server,获取URL地址

End If

      通过一个IAGSServerConnectionFactory接口的对象创建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已经处于可选状态,但是在地图中没有任何的内容显示出来。这是为什么呢?其实我们只需要再添加一个叫做“Draw Map”的功能就可以解决这个问题。

      从本质上来讲,ArcGIS Server通过互联网发布地图服务时本质上是在发送地图服务的当前图片。所以我们只需要准确的获得地图服务此时的图片已经图片的状态信息就可以在PictureBox中相应的显示地图服务中的内容了。

      下面我们来看看这段代码是如何将地图显示出来的。

Private Function drawMap(pMapDescriptoin As IMapDescription, pMapServer As IMapServer)

Dim it As IImageType,idisp As IImageDisplay

Dim pID As IImageDescription ‘首先设定image description为地图服务的图片输出

Set it = New ImageType ‘创建一个新的ImageType并将其设定为JPG

it.Format = esriImageFormat.esriImageJPG

it.ReturnType = esriImageReturnType.esriImageReturnMimeData

Set idisp = New ImageDisplay

idisp.Height = 400

idisp.Width = 500

idisp.DeviceResolution = 150 ‘设定图片的显示大小和设备分辨率

Set pID = New ImageDescription

pID.Display = idisp

pID.Type = it ‘生成一个新的ImageDescription对象并接受之前设 ‘ImageDisplay和ImageType。

      这时我们就有了一个大小为 ‘400*500,设备分辨率为150的JPG文件了

Dim pMI As IImageResult

Set pMI = pMapServer.ExportMapImage(pMapDescriptoin, pID) ‘将pMapServer中的内容倒入到ImageResult中

Dim b() As Byte ‘将Mime的数据类型转换成图片

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设定为IDispatch接口的GUID

With Pic

      .Size = Len(Pic)

      .Type = vbPicTypeBitmap

      .hBmp = hBitmap

      .hPal = 0

End With ‘创建一个Picture structure专门用来存储传入的图片对象对象

Dim result As Long ‘创建一个新的图片对象

result = OleCreatePictureIndirect(Pic, IID_IDispatch, True, pPic)

Set pPersist = pPic pPersist.Load pMemBlb

Picture1.Picture = pPic Picture1.Refresh

End Function

      那么最终在刷新了PictureBox之后我们就可以看到完整的Server地图服务的内容了。

      更多的高级功能

      通过刚才的一连串代码操作,我们已经知道了如何使用Engine开发一个客户端并且连接任意位置的Server地图服务了。并且通过操作PictureBox,我们成功的让地图服务中的内容显示在了我们的客户端上。(就像我们常常在瘦客户端上所完成的功能一样)。

      但这仅仅只是我们工作的一个开始。因为Engine开发的客户端和瘦客户端最大的区别在于它底层是基于 ArcObjects搭建的,所以我们的客户端不仅仅只是能够浏览数据还可以进一步的处理远程客户端上的Server地图服务。就像我们在上面所看的那样,通过连接我们已经成功地获得了Map Server。那么大家只要顺着这个思路进一步的开发下去,就可以获得我们在日常开发中更为常用的地图,图层以及更多的信息。最终,ArcGIS Server变成了Engine客户端强大的远程服务器和数据库。大规模的数据虽然存储在互联网的另外一边,但是在我们的客户端上仍然可以流畅的进行数据的分析和编辑等高级的地理信息操作。

      除此之外,ArcGIS Server还赋予了我们更多高级的开发方式。包括:

      * Asp.net的WEB应用程序开发(开发Server的网站)

      * 池化和非池化的多种用户交互模式的开发(网页模式的在线编辑)

      * 拓展ADF的网页控件开发(Web应用程序的控件开发)

      * 拓展ADF的网页模版开发

      * ArcGIS Server的Web Servics的开发等等(Web Servics)

      这些高级的开发方向不但充分发挥了ArcGIS Server的功能,更让您的B/S开发手段极大的丰富并具有生命力。这些高级的开发方式都会在ESRI中国(北京)培训中心的《ArcGIS Server应用程序开发教程》中。

原文:http://www.gissky.net/Article/107.htm

原文地址:https://www.cnblogs.com/lauer0246/p/1897765.html