如果使用的资源类型是com.esri.adf.web.ags.data.AGSLocalMapResource,就可以在该资源上动态添加新的图层,图层数据可以来自不同的地方,比如本地的shapefile、file geodatabase或者SDE,也可以来自WMS等web服务。本文以本地的file geodatabase为例,为AGSLocalMapResource动态添加一个新的图层。
首先,要得到地图的IMap接口才能对地图的图层进行操作。
1: // 得到本地MapResource
2: AGSLocalMapResource res = (AGSLocalMapResource)context.getResources().get("agsws1");
3:
4: //得到targetMap
5: MapServer mapServer = res.getLocalMapServer();
6: IMap map = mapServer.getMap(mapServer.getDefaultMapName());
7:
8: //TODO:得到fLayer
9:
10: //添加图层至map
11: map.addLayer(fLayer);
动态添加图层的代码为map.addLayer(fLayer);它接收的参数是实现了ILayer接口的对象。因此,接下来我们需要把file geodatabase里的feature class组装成一个ILayer对象。
1: //Server中的AO对象,必须在一个IServerContext上下文中使用
2: IServerContext sc = res.getServerContext();
3:
4: //得到FeatureWorkspace
5: IWorkspaceFactory wsf = (IWorkspaceFactory) sc.createObject(FileGDBWorkspaceFactory.getClsid());
6: IFeatureWorkspace fws=(IFeatureWorkspace)wsf.openFromFile("E:\\temp\\data\\test.gdb",0);
7:
8: //得到待添加图层
9: IFeatureClass fc=fws.openFeatureClass("world30");
10: IFeatureLayer fLayer=(IFeatureLayer)sc.createObject(FeatureLayer.getClsid());
11: fLayer.setFeatureClassByRef(fc);
1: //给图层设置渲染
2: IMapDocument doc = (IMapDocument)sc.createObject(MapDocument.getClsid());
3: doc.open("E:\\temp\\data\\world30_1.lyr", null);
4: ILayer lyr = doc.getLayer(0, 0);//get the first map's first layer
5: IFeatureRenderer renderer = null;
6: if(lyr instanceof IGeoFeatureLayer){
7: IGeoFeatureLayer geoLyr = (IGeoFeatureLayer)lyr;
8: renderer = geoLyr.getRenderer();
9: }
10: if (renderer != null) {
11: IGeoFeatureLayer geoFeatureLyr = (IGeoFeatureLayer) fLayer;
12: geoFeatureLyr.setRendererByRef(renderer);
13: }
14: fLayer.setVisible(true);
1: //刷新服务器对象
2: mapServer.refreshServerObjects();
3:
4: //从地图资源中得到MapServerPort
5: MapServerPort mapServerPort = res.getMapServer();
6: MapServerInfo serverInfo = mapServerPort.getServerInfo(mapServerPort.getDefaultMapName());
7:
8: //从地图资源中得到AGSMapFunctionality
9: AGSMapFunctionality mapfunction = (AGSMapFunctionality) res.getFunctionalities().get("map");
10: mapfunction.getMapServerInfo().setDefaultMapDescription(serverInfo.getDefaultMapDescription());
11: mapfunction.setMapDescription(serverInfo.getDefaultMapDescription());
12: context.refresh();
把此代码放在一个tool或者command中运行即可。