ClassBreaksRenderer和ClassBreak用法

原创 2015年07月07日 10:42:20

背景:新接触ArcGIS。看到以前的工程里用到了ClassBreaksRenderer和ClassBreak,网上查了下,还是没明白具体的用法。只知道大概是根据某个字段,对不同的值使用不同的显示方法。比如,温度的表示,用蓝色过渡到红色表示由低到高的温度。类似的还有海拔,人口密度等等。

然后写了个Demo测试了一下,整理了一下用法。


关系图:


图示说明:

  • Geometry: 点、线和多边形等都是Geometry。这是一个抽象类。
  • Symbol: 点,线等的显示方式。包括颜色,大小,图标等。这是一个接口。
  • Graphic:点、线等要显示在地图上,需要借助Graphic。创建Graphic的时候需要指定要显示的Geometry(Line、Point等)和对应的显示方式Symbol。
  • GraphicLayer: Graphic显示在GraphicLayer上。GraphicLayer可以添加多个Graphic对象。
  • MapView: GraphicLayer显示在MapView上。MapView可以添加多个Layer。调用一个MapView实例的addLayer方法,往MapViews中添加一个名为"graphicLayer"的GraphicLayer。
  • ClassBreaksRenderer: 每个GraphicsLayer都可以指定一个ClassBreaksRenderer。通过调用classBreaksRenderer.setField("index"),来指定根据"index"("index"可以换成任何字符串)的值用不同的显示方式。但它没说每个值的表示方式是什么。
  • ClassBreak:指出每个值的表示方式是什么。通过classBreak.setClassMaxValue(value);来设置"index"的值(这里没有指定字段名称)。通过classBreak.setSymbol(symbol)来指定对应的显示方式。ClassBreaksRenderer可以通过classBreaksRenderer.addClassBreak(classBreak);来添加多个ClassBreak。这样就有不同的值和对应的显示方式。
  • Attributs: 一个Map<String, Object>。ClassBreaksRenderer和ClassBreak指出了每个值对应的显示方式,但每个Graphic的这个字段的值怎么指定呢?这就用到这个Map了。创建Graphic的时候,有些构造器需要个一个Map,就是在这个Map中指定的。通过传入一个包含"index"的Map进来就好。如,
    Map<String, Object> attr = new HashMap<String, Object>();
    attr.put("index", 5);
    Graphic graphic = new Graphic(point, null, attr, 0); //第二个参数Symbol一定要为null,不然ClassBreak指定的显示方式不管用。

             应该说是这个属性Map把ClassBreaksRenderer和Graphic联系了起来,使得ClassBreak对Graphic生效。


代码:

代码主要集中在一个LayerUtil类中。

用法:

1. 在MapView中添加一个GraphicLayer。

2. 点击MapView的时候,在对应的监听器里调用markPoint来画点。

package com.chanryma.demo.common;

import java.util.HashMap;
import java.util.Map;

import android.graphics.Color;
import android.util.Log;

import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.Layer;
import com.esri.android.map.MapView;
import com.esri.core.geometry.Point;
import com.esri.core.map.Graphic;
import com.esri.core.renderer.ClassBreak;
import com.esri.core.renderer.ClassBreaksRenderer;
import com.esri.core.symbol.SimpleMarkerSymbol;

public class LayerUtil {
    private static ClassBreaksRenderer classBreaksRenderer;
    private static final int[] COLORS = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DKGRAY, Color.GRAY, Color.GREEN, Color.LTGRAY };

    static {
        initClassBreaksRenderer();
    }

    /**
     *  在GraphicLayer上画点
     */
    public static void markPoint(GraphicsLayer layer, Point point, int index) {
        index %= COLORS.length;

        Map<String, Object> attr = new HashMap<String, Object>();
        attr.put("index", index);
        Graphic graphic = new Graphic(point, null, attr, 0);
        layer.addGraphic(graphic);
    }

    /**
     *  在MapView中添加一个GraphicLayer
     */
    public static void addGraphicsLayer(MapView mapView, String layerName) {
        GraphicsLayer graphicsLayer = new GraphicsLayer();
        graphicsLayer.setName(layerName);
        graphicsLayer.setRenderer(classBreaksRenderer);
        mapView.addLayer(graphicsLayer);
    }

    /**
     *  根据名称取得GraphicLayer
     */
    public static GraphicsLayer getGraphicsLayer(MapView mapView, String layerName) {
        for (Layer layer : mapView.getLayers()) {
            if (layer instanceof GraphicsLayer) {
                if (layer.getName().equals(layerName)) {
                    return (GraphicsLayer) layer;
                }
            }
        }

        return null;
    }

    /**
     *  初始化ClassBreaksRenderer
     */
    private static void initClassBreaksRenderer() {
        if (classBreaksRenderer == null) {
            classBreaksRenderer = new ClassBreaksRenderer();
            classBreaksRenderer.setField("index");
            Log.v("LayerUtil", "getMinValue() = " + classBreaksRenderer.getMinValue());
            for (int i = 0; i < COLORS.length; i++) {
                ClassBreak classBreak = new ClassBreak();
                classBreak.setClassMaxValue(i);
                classBreak.setLabel("" + i);
                classBreak.setSymbol(new SimpleMarkerSymbol(COLORS[i], 8, SimpleMarkerSymbol.STYLE.SQUARE));
                classBreaksRenderer.addClassBreak(classBreak);
            }
        }
    }
}


版权声明:转载请注明出处http://blog.csdn.net/chanryma

IClassBreaksRenderer接口渲染图层(分color和size两种) 实现ArcMap中的Graduated Symbols功能

///         /// 生成大小分级点符号图         ///         /// 输入图层         /// 点符号大小字段         /// 点符号分级...
  • gaoyuchuan_IT
  • gaoyuchuan_IT
  • 2011年09月21日 10:18
  • 2795

arcgis server10.1 新功能动态图层渲染

研究了一个arcgisserver10.1动态图层渲染的问题。     环境:       服务器: window server 2008 64位        安装arcgis:    arc...
  • cd11907
  • cd11907
  • 2013年07月30日 12:06
  • 1625

ClassBreaksRenderer和ClassBreak用法

新接触ArcGIS。看到以前的工程里用到了ClassBreaksRenderer和ClassBreak,网上查了下,还是没明白具体的用法。只知道大概是根据某个字段,对不同的值使用不同的表示方法。比如,...
  • chanryma
  • chanryma
  • 2015年07月07日 10:42
  • 1680

AE下的IClassBreaksRenderer应用

  • 2018年01月11日 16:45
  • 5KB
  • 下载

ArcEngine c#开发 专题图制作 (零碎)

先写一个RGB颜色构造器。 private IRgbColor GetRGBColor(int pRed, int pGreen, int pBlue) { ...
  • NICHUNQUAN
  • NICHUNQUAN
  • 2013年06月18日 13:07
  • 1244

英语中of和for用法有什么区别?

for 表原因、目的 of 表从属关系介词of的用法(1)所有关系this is a picture of a classroom(2)部分关系a piece of papera cup of te...
  • liuhhaiffeng
  • liuhhaiffeng
  • 2016年09月10日 13:00
  • 851

ArcGIS API For Javascript之颜色分类实现

在博文(http://blog.csdn.net/lovecarpenter/article/details/52672046)的基础上,利用该文章中的客户端渲染唯一值实现了功能。但是做了修改,我渲染...
  • sophiasy
  • sophiasy
  • 2016年12月13日 17:10
  • 2971

ClassBreaksRenderer和ClassBreak用法

 背景:新接触ArcGIS。看到以前的工程里用到了ClassBreaksRenderer和ClassBreak,网上查了下,还是没明白具体的用法。只知道大概是根据某个字段,对不同的值使用不同的显...
  • lizhijian2010
  • lizhijian2010
  • 2015年08月30日 01:06
  • 423

mybatis #与$的区别与用法

随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis 我在开发过程中,我主要是喜欢mybatis可以让开发者灵活的编写sql语句。其中动态变量算是用的最多的了。 ...
  • p2510899959
  • p2510899959
  • 2017年03月06日 11:24
  • 437

mybatis中#{}和${}的区别于用法

区别: #{},用于传递参数,相当于一个占位符,可以防止sql注入,安全; ${},用于sql的拼接,常用语group by,order by等不能使用占位符的语句中; 用法: #{} ...
  • ITlyng
  • ITlyng
  • 2017年02月19日 13:03
  • 1405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ClassBreaksRenderer和ClassBreak用法
举报原因:
原因补充:

(最多只允许输入30个字)