彩票走势图

如何利用ArcServer实现地图查询

转帖|其它|编辑:郝浩|2010-12-30 14:30:56.000|阅读 2027 次

概述:由于项目的原因,第一次接触ArcServer,并需要用ArcServer开发。本文主要介绍如何利用ArcServer实现地图查询,希望对大家有帮助。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  由于项目的原因,第一次接触ArcServer,并需要用ArcServer开发。功能如下:客户填写一个地块的编号,需要利用WMS服务返回该地块的外接矩形的图片。

  我的实现方式是利用中转的方式,意思是我做一个页面,放到服务器上,客户端填写地块编号后,直接提交到这个页面上;在这个页面上利用ArcServer的API查找对应的地块,并找出该地块的外接矩形的坐标,合成一个ArcServer的WMS服务地址,利用重定向转到这个地址上去。

   问题就在于中间这个页面该如何写呢?经过不断摸索,不断上网找资料,终于实现了该功能。

  • .指定连接用的用户
  • 连接到服务器
  • 获取SOM对象
  • 设置对应的地图名字和服务类型,获取上下文(IServerContext)
  • .获取IMapServerObjects
  • 通过IMapServerObjects获取IMap对象
  • 获取要查询的图层和属性
  • 设置查询用的Filter
  • 调用Search查询

处理结果大概步骤如下: 

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

  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得到

 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中去。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP