您的位置:首页 > 其它

ArcEngine获取ArcGIS Server上的地图服务

2013-07-07 10:37 288 查看
利用ArcMap我们可以获取Arcgis Server上的地图服务,而ArcMap和ArcEngine都是基于ArcObjects的,基本上ArcMap能实现的功能ArcEngine都可以实现,因此我们也能利用ArcEngine在程序中加载Arcgis Server上的地图服务。

利用ArcEngine获取本地空间数据库内容 ,步骤是设置PropertySet 连接属性,创建工作空间工厂,根据连接信息打开工作空间,更加数据对象名称获取名称对象(IName),从名称对象中获取目标数据。Arcgis Server作为一个异地的数据库,那么获取其地图服务,步骤与上面相似,不过工作空间要改为服务器连接,具体实现过程如下:

1、设置连接属性

  IPropertySet pPropertySet = new PropertySet();

if (pIsLAN)

  pPropertySet.SetProperty("machine", pHostOrUrl);//通过Lan(局域网)连接

  else

    pPropertySet.SetProperty("url", pHostOrUrl);//通过Internet连接

pHostOrUrl表示服务器地址

2、获取服务器连接

  IAGSServerConnectionFactory pFactory = new AGSServerConnectionFactory();

  //创建服务器连接工作空间

  IAGSServerConnection pConnection = pFactory.Open(pPropertySet, 0);//第二个参数帮助文档里是hWnd表示句柄,不知道什么作用,直接赋值0即可

  //打开获取服务器,获取服务器连接

3、获取名称对象

  IAGSEnumServerObjectName pServerObjectNames = pConnection.ServerObjectNames;

  //获取服务器上所有服务的标识属性,即服务标识集合

  pServerObjectNames.Reset();

  //使指针指向服务开头

  IAGSServerObjectName ServerObjectName = pServerObjectNames.Next();

  //获取服务标识

  while (ServerObjectName != null)

  {

    if ((ServerObjectName.Name.ToLower() == pServiceName.ToLower()) &&(ServerObjectName.Type
== "MapServer")) //获取的是地图服务,用MapServer表示

    {//判断获取所需服务

      break;

    }

    ServerObjectName = pServerObjectNames.Next(); //获取的名称对象,IAGSServerObjectName继承了IName

  }

4.获取地图服务

  ILayer lyr = null;

  try

  {

    IName pName = (IName)ServerObjectName;//获得服务对象名称

    IAGSServerObject pServerObject = (IAGSServerObject)pName.Open();//访问地图服务

    IMapServer pMapServer = (IMapServer)pServerObject;

    mapserver = pMapServer;//获取地图服务对象

    IMapServerLayer pMapServerLayer = new MapServerLayer() as IMapServerLayer;

    pMapServerLayer.ServerConnect(pServerObjectName, pMapServer.DefaultMapName);//连接地图服务,第一个参数为地图服务名称,第二个参数为数据框架名称(the
name of a data frame)

    lyr
= pMapServerLayer as ILayer;//将地图服务图层转化为ILayer这样Map控件可以添加进去

  }

  catch (Exception ex)

  {

    MessageBox.Show("服务器配置信息错误,请到“系统管理-系统配置”设置", "连接失败");

  }

完整代码如下

  



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.GISClient;//导入服务器包
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;

namespace MapDocOperate
{
/// <summary>
/// ArcGisServer地图服务的添加
/// </summary>
public class MapServer
{
private IMapServer mapserver;
/// <summary>
/// 地图服务
/// </summary>
public IMapServer MpServer
{
get
{
return this.mapserver;
}

}
/// <summary>
/// 获取ArcGISServer服务图层
/// </summary>
/// <param name="serverUrl"></param>服务器地址
/// <param name="mapservername"></param>地图服务名称
/// <param name="isLan"></param>地图服务是局域网内还是互联网上的
/// <returns></returns>
public ILayer GetServerLyr(String serverUrl, String mapservername, bool isLan)
{
ILayer lyr = null;
//获得服务对象名称
try
{
IAGSServerObjectName pServerObjectName = GetMapServer(serverUrl, mapservername, isLan);//获取地图
IName pName = (IName)pServerObjectName;
//访问地图服务
IAGSServerObject pServerObject = (IAGSServerObject)pName.Open();
IMapServer pMapServer = (IMapServer)pServerObject;
mapserver = pMapServer;//获取地图服务对象
IMapServerLayer pMapServerLayer = new MapServerLayer() as IMapServerLayer;
//连接地图服务

pMapServerLayer.ServerConnect(pServerObjectName, pMapServer.DefaultMapName);
//添加数据图层
lyr = pMapServerLayer as ILayer;
}
catch (Exception ex)
{
MessageBox.Show("服务器配置信息错误,请到“系统管理-系统配置”设置", "连接失败");

}

return lyr;
}

/// <summary>
/// 获取ArcGisServer地图服务标识,连接服务器
/// </summary>
/// <param name="pHostOrUrl"></param>服务器主机URL
/// <param name="pServiceName"></param>服务名称
/// <param name="pIsLAN"></param>主机是否是在局域网或者是互联网
/// <returns></returns>
private IAGSServerObjectName GetMapServer(string pHostOrUrl, string pServiceName, bool pIsLAN)
{

//设置连接属性
IPropertySet pPropertySet = new PropertySet();
if (pIsLAN)
pPropertySet.SetProperty("machine", pHostOrUrl);
else
pPropertySet.SetProperty("url", pHostOrUrl);

//打开连接

IAGSServerConnectionFactory pFactory = new AGSServerConnectionFactory();
//创建服务器连接工作空间

IAGSServerConnection pConnection = pFactory.Open(pPropertySet, 0);
//打开获取服务器

IAGSEnumServerObjectName pServerObjectNames = pConnection.ServerObjectNames;
//获取服务器上所有服务的标识属性,即服务标识集合
pServerObjectNames.Reset();
//使指针指向服务开头
IAGSServerObjectName ServerObjectName = pServerObjectNames.Next();
//获取服务标识
while (ServerObjectName != null)
{
if ((ServerObjectName.Name.ToLower() == pServiceName.ToLower()) &&
(ServerObjectName.Type == "MapServer"))
{//判断获取所需服务
break;
}
ServerObjectName = pServerObjectNames.Next();
}
//返回对象
return ServerObjectName;//返回服务标识
}
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: