zoukankan      html  css  js  c++  java
  • ArcGIS Server Java 动态添加图层

          如果使用的资源类型是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);
    有了IMap和IFeatureLayer对象以后,其实就已经能动态添加图层了。但是这样添加的图层有一点欠缺的地方——它的渲染方式是随机的。就像我们用ArcMap直接打开一个polygon feature class时,ArcMap会随机选择一个填充色。为了保证每次用户添加图层以后能够看到同样的效果,我们需要为动态图层设置一个渲染方式。当然,我们可以在程序中为不同类型的要素分别设置一个Renderer,但是本文将探讨另一种方式。先用ArcMap设置好渲染方式,然后保存成一个*.lyr文件,动态添加图层的时候从lyr文件中读取Renderer信息,然后添加到IFeatureLayer。毕竟,用ArcMap设置Renderer比写代码要简单多了!而且,也更易于分发。
    本篇文章来源于 GIS空间站 转载请以链接形式注明出处 网址:file:///C:/Users/zj/AppData/Local/Temp/WizKnowledge/cac177e8-a225-4054-afd0-5cd59e44aaf5.htm
    有了IMap和IFeatureLayer对象以后,已经可以动态添加图层,但此时其渲染方式是随机的,如果想要实现添加图层时按照一定的渲染方式显示,我们可以在程序中为不同类型的要素分别设置一个Renderer,或者采用另外一种方式:先用ArcMap设置好渲染方式,然后保存成一个*.lyr文件,动态添加图层的时候从lyr文件中读取Renderer信息,然后添加到IFeatureLayer。第二种方法更简单。代码如下:
       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);
         
          至此,我们通过map service提供的AO接口完成了动态添加图层的工作,但是如果这时候我们去刷新浏览器,并不会看到新增加的图层!这是由于Web ADF层还不知道图层信息发生变化了。这与Web ADF的初始化有关,当一个session启动的时候,WebContext会根据map service的信息完成初始化,包括一系列的functionalities以及attributes,这些初始化信息中就包含图层信息(保存在com.esri.arcgisws.MapDescription和com.esri.arcgisws.MapLayerInfo等类中)。在WebContext初始化完成以后,如果map service的信息发生改变,必须由程序员自己去刷新Web ADF中的相关对象,实现Web ADF对象与map service同步。有趣的是,并不是所有对map service的修改都要自己去通知Web ADF,比如修改图层的Renderer信息就不需要。我觉得如果com.esri.arcgisws包中的与AO同名的对象,很可能就需要手工修改,因为这些对象都是初始化的时候创建的;如果没有,说明没有必要为其单独创建Web ADF对象,需要的时候就直接访问AO接口了。
       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();
          Server Object状态改变后,需要重新得到serverInfo,并且设置MapFunctionality里面的LayerDescription,把新的layer加入进去。这里我们就不手工添加,而是直接把整个MapDescription设置一遍,如上代码所示。

          把此代码放在一个tool或者command中运行即可。

    参考:ArcGIS Server如何动态添加图层并进行查询

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

  • 相关阅读:
    docker swarm 集群搭建和臫servoce对服务扩容
    docker 可视化 portainer
    docker Compose
    hadoop2 安装
    y的最大值最小值切割
    滑块图片拼接
    ast 对象还原
    babel/types is判断
    t.isLiteral()
    杂题集合
  • 原文地址:https://www.cnblogs.com/myparamita/p/1650512.html
Copyright © 2011-2022 走看看