ArcGIS Server Java -- 动态添加图层_weixin_30376163的博客-程序员秘密

技术标签: 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讲座--动态添加图层数据

转载于:https://www.cnblogs.com/myparamita/archive/2010/01/18/1650512.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30376163/article/details/98622939

智能推荐

Java 程序员 面试前必备知识_xiaofeng66666的博客-程序员秘密

前言正文自我介绍数据结构和算法Java篇Java EE知识点储备计算机网络操作系统数据库相关XML常识性知识总结前言准备了接近两个月的面试笔试,现在终于是可以休息下了。真真是应了那句老话“台上一分钟, 台下十年功。”。人嘛,越努力,才会越幸运。机会总是留给有准备的人的。下面分享一下我的Java实习生准备所看过的材料,(虽然至今还有些依然看不懂地方。) 希望对这方面的同学有点帮助。正文自我介绍先针对...

Axios---axios的用法详解_axios返回值解析成json_Cirrod的博客-程序员秘密

一、axios的基本特性axios (官网: https://qithub.com/axios/axios)是一个基于Promise用于浏览器和node.js的HTTP客户端。它具有以下特征:①支持浏览器和node.js②支持promise③能拦截请求和响应④自动转换JSON数据二、axios的基本用法axios.请求的方式( '请求地址' ).then (res=>{//data属性名称是固定的,用于获取后台响应的数据console.log(res.d...

[Cqoi 2018] bzoj5301 异或序列 [莫队]_5301: [cqoi2018]异或序列_pocket_legend的博客-程序员秘密

Description: 已知一个长度为nnn的整数数列a[1],a[2],…,a[n]a[1],a[2],…,a[n]a[1],a[2],…,a[n],给定查询参数l、rl、rl、r,问在 [l,r][l,r][l,r]区间内,有多少连续子 序列满足异或和等于kkk。 也就是说,对于所有的x,y(l≤x≤y≤r)x,y(l≤x≤y≤r)x,y (l≤x≤y≤r),能够满足a[x]a[x]a...

Xml节点解析 Android,【已解决】Android中用DOM方式解析xml时使用getElementsByTagName去获得节点结果为空..._櫻花朽木的博客-程序员秘密

【问题】折腾:时,试了试下面代码:public static ArrayList getXmlItems(InputStream inputStream, String tag){ArrayList xmlItemList = new ArrayList();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();...

MySQL社区版下载及安装教程_mysql 免費版_KonBAI-Q的博客-程序员秘密

MySQL社区版下载及安装教程1、下载此教程演示为MySQL8社区版压缩包版本的,点击以下链接进入下载页面(需要Oracle账号,没有的可先进行注册)MySQL下载链接完成后,我们就得到一个压缩包,把这个压缩包进行解压(这里我演示是并不是最新版)2、配置环境变量// 变量值为MYSQL根目录变量名:MYSQL_HOME变量值:~\mysql-8.0.xx-winx64 //(这...

随便推点

Math常用方法_网络卷毛的博客-程序员秘密

public class Demo{ public static void main(String args[]){ /** *Math.sqrt()//计算平方根 *Math.cbrt()//计算立方根 *Math.pow(a, b)//计算a的b次方 *Math.max( , );//计算最...

Netty 粘包和拆包详解_架构攻城之路的博客-程序员秘密

1. 前言前面几个章节主要解析了 Netty 的编码、解码问题,那么是否有了编解码器,我们的 Netty 通信就能正常了呢?TCP 协议在传输数据时没有办法判断数据是什么时候结束的,它无法识别一段完整的信息,因此可能会导致接受到的数据和发送时的数据不一致的情况。因此需要人为的指定一种规范的协议,从而保证数据的安全性,比如:我们所熟悉的 HTTP 协议。本节内容,我们主要需要以下两点知识TCP 拆包、粘包的原因; TCP 拆包、粘包的解决方案。2. 学习目的拆包、粘包在 TCP 协

泰勒公式矩阵形式_泰勒公式,雅可比矩阵,海塞矩阵,牛顿法_黑潮制作所的博客-程序员秘密

泰勒公式,雅可比矩阵,海塞矩阵,牛顿法泰勒公式,雅可比矩阵,海塞矩阵,牛顿法泰勒公式是一个在函数上取某点的近似值,如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的近似值。泰勒公式还给出了这个多项式和实际的函数值之间的偏差泰勒公式是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方...

ListView下拉刷新和上拉加载原理_下拉加载逻辑是什么_SunnyRivers的博客-程序员秘密

ListView的下拉刷新逻辑:一、获取ListView的头布局的高度并通过给头布局setPading方法,将头布局隐藏二、重写ListView的onTouchEvent方法计算出滑动的偏移量dy三、通过比较偏移量和头布局的高度,进行UI的修改ListView上拉加载逻辑:一、获取ListView的脚布局的高度并通过setPading方法,将头布局隐藏二、调用ListVie

matlab lsqcurvefit初值,数据拟合与模型选择.ppt_Fay li的博客-程序员秘密

还原为 检验拟合效果:很不理想. x2=1780:2000; y2=exp(b(1)+b(2).*x2); plot(x,y,'+',x2,y2) y3=exp(b(1)+b(2).*x); sum((y-y3).^2) %残差 输出残差平方和(很大): Res1=24917 图2:线性化后拟合效果图 这个初值非常重要,因此前面变换数据以后最小二乘方法得到的估计常常作为现在...

关于IT人的职业生涯的一点感想_Leo笑的博客-程序员秘密

作为一名IT人,边缘化的IT人,合理的战略是,找到一个个人不断升值的位置和空间。        但是具体的技术是不能一直升值的,可以不断升值的方式不断在前沿奋斗,但除非一些特殊的岗位和特殊的人才,否则,不可能永远前进。如何让自己越老越值钱?        许多程序员改行做了产品经理;许多人是赚到了可以保证自己财务自由的第一桶金然后转行;许多是改行开公司,雇佣别人来给自己做产品、做服务。但: