有的時候,特別是在做分析時,需要經常添加新的圖層到當前的地圖中。在這個時候,我們一般采用非池化的Server Object,以保證當前用戶的修改不會影響到其他用戶。添加圖層的代碼如下:
首選,得到Resource和mapFunctionality和MapServerInfo,以備后面使用:
- AGSLocalMapResource?gisrec=(AGSLocalMapResource)webContext.getResources().get( "ags1" ); ??
- AGSMapFunctionalitymapfunction=(AGSMapFunctionality)gisrec.getFunctionalities().get( "map" ); ??
- MapServerPortmapServer=gisrec.getMapServer(); ??
- MapServerInfoserverInfo=mapServer.getServerInfo(mapServer.getDefaultMapName());??
AGSLocalMapResource gisrec=(AGSLocalMapResource)webContext.getResources().get("ags1"); AGSMapFunctionalitymapfunction=(AGSMapFunctionality)gisrec.getFunctionalities().get("map"); MapServerPortmapServer=gisrec.getMapServer(); MapServerInfoserverInfo=mapServer.getServerInfo(mapServer.getDefaultMapName());
得到MapServer的IMap接口
- IMaptargetMap=gisrec.getLocalMapServer().getMap(gisrec.getLocalMapServer().getDefaultMapName());??
IMaptargetMap=gisrec.getLocalMapServer().getMap(gisrec.getLocalMapServer().getDefaultMapName());
IMap接口可以用來添加數據到ServerObject。下面的代碼可以用來從文件數據庫中讀取數據并把它添加到IMap中:
- IWorkspacewk= this .connectToFileDB( "D:\\data\\sapdata.gdb" ,gisrec.getServerContext()); ??
- IFeatureClassfc= this .getFeatureclass(wk, "MSA_Intersect" ); ??
- FeatureLayerflayer=(FeatureLayer)gisrec.getServerContext().createObject(FeatureLayer.getClsid()); ??
- flayer.setFeatureClassByRef(fc); ??
- targetMap.addLayer(flayer);??
IWorkspacewk=this.connectToFileDB("D:\\data\\sapdata.gdb",gisrec.getServerContext()); IFeatureClassfc=this.getFeatureclass(wk,"MSA_Intersect"); FeatureLayerflayer=(FeatureLayer)gisrec.getServerContext().createObject(FeatureLayer.getClsid()); flayer.setFeatureClassByRef(fc); targetMap.addLayer(flayer);
里面用到的兩個function的代碼如下:
- public ?IWorkspace?connectToFileDB(StringfileGDB,IServerContext?sc)? throws ?java.net.UnknownHostException,java.io.IOException{ ??
- com.esri.arcgis.datasourcesGDB.FileGDBWorkspaceFactoryfactory?=?(FileGDBWorkspaceFactory)sc.createObject(FileGDBWorkspaceFactory.getClsid()); ??
- com.esri.arcgis.geodatabase.IWorkspaceworkspace?=?factory.openFromFile(fileGDB, 0 ); ??
- return ?workspace; ??
- ??
- } ??
- ??
- publicIFeatureClass?getFeatureclass(IWorkspace?workspace,String?fName)?throwsjava.net.UnknownHostException,?java.io.IOException{ ??
- com.esri.arcgis.geodatabase.IEnumDatasetenumDataset?=workspace.getDatasets(com.esri.arcgis.geodatabase.esriDatasetType.esriDTFeatureClass); ??
- com.esri.arcgis.geodatabase.IDatasetds?=? null ; ??
- ds=?enumDataset.next(); ??
- while (ds!=? null ){ ??
- if (ds.getName().endsWith(fName)){ ??
- return ??
- new ?IFeatureClassProxy(ds); ??
- } ??
- ds=?enumDataset.next(); ??
- ??
- } ??
- ??
- retur?nnull; ??
- ??
- }??
public IWorkspace connectToFileDB(StringfileGDB,IServerContext sc) throws java.net.UnknownHostException,java.io.IOException{ com.esri.arcgis.datasourcesGDB.FileGDBWorkspaceFactoryfactory = (FileGDBWorkspaceFactory)sc.createObject(FileGDBWorkspaceFactory.getClsid()); com.esri.arcgis.geodatabase.IWorkspaceworkspace = factory.openFromFile(fileGDB,0); return workspace; } publicIFeatureClass getFeatureclass(IWorkspace workspace,String fName) throwsjava.net.UnknownHostException, java.io.IOException{ com.esri.arcgis.geodatabase.IEnumDatasetenumDataset =workspace.getDatasets(com.esri.arcgis.geodatabase.esriDatasetType.esriDTFeatureClass); com.esri.arcgis.geodatabase.IDatasetds = null; ds= enumDataset.next(); while(ds!= null){ if(ds.getName().endsWith(fName)){ return new IFeatureClassProxy(ds); } ds= enumDataset.next(); } retur nnull; }
添加圖層到ServerObject后,調用下面的代碼,讓修改生效。調用下面的代碼后,將會使ServerObject的狀態發生改變。
gisrec.getLocalMapServer().refreshServerObjects();
Server Object狀態改變后,需要重新得到serverInfo,并且設置MapFunctionality里面的LayerDescription,把新的layer加入進去。這里我們就不手工添加,而是直接把整個MapDescription設置一遍,如下面的代碼所示:
- serverInfo=mapServer.getServerInfo(mapServer.getDefaultMapName()); ??
- mapfunction.getMapServerInfo().setDefaultMapDescription(serverInfo.getDefaultMapDescription()); ??
- mapfunction.setMapDescription(serverInfo.getDefaultMapDescription());??
serverInfo=mapServer.getServerInfo(mapServer.getDefaultMapName()); mapfunction.getMapServerInfo().setDefaultMapDescription(serverInfo.getDefaultMapDescription()); mapfunction.setMapDescription(serverInfo.getDefaultMapDescription());
最后,當然要加上一句refresh context的代碼:
- webContext.refresh();??
webContext.refresh();
把此代碼放在一個tool或者command中運行即可。這應該是最簡潔明了的添加一個圖層的代碼了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
