Android平板做地图开发时,要求动态获取服务端发布的图层的图例,在网上找到一些相关的代码,虽然能获取到图例,但是获取不全,经过研究和服务端的图例设置的参数的比对,修改出了一版个人觉得比较全面的获取图例的工具类。

不多说,直接上代码。

package com.qianhengnet.util;import android.graphics.Bitmap;
import android.graphics.Color;import com.esri.android.map.Layer;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISFeatureLayer;
import com.esri.core.geometry.Geometry;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.Polygon;
import com.esri.core.geometry.Polyline;
import com.esri.core.map.FeatureTemplate;
import com.esri.core.map.FeatureType;
import com.esri.core.map.Graphic;
import com.esri.core.map.Legend;
import com.esri.core.renderer.ClassBreak;
import com.esri.core.renderer.ClassBreaksRenderer;
import com.esri.core.renderer.Renderer;
import com.esri.core.renderer.UniqueValue;
import com.esri.core.renderer.UniqueValueRenderer;
import com.esri.core.symbol.Symbol;
import com.esri.core.symbol.SymbolHelper;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;/**
 * legend helper
 * Created by yangjinjian on 2017/3/27.
 */

public class LegendUtil {public static int BitmapWidth = 40;//生成的图例的宽度
    public static int BitmapHeight = 40;//生成图例的高度
    public static int BackgroundColor = Color.WHITE;//图例背景颜色

    /**
     * 获取地图图例列表
     *
     * @param mapView
     * @return
     */
    public static ArrayList<Legend> getMapLegend(MapView mapView) {Layer[] layers = mapView.getLayers();ArrayList<ArcGISFeatureLayer> featureLayers = new ArrayList<>();for (int i = 0; i < layers.length; i++) {if (layers[i] instanceof ArcGISFeatureLayer)featureLayers.add((ArcGISFeatureLayer) layers[i]);}return getAllLegend(featureLayers);}/**
     * 获取图例列表
     *
     * @param layers
     * @return
     */
    public static ArrayList<Legend> getAllLegend(ArrayList<ArcGISFeatureLayer> layers) {ArrayList<Legend> list = new ArrayList<>();boolean isCategory = false;boolean isQuality = false;for (Layer l : layers) {isCategory = false;isQuality = false;ArcGISFeatureLayer af = (ArcGISFeatureLayer) l;FeatureType[] types = af.getTypes();ArrayList<Legend> temp = new ArrayList<>();Renderer renderer = af.getRenderer();if (renderer instanceof UniqueValueRenderer) {//如果为Category分类
                //如果有默认值
                if (((UniqueValueRenderer) renderer).getDefaultSymbol() != null) {isCategory = true;}} else if (renderer instanceof ClassBreaksRenderer) {如果为Quality分类
                isQuality = true;}if (isCategory && types.length > 0) {//category分类的话,会有多个type
                FeatureTemplate[] tems = types[0].getTemplates();for (FeatureTemplate tem : tems) {UniqueValueRenderer uvr = (UniqueValueRenderer) renderer;//添加默认图例
                    Bitmap bitmap = getLegendBitmap(uvr.getDefaultSymbol(), createGeometry(tem));Legend legend = new Legend(bitmap, uvr.getDefaultLabel());temp.add(legend);temp.addAll(getUniqueValueLegend(tem, uvr));}} else if (isQuality) {//quality分类的话,没有type
                FeatureTemplate[] templates = af.getTemplates();for (FeatureTemplate template : templates) {ClassBreaksRenderer cbr = (ClassBreaksRenderer) renderer;temp.addAll(getClassBreakLegend(template, cbr));}} else {for (FeatureType type : types) {FeatureTemplate[] tems = type.getTemplates();for (FeatureTemplate tem : tems) {Bitmap bitmap = getTemplateBitmap(af, tem);temp.add(new Legend(bitmap, tem.getName()));}}if (temp.size() == 0) {//FeatureLayer不包含FeatureType
                    FeatureTemplate[] templates = af.getTemplates();for (FeatureTemplate template : templates) {Bitmap bitm = getTemplateBitmap(af, template);Legend le = new Legend(bitm, template.getName());temp.add(le);}}}list.addAll(temp);}if (list.size() <= 1)return list;//去重,可能有多个相同图层的图例
        HashMap<String, Legend> map = new HashMap<>();ArrayList<Legend> temp = new ArrayList<>();for (int i = 0; i < list.size(); i++) {String lable = list.get(i).getLabel();if (map.get(lable) == null) {temp.add(list.get(i));map.put(lable, list.get(i));}}return temp;}/**
     * 生成图例模板
     *
     * @param featureTemplate
     * @return
     */
    public static Geometry createGeometry(FeatureTemplate featureTemplate) {FeatureTemplate.DRAWING_TOOL drawing_tool = featureTemplate
                .getDrawingTool();Geometry geometry = null;//用于判断点线面
        if (drawing_tool == FeatureTemplate.DRAWING_TOOL.POLYGON) {Polygon polygon = new Polygon();polygon.startPath(0, 0);polygon.lineTo(0, BitmapHeight);polygon.lineTo(BitmapWidth, BitmapHeight);polygon.lineTo(BitmapWidth, 0);polygon.lineTo(0, 0);geometry = polygon;} else if (drawing_tool == FeatureTemplate.DRAWING_TOOL.LINE) {Polyline polyline = new Polyline();polyline.startPath(1, 1);polyline.lineTo(39, 39);geometry = polyline;} else if (drawing_tool == FeatureTemplate.DRAWING_TOOL.POINT)geometry = new Point(20, 20);return geometry;}/**
     * 生成图例模板
     *
     * @param drawing_tool
     * @return
     */
    public static Geometry createSelfGeometry(FeatureTemplate.DRAWING_TOOL drawing_tool) {Geometry geometry = null;//用于判断点线面
        if (drawing_tool == FeatureTemplate.DRAWING_TOOL.POLYGON) {Polygon polygon = new Polygon();polygon.startPath(0, 0);polygon.lineTo(0, BitmapHeight);polygon.lineTo(BitmapWidth, BitmapHeight);polygon.lineTo(BitmapWidth, 0);polygon.lineTo(0, 0);geometry = polygon;} else if (drawing_tool == FeatureTemplate.DRAWING_TOOL.LINE) {Polyline polyline = new Polyline();polyline.startPath(1, 1);polyline.lineTo(39, 39);geometry = polyline;} else if (drawing_tool == FeatureTemplate.DRAWING_TOOL.POINT)geometry = new Point(20, 20);return geometry;}/**
     * 默认的获取图例方式
     *
     * @param featurelayer
     * @param featureTemplate
     * @return
     */
    private static Bitmap getTemplateBitmap(ArcGISFeatureLayer featurelayer,FeatureTemplate featureTemplate) {Graphic g = featurelayer.createFeatureWithTemplate(featureTemplate,null);Renderer renderer = featurelayer.getRenderer();return getLegendBitmap(renderer.getSymbol(g), createGeometry(featureTemplate));}/**
     * 图层如果通过category分类并且设有默认值的话,使用该方法来获取图层
     *
     * @param featureTemplate
     * @param renderer
     * @return
     */
    private static ArrayList<Legend> getUniqueValueLegend(FeatureTemplate featureTemplate, UniqueValueRenderer renderer) {List<UniqueValue> values = renderer.getUniqueValueInfos();Geometry geometry = createGeometry(featureTemplate);ArrayList<Legend> tempList = new ArrayList<>();int size = values.size();for (int i = 0; i < size; i++) {Bitmap bitmap = getLegendBitmap(values.get(i).getSymbol(), geometry);tempList.add(new Legend(bitmap, values.get(i).getLabel()));}return tempList;}/**
     * 图层如果通过quality来分层,使用该方法来获取图例
     *
     * @param featureTemplate
     * @param renderer
     * @return
     */
    private static List<Legend> getClassBreakLegend(FeatureTemplate featureTemplate, ClassBreaksRenderer renderer) {TreeMap<Double, ClassBreak> map = renderer.getClassBreakInfos();Geometry geometry = createGeometry(featureTemplate);List<Legend> tempList = new ArrayList<>();Set<Double> keySet = map.keySet();Iterator i = keySet.iterator();while (i.hasNext()) {ClassBreak classBreak = map.get(i.next());Symbol symbol = classBreak.getSymbol();Bitmap bitmap = getLegendBitmap(symbol, geometry);tempList.add(new Legend(bitmap, classBreak.getLabel()));}return tempList;}private static Bitmap getLegendBitmap(Symbol symbol, Geometry geometry) {return SymbolHelper.getLegendImage(symbol, geometry, BitmapWidth,BitmapHeight, BackgroundColor);}public static Legend createLegend(Symbol symbol, String lable) {return new Legend(getLegendBitmap(symbol, createSelfGeometry(FeatureTemplate.DRAWING_TOOL.POLYGON)), lable);}
}

相关解释和注意事项:

1.图例去重依据的是图例的Label,需要服务端注意不要将不同图例的Label设置成一个名称。

2.图例按Quality分类时,之所以要判断有没有DefaultSymbol,是因为在Quality分类时,服务端将所有出现的值都分别设置图例的时候,使用FeatureType是可以获取全部图例的,但是如果只设置了部分值,其余的值使用其他值得话,使用FeatureType是获取不到全部图例的话,这是需要加上DefaultSymbol的图例。

举例说明:图例按Quality分类,有1,2,3,4四个值。

服务端给1,2,3,4分别设置了各自的Symbol,就没有使用DefaultSymbol

ArcGISFeatureLayer af = (ArcGISFeatureLayer) l;

FeatureType[] types = af.getTypes();

获取到的types的types.length的值为4.

如果只给1,2分别设置Symbol,3和4不单独设置的话,3和4就会使用DefaultSymbol,这时获取到的types的types.length的值为2.就需要加上DefaultSymbol了

动态获取Arcgis中的ArcGISFeatureLayer的图例相关推荐

  1. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )

    文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...

  2. Android中动态获取Drawable中的图片

    比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...

  3. java根据不同系统动态获取路径名中斜杠

    项目中上传文件保存的路径,发现在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会报"No such file or diretory" ...

  4. js 动态获取表格中的值并修改其他表格+js 动态拼接字符串

    主要是用 思路是给表格设置id,取 表格tr 的值 $('#'+d+"DataOptions" +" tr").each(function(i){var fie ...

  5. 深入浅出InfoPath——动态获取InfoPath中的命名空间

    问题描述:我们在不同的开发Server和Product环境中部署InfoPath的时候,发现命名空间会随InfoPath的小版本变化而变化. 比如:http://schemas.microsoft.c ...

  6. Android --- 动态获取定位权限时: Fragment 中 onRequestPermissionsResult 方法不执行

    今天我在写百度地图 API 定位功能的时候遇到了这样一个问题,需要在打开 APP 首页的时候动态获取定位权限,然后我的代码是这样写的(在 Fragment 中) @Nullablepublic Vie ...

  7. Java中动态获取项目根目录和tomcat的绝对路径

    序言 在开发过程中经常会用到读写文件,其中就必然涉及路径问题.使用固定的绝对路径当然很方便,但会导致程序的可移植性差,比如在代码中写死了要在E盘建一个文件,而移植后的环境中木有E盘,那就只能改代码:又 ...

  8. 驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...

    思路 进程EPROCESS结构体中含有进程名ImageFileName(需求处ImageFileName在EPROCESS结构体中的相对偏移)-->获得进程EPROCESS-->通过进程句 ...

  9. 【ArcGIS风暴】何为动态投影?这次全面为您揭开ArcGIS中动态投影的神秘面纱!

    本课程配套蓝光视频: [ArcGIS风暴]GIS动态投影问题 GISer们都见过以下警告,该警告的原因是当前加载的数据的坐标系和当前数据框坐标系不一致导致的,核心问题是地理坐标系不一致.如当前数据的坐 ...

最新文章

  1. 高通与苹果宣布“复合”,英特尔黯然退场 | 极客头条
  2. BIOS与CMOS区别
  3. Win32汇编最简ComboBox Demo
  4. 设置同时上内外网+文件共享
  5. SQL 行转列的两种做法
  6. 华为:与全球180万云与计算开发者共成长,共创行业新价值
  7. GPO备份还原复制及导入
  8. c语言学习视频(学c语言看谁的视频)
  9. python下利用百度图像识别接口识别超过十万种物品和场景
  10. SQL Server2017 安装错误:Verify that you have sufficient access to that key
  11. 验证整数和小数的正则表达式
  12. jQuery常用插件
  13. 专访美团外卖曹振团:天下武功唯快不破
  14. excel双击后公式计算机,#电脑上的excel表格里的数字为什么要双击才能展开#excel文本双击后变数字...
  15. 微信群控系统制作系列一——java模拟登录网页版微信
  16. 【JAVA基础】java基础之-泛型详解
  17. js 将小数转为科学记数法
  18. 从虚拟机到容器,详谈各种服务虚拟化技术及其应用场景
  19. 中科院大牛博士是如何进行文献检索和阅读(好习惯受益终生)
  20. QT——移植官方MQTT库

热门文章

  1. 【Tensorflow 2.0 正式版教程】ImageNet(二)模型加载与训练
  2. 报错 fatal: The current branch html has no upstream branch. To push the current branch and set the
  3. JAVA多线程:线程和进程的区别和联系
  4. 《反电信网络诈骗法》实行,Galaxybase图平台成为电信反诈黑科技
  5. 如何使用Autoruns
  6. 山东省滨州市谷歌高清卫星地图下载
  7. Arduino+光敏传感器
  8. 游戏人工智能之状态驱动智能体改进(三)
  9. 使用Aspose.Words在C++中以编程方式将Word格式转换为PDF完整指南
  10. ceres快速教材及学习笔记(四)bundl adjustment,《视觉slam十四讲》第十讲ceres例子