Server Java讲座--动态添加图层数据

本文介绍了一种在地图应用中动态添加新图层的方法。通过使用非池化的Server Object,确保用户间的操作互不影响。详细步骤包括获取资源、连接文件数据库、创建特征图层并将其添加到地图中。
部署运行你感兴趣的模型镜像

有的时候,特别是在做分析时,需要经常添加新的图层到当前的地图中。在这个时候,我们一般采用非池化的Server Object,以保证当前用户的修改不会影响到其他用户。添加图层的代码如下:
首选,得到Resource和mapFunctionality和MapServerInfo,以备后面使用:

Java代码 复制代码
  1. AGSLocalMapResource gisrec=(AGSLocalMapResource)webContext.getResources().get( "ags1" );   
  2. AGSMapFunctionalitymapfunction=(AGSMapFunctionality)gisrec.getFunctionalities().get( "map" );   
  3. MapServerPortmapServer=gisrec.getMapServer();   
  4. 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接口

Java代码 复制代码
  1. IMaptargetMap=gisrec.getLocalMapServer().getMap(gisrec.getLocalMapServer().getDefaultMapName());  
IMaptargetMap=gisrec.getLocalMapServer().getMap(gisrec.getLocalMapServer().getDefaultMapName());


IMap接口可以用来添加数据到ServerObject。下面的代码可以用来从文件数据库中读取数据并把它添加到IMap中:

Java代码 复制代码
  1. IWorkspacewk= this .connectToFileDB( "D:\\data\\sapdata.gdb" ,gisrec.getServerContext());   
  2. IFeatureClassfc= this .getFeatureclass(wk, "MSA_Intersect" );   
  3. FeatureLayerflayer=(FeatureLayer)gisrec.getServerContext().createObject(FeatureLayer.getClsid());   
  4. flayer.setFeatureClassByRef(fc);   
  5. 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的代码如下:

Java代码 复制代码
  1. public  IWorkspace connectToFileDB(StringfileGDB,IServerContext sc)  throws  java.net.UnknownHostException,java.io.IOException{   
  2. com.esri.arcgis.datasourcesGDB.FileGDBWorkspaceFactoryfactory = (FileGDBWorkspaceFactory)sc.createObject(FileGDBWorkspaceFactory.getClsid());   
  3. com.esri.arcgis.geodatabase.IWorkspaceworkspace = factory.openFromFile(fileGDB, 0 );   
  4. return  workspace;   
  5.   
  6. }   
  7.   
  8. publicIFeatureClass getFeatureclass(IWorkspace workspace,String fName) throwsjava.net.UnknownHostException, java.io.IOException{   
  9. com.esri.arcgis.geodatabase.IEnumDatasetenumDataset =workspace.getDatasets(com.esri.arcgis.geodatabase.esriDatasetType.esriDTFeatureClass);   
  10. com.esri.arcgis.geodatabase.IDatasetds =  null ;   
  11. ds= enumDataset.next();   
  12. while (ds!=  null ){   
  13. if (ds.getName().endsWith(fName)){   
  14. return   
  15. new  IFeatureClassProxy(ds);   
  16. }   
  17. ds= enumDataset.next();   
  18.   
  19. }   
  20.   
  21. retur nnull;   
  22.   
  23. }  
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设置一遍,如下面的代码所示:

Java代码 复制代码
  1. serverInfo=mapServer.getServerInfo(mapServer.getDefaultMapName());   
  2. mapfunction.getMapServerInfo().setDefaultMapDescription(serverInfo.getDefaultMapDescription());   
  3. mapfunction.setMapDescription(serverInfo.getDefaultMapDescription());  
serverInfo=mapServer.getServerInfo(mapServer.getDefaultMapName());
mapfunction.getMapServerInfo().setDefaultMapDescription(serverInfo.getDefaultMapDescription());
mapfunction.setMapDescription(serverInfo.getDefaultMapDescription());


最后,当然要加上一句refresh context的代码:

Java代码 复制代码
  1. webContext.refresh();  
webContext.refresh();


把此代码放在一个tool或者command中运行即可。这应该是最简洁明了的添加一个图层的代码了。

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值