轉(zhuǎn)帖|其它|編輯:郝浩|2010-12-30 14:30:56.000|閱讀 2049 次
概述:由于項目的原因,第一次接觸ArcServer,并需要用ArcServer開發(fā)。本文主要介紹如何利用ArcServer實現(xiàn)地圖查詢,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
由于項目的原因,第一次接觸ArcServer,并需要用ArcServer開發(fā)。功能如下:客戶填寫一個地塊的編號,需要利用WMS服務(wù)返回該地塊的外接矩形的圖片。
我的實現(xiàn)方式是利用中轉(zhuǎn)的方式,意思是我做一個頁面,放到服務(wù)器上,客戶端填寫地塊編號后,直接提交到這個頁面上;在這個頁面上利用ArcServer的API查找對應(yīng)的地塊,并找出該地塊的外接矩形的坐標,合成一個ArcServer的WMS服務(wù)地址,利用重定向轉(zhuǎn)到這個地址上去。
問題就在于中間這個頁面該如何寫呢?經(jīng)過不斷摸索,不斷上網(wǎng)找資料,終于實現(xiàn)了該功能。
處理結(jié)果大概步驟如下:
首先引入相應(yīng)的命名空間:
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 = "服務(wù)器的計算機名字";
string agsServerName = "服務(wù)器的IP地址";
2.連接到服務(wù)器
要通過程序來連接到GISServer,主要有兩個對象可以使用:ESRI.ArcGIS.Server.GISServerConnection(實現(xiàn)了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來創(chuàng)建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成員。如果你的網(wǎng)站,在調(diào)試時可以運行,而發(fā)布后“拒絕訪問”,那么首先檢查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.設(shè)置對應(yīng)的地圖名字和服務(wù)類型,獲取上下文(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();
// 得到當前服務(wù)的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"; //對應(yīng)的地圖名
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.設(shè)置查詢用的Filter
ISpatialFilter spatialFilter = (ISpatialFilter)severContext.CreateObject("esriGeoDatabase.SpatialFilter");
string shpFld = loopFeatureClass.ShapeFieldName;
spatialFilter.GeometryField = shpFld;
//指定要使用的空間操作
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
//創(chuàng)建where表達式,這里只要要素
spatialFilter.WhereClause = "圖號='" + no + "'";
IQueryFilter queryFilter=new QueryFilterClass();
queryFilter = (IQueryFilter)spatialFilter;
9.調(diào)用Search查詢
IFeatureCursor featureCursor = loopFeatureClass.Search(queryFilter, false);
//第一個返回的要素
IFeature feature = featureCursor.NextFeature();
10.處理結(jié)果
IGeometry geo = feature.Shape;
string box = geo.Envelope.XMin.ToString() + "," + geo.Envelope.YMin.ToString();
box += "," + geo.Envelope.XMax.ToString() + "," + geo.Envelope.YMax.ToString();
這個Shape是查詢結(jié)果中第一個地物的外接矩形,大家可以根據(jù)自己的業(yè)務(wù)使用。這里我是要使用Shape的左下和右上兩個坐標點,拼接到WMS中去。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載