利用ArcServer实现地图查询

首先引入相应的命名空间:

using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.ADF.Connection;
using ESRI.ArcGIS.ADF.Connection.AGS;
using ESRI.ArcGIS.Server;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;

1.指定连接用的用户。

ESRI.ArcGIS.ADF.Identity id = new ESRI.ArcGIS.ADF.Identity();
id.UserName
= "Administrator";
id.Password
= "password";
id.Domain
= "服务器的计算机名字";
string agsServerName = "服务器的IP地址";

 2.连接到服务器。
    要通过程序来连接到GISServer,主要有两个对象可以使用:ESRI.ArcGIS.Server.GISServerConnection(实现了IGISServerConnection2接口)和ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection。前者是com对象,后者是原生的.net对象。
    先来看ESRI.ArcGIS.Server.GISServerConnection。使用方法如下:
  ESRI.ArcGIS.Server.IGISServerConnection2 pGISSC = new ESRI.ArcGIS.Server.GISServerConnectionClass();
  pGISSC.Connect("yourservername");
  ESRI.ArcGIS.Server.IServerObjectAdmin pAdm = pGISSC.ServerObjectAdmin;
注意,要成功获得pGISSC.ServerObjectAdmin属性得有一个前提条件,就是运行当前AGS程序的用户必须是agsadmin组里的成员。那么接下来就可以通过IServerObjectAdmin来对GISServer进行管理了;如果运行当前AGS程序的用户只是agsuser组里的成员,那么你只能获得ServerObjectManager,从而通过IServerObjectManager来创建AO对象,但是不能对GISServer进行管理;如果运行当前AGS程序的用户既不是agsuser成员也不是agsadmin成员,那么在connect的时候就会报错了。可以看出ESRI.ArcGIS.Server.GISServerConnection对象不能显式指定连接GIS Server的用户。
    下面再来看ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection。这是ADF中的.net对象,通常推荐使用这个对象来进行连接工作,因为它可以指定使用特定的账户身份来连接GIS Server,就是下面的Identity:
  ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity("username", "password", "domain");
  ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsconnection = newESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection("yourgisservername",identity);
  agsconnection.Connect();
  ESRI.ArcGIS.Server.IServerObjectAdmin pAdm = agsconnection.ServerObjectAdmin;
同样的,要成功获得pAdm,Identity中指定的用户必须是agsadmin成员。如果你的网站,在调试时可以运行,而发布后“拒绝访问”,那么首先检查web.config的identity,如果使用了以上代码,请确保使用的user在正确的用户组中。

     这里我就采用第一种方法,如下:

AGSServerConnection agsConn = new AGSServerConnection(agsServerName, id);

try
{
agsConn.Connect();

if (!agsConn.IsConnected)
{
agsConn.Dispose();
return "";
}
}
catch (Exception ex)
{
return "";
}

 

3.获取SOM对象。
IServerObjectManager som = agsConn.ServerObjectManager;

4.设置对应的地图名字和服务类型,获取上下文(IServerContext)

   要获取当前的severContext。而获取IServerContext有两种方法:

   1)、通过当前Resorces得到

UIComponent form = facesContext.getViewRoot().findComponent((String)paramMap.get("formId"));
if (form == null)
{
return;
}

MapControl mapControl
= (MapControl)form.findComponent((String)paramMap.get("mapId"));
if (mapControl == null)
{
return;
}

WebMap webMap
= mapControl.getWebMap();
WebContext webContext
= webMap.getWebContext();

// 得到当前服务的IServerContext
AGSLocalMapResource mapResource = (AGSLocalMapResource)webContext.getResources().get("ags1");
MapServer mapServer
= mapResource.getLocalMapServer();

IServerContext serverContext
=mapResource.getServerContext();

    2)、通过IP链接得到(也就是我要用的方法)

IServerObjectManager som = agsConn.ServerObjectManager;
string servertype = "MapServer";
string serverobjectname = "GZ"; //对应的地图名
IServerContext severContext = som.CreateServerContext(serverobjectname, servertype);
IMapServer pMapServer
= severContext.ServerObject as IMapServer;
IMapServerObjects pMapServerObjs
= pMapServer as IMapServerObjects;
IMap pMap
=pMapServerObjs.get_Map(pMapServer.DefaultMapName);

 

5.获取IMapServerObjects
  IMapServer pMapServer = severContext.ServerObject as IMapServer;
  IMapServerObjects pMapServerObjs = pMapServer as IMapServerObjects; 

 

6.通过IMapServerObjects获取IMap对象

      IMap pMap = pMapServerObjs.get_Map(pMapServer.DefaultMapName);

 

7.获取要查询的图层和属性

//得到查询的图层
ILayer workAreaLayer = pMap.get_Layer(7);
IFeatureLayer loopFeatureLayer
= (FeatureLayer)(workAreaLayer);
IFeatureClass loopFeatureClass
=loopFeatureLayer.FeatureClass;

 

8.设置查询用的Filter

ISpatialFilter spatialFilter = (ISpatialFilter)severContext.CreateObject("esriGeoDatabase.SpatialFilter");
string shpFld = loopFeatureClass.ShapeFieldName;
spatialFilter.GeometryField
= shpFld;
//指定要使用的空间操作
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

//创建where表达式,这里只要要素
spatialFilter.WhereClause = "图号='" + no + "'";

IQueryFilter queryFilter
=new QueryFilterClass();
queryFilter
= (IQueryFilter)spatialFilter;

 

9.调用Search查询

  IFeatureCursor featureCursor = loopFeatureClass.Search(queryFilter, false);

  //第一个返回的要素
  IFeature feature = featureCursor.NextFeature();

 

10.处理结果  

IGeometry geo = feature.Shape;

string box = geo.Envelope.XMin.ToString() + "," + geo.Envelope.YMin.ToString();
box
+= "," + geo.Envelope.XMax.ToString() + "," + geo.Envelope.YMax.ToString();

      这个Shape是查询结果中第一个地物的外接矩形,大家可以根据自己的业务使用。这里我是要使用Shape的左下和右上两个坐标点,拼接到WMS中去。

 

 

转载请注明: 天平水的Blog

posted @ 2010-12-29 15:00  天秤水  阅读(5127)  评论(2编辑  收藏  举报