Arcgis for Js之Graphiclayer扩展详解

在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种不同的聚类都是通过扩展esri/layers/GraphicsLayer方法来实现的。在本节,就详细的讲讲esri/layers/GraphicsLayer方法的扩展。

首先,在讲解扩展之前,先看看API中esri/layers/GraphicsLayer的一些参数和方法等。

1、创建一个GraphicLayer

在ESRI官方的API中,创建GraphicLayer有两种方式:

例如:

或者:

在第二种方式的options的参数包括:

2、GraphicLayer的属性

GraphicLayer的属性包括:

其中,有几个比较常见和重要的属性为:

a、graphics:数组,返回的参数是一个数组,为GraphicLayer中包含的Graphic对象。

b、visiable:布尔型,Graphiclayer是否可见。

c、visiableAtMapScale:布尔型,在特定比例尺下的可见性。

3、Graphiclayer的方法

图中,红框标出的是Graphiclayer最常用的方法,详细的介绍很清楚,在此不再做赘述了。

接下来,扩展Graphiclayer。

GraphicLayer藏得很深,位于library\3.9\3.9\js\esri\layers\GraphicsLayer.js,虽然对参数变量代码做了混淆,但是有些东西还是没做变化。在做GraphicLayer扩展时,有几个是比较常用的:

a、_setMap

        // 重构esri/layers/GraphicsLayer方法
        _setMap: function(map, surface) {
            // GraphicsLayer will add its own listener here
            var div = this.inherited(arguments);
            return div;
        }

b、_unsetMap

        _unsetMap: function() {
            this.inherited(arguments);
        }

c、_draw

        _draw:function(graphic, redrawFlag, zoomFlag){
            if (!this._map) {
                return;
            }
        }

此外,还有一些地图控制的,如:_onPanStartHandler,_onZoomStartHandler,_onExtentChangeHandler等。扩展GraphicLayer的大概框架代码如下:

define([
    "dojo/_base/declare",
    "esri/layers/GraphicsLayer"
], function (
    declare,
    GraphicsLayer
    ) {
    return declare([GraphicsLayer], {
        constructor: function(options) {
	    //参数设置
            this._id = options.id || "";
            this._divId = options.chartDiv || "chart";
        },
        // 重构esri/layers/GraphicsLayer方法
        _setMap: function(map, surface) {
            // GraphicsLayer will add its own listener here
            var div = this.inherited(arguments);
            return div;
        },
        _unsetMap: function() {
            this.inherited(arguments);
        },
        //拖拽
        _onPanStartHandler: function() {
            //
        },
        //缩放
        _onZoomStartHandler:function(){
            //
        },
        _onExtentChangeHandler: function(delta, extent, levelChange, lod) {
            //
        },
        _draw:function(graphic){
            if (!this._map) {
                return;
            }
            //
        }
    });
});

例子:添加统计图

统计图通过dojo chart实现,代码如下:

define([
    "dojo/_base/declare",
    "esri/layers/GraphicsLayer",
    "esri/geometry/Point",
    "esri/graphic",
    "dojox/charting/Chart2D",
    "dojox/charting/themes/PlotKit/blue",
    "dojox/charting/action2d/Highlight",
    "dojox/charting/action2d/Tooltip"
], function (
    declare,
    GraphicsLayer,
    Point,
    Graphic,
    Chart2D,
    theme,
    Highlight,
    Tooltip
    ) {
    return declare([GraphicsLayer], {
        constructor: function(options) {
            this._id = options.id || "";
            this._divId = options.chartDiv || "chart";
            this._charttype = options.chartType || "Pie";
            this._chartSize = options.size || 50;
        },
        // 重构esri/layers/GraphicsLayer方法
        _setMap: function(map, surface) {
            // GraphicsLayer will add its own listener here
            var div = this.inherited(arguments);
            return div;
        },
        _unsetMap: function() {
            this.inherited(arguments);
        },
        hide: function() {
            dojo.style(dojo.byId(this._divId),{
                "display": "none"
            });
        },
        show: function() {
            dojo.style(dojo.byId(this._divId),{
                "display": ""
            });
        },
        //拖拽
        _onPanStartHandler: function() {
            this.hide();
        },
        //缩放
        _onZoomStartHandler:function(){
            this.hide();
        },
        _onExtentChangeHandler: function() {
            this._refresh(true);
        },
        _refresh: function(redraw) {
            var that=this;
            var gs = this.graphics,
                _draw = this._draw;

            for (i = 0; i < gs.length; i++) {
                _draw(gs[i], redraw);
            }
            this.show();
        },
        _draw:function(graphic, redraw){
            if (!this._map) {
                return;
            }
            if(graphic instanceof Graphic)//判断graphic是否为MapChartGraphic类型
            {
                this._drawChart(graphic,redraw);
            }
        },
        _drawChart:function(graphic,redraw){
            var showMapPt = graphic.geometry,
                attribute = graphic.attributes;
            var showPt = map.toScreen(showMapPt);
            var id=attribute.code,
                series = [attribute.male, attribute.female];
            if(redraw){
                dojo.byId(this._divId).removeChild(dojo.byId("div"+id));
            }
            if(attribute){
                var _chartDiv = dojo.doc.createElement("div");
                _chartDiv.id ="div"+id;
                dojo.style(_chartDiv, {
                    "left": (showPt.x-this._chartSize/4) + "px",
                    "top": (showPt.y-this._chartSize/2) + "px",
                    "position": "absolute",
                    "width": this._chartSize + "px",
                    "height": this._chartSize + "px"
                });
                dojo.byId(this._divId).appendChild(_chartDiv);

                var _chart = new Chart2D(_chartDiv);
                var _themes = dojox.charting.themes.PlotKit.blue;
                _themes.chart.fill = "transparent";
                _themes.chart.stroke = "transparent";
                _themes.plotarea.fill = "transparent";
                _chart.setTheme(_themes);
                switch(this._charttype){
                    case "Pie":{//饼状图
                        _chart.addPlot("default", {
                            type: this._charttype,
                            labels:false
                        });
                        break;
                    }
                    case "StackedColumns":{//柱状堆积图
                        _chart.addPlot("default", {
                            type: this._charttype,
                            labels:false,
                            markers: true,
                            gap: 2
                        });
                        break;
                    }
                    case "Lines":{//柱状堆积图
                        _chart.addPlot("default", {
                            type: this._charttype,
                            labels:false,
                            markers: true,
                            radius: 1,
                            tension:"X"
                        });
                        break;
                    }
                    default:{//柱状图
                        _chart.addPlot("default", {
                            type: this._charttype,
                            labels:false,
                            gap: 3
                        });
                        chart.addAxis("y", { vertical:true, fixLower: "major", fixUpper: "major" });
                        break;
                    }
                }
                _chart.addSeries(id, series,{stroke: {width:1}});
                //效果
                new Highlight(_chart, "default", {highlight: "lightskyblue"});
                new Tooltip(_chart, "default");
                _chart.render();
            }
        }
    });
});

实现后的效果如下:

如有疑问,请联系:

QQ:1004740957

E-Mail:[email protected]

时间: 2024-10-13 11:42:38

Arcgis for Js之Graphiclayer扩展详解的相关文章

(转)Arcgis for Js之Graphiclayer扩展详解

http://blog.csdn.net/gisshixisheng/article/details/41208185 在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种不同的聚类都是通过扩展esri/layers/GraphicsLayer方法来实现的.在本节,就详细的讲讲esri/layers/GraphicsLayer方法的扩展. 首先,在讲解扩展之前,先看看API中esri/layers/GraphicsLayer的一些参数和方法等. 1.创建一个Graph

Arcgis for JavaSctipt之常用Layer详解

Arcgis forJavaSctipt之常用Layer详解 概述:Arcgis for Javasctipt中常见的layer有动态图层(ArcGISDynamicMapServiceLayer ).切片图层(ArcGISTiledMapServiceLayer).特征图层(FeatureLayer).图象图层(GraphicsLayer).标注图层(LabelLayer).wms图层(WMSLayer)和切片wms图层(WMTSLayer)等几种.本文结合SVG技术,详细介绍Arcgis f

Android:ViewPager扩展详解——带有导航的ViewPagerIndicator(附带图片缓存,异步加载图片)

大家都用过viewpager了, github上有对viewpager进行扩展,导航风格更加丰富,这个开源项目是ViewPagerIndicator,很好用,但是例子比较简单,实际用起来要进行很多扩展,比如在fragment里进行图片缓存和图片异步加载. 下面是ViewPagerIndicator源码运行后的效果,大家也都看过了,我多此一举截几张图: 下载源码请点击这里 ===========================================华丽的分割线==============

js中window对象详解以及页面跳转

js中window对象详解以及页面跳转 转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%90%9C/39219.shtml 1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp" 3. window.top.location.replace("index.asp");

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

使用JS截取字符串函数详解

使用JS截取字符串函数详解 JS截取字符串函数:一.函数:split();二.函数:John();三.函 数:indexOf();四.其他几种方 法:stringObject.substring(start,stop);stringObject.substr(start [, length ])... 一.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); /

Yii2 教程 - yii2-redis 扩展详解

该教程已被合并到<Yii2 权威指南中文版>中!Yiichina 教程地址为<yii2-redis 扩展详解>! 一.简介 yii2-redis 扩展为 Yii2 框架提供了 redis 键值存储支持.包括缓存(Cache).会话存储处理(Session),并实现了 ActiveRecord 模式,允许您将活动记录存储在 redis 中. 相关链接 yii2-redis 扩展网址:https://github.com/yiisoft/yii2-redis 二.安装扩展 在 Yii2

WebGL/Three.js深度学习课程详解

课程介绍:适用于对WebGL.Three.js等3D技术感兴趣,却不知道如何入门的同学, 课程带领大家深入理解WebGL的原理. 课程目录:├─01-基础部分│      01-WebGL与three.js的基础.与opengl的关系.mp4│      02-编写第一个three.js程序.mp4│      03-three.js程序框架,绘制一条直线.mp4│      04-三维世界的组成(点.线).mp4│      05-坐标系的秘密(世界坐标.本地坐标).mp4│      06-

arcgis中的栅格数据的金字塔详解

1 栅格金字塔定义 金字塔可用于改善性能.它们是原始栅格数据集的缩减采样版本,可包含多个缩减采样图层.金字塔的各个连续图层均以 2:1 的比例进行缩减采样.以下是为栅格数据集创建的两级金字塔示例: 图 1?1金字塔示例 金字塔通过仅检索使用指定分辨率(取决于显示要求)的数据,可以加快栅格数据的显示速度.利用金字塔,可在绘制整个数据集时快速显示较低分辨率的数据副本.而随着放大操作的进行,各个更精细的分辨率等级将逐渐得到绘制;但性能将保持不变,因为您在连续绘制更小的各个区域.数据库服务器会根据用户的