轉帖|其它|編輯:郝浩|2010-12-30 14:30:56.000|閱讀 2049 次
概述:由于項目的原因,第一次接觸ArcServer,并需要用ArcServer開發。本文主要介紹如何利用ArcServer實現地圖查詢,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
由于項目的原因,第一次接觸ArcServer,并需要用ArcServer開發。功能如下:客戶填寫一個地塊的編號,需要利用WMS服務返回該地塊的外接矩形的圖片。
我的實現方式是利用中轉的方式,意思是我做一個頁面,放到服務器上,客戶端填寫地塊編號后,直接提交到這個頁面上;在這個頁面上利用ArcServer的API查找對應的地塊,并找出該地塊的外接矩形的坐標,合成一個ArcServer的WMS服務地址,利用重定向轉到這個地址上去。
問題就在于中間這個頁面該如何寫呢?經過不斷摸索,不斷上網找資料,終于實現了該功能。
處理結果大概步驟如下:
首先引入相應的命名空間:
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@fc6vip.cn
文章轉載自:網絡轉載