基于ArcGIS API for JavaScript的统计图表实现

感谢原作者分享:https://github.com/shevchenhe/ChartLayer,在使用的过程中,需要自己进行调试修改,主要还是_draw函数,不同的ArcGIS JS API函数有差异,会出错。

首先是是扩展GraphicLayer

dojo.provide("sggchart.SggChartLayer");
dojo.require("dojox.gfx");
dojo.require("esri.geometry");
dojo.require("dojo.Stateful");

dojo.declare("sggchart.SggChartLayer", esri.layers.GraphicsLayer, {
    divid: null,
    bindGraphicLayer:null,
    constructor:function(params){
        dojo.mixin(this,params);
    },
    setDivId: function(id) {
        this.divid = id;
    },
    _draw: function(graphic, redraw, zoomFlag) {
        var that=this;
        if (!this._map) {
            return;
        }

        if (graphic instanceof sggchart.SggPieChart) {
            //if (!zoomFlag) {
                this._drawChart(graphic, zoomFlag);
           // } else {
            //    dojo.connect(that.bindGraphicLayer,"onUpdateEnd",dojo.hitch(that,that._drawChart,graphic, zoomFlag)
          //  }
        }
    },
    hide: function() {
        var length = this.graphics.length;
        var thisgraphics = this.graphics;
        for (var i = 0; i < length; i++) {
            if (thisgraphics[i].parentDiv) {
                dojo.style(thisgraphics[i].parentDiv, {
                    "display": "none"
                });
            }
        }
    },
    show: function() {
        var length = this.graphics.length;
        var thisgraphics = this.graphics;
        for (var i = 0; i < length; i++) {
            if (thisgraphics[i].parentDiv) {
                dojo.style(thisgraphics[i].parentDiv, {
                    "display": ""
                });
            }
        }
    },
    _onPanStartHandler: function() {
        this.hide();
    },
    _onPanEndHandler: function() {

        this._refresh(false);
        //this._visibilityChangeHandler(this.visible);

        // if (this.graphics.length) {
        //   this.onUpdate();
        // }
    },
    _onZoomStartHandler:function(){
        this.hide();
    },
    _refresh: function(redraw, zoomFlag) {
        var gs = this.graphics,
            il = gs.length,
            i,
            _draw = this._draw;
        if (!redraw) {
            for (i = 0; i < gs.length; i++) {
                _draw(gs[i], redraw, zoomFlag);
                //this.remove(gs[i]);
            }
        } else {
            for (i = 0; i < gs.length; i++) {
                _draw(gs[i], redraw, zoomFlag);
            }
        }
        this.show();
    },
    _onExtentChangeHandler: function(extent, delta, levelChange, lod) {
        if (levelChange) {
            //summary: Redraw graphics on extent change
            // var _mvr = this._map.__visibleRect,
            //     group = this._div;
            // this._init = true;

            this._refresh(true, levelChange);

            // group.setTransform(dojox.gfx.matrix.translate({
            //     x: _mvr.x,
            //     y: _mvr.y
            // }));

            // if (this._renderProto && group.surface.pendingRender) { // canvas
            //     this._dirty = true;
            // } else {
            //     if (this.visible) {
            //         esri.show(group.getEventSource());
            //     }
            // }
        }
    },
    _drawChart: function(piegraphic, zoomFlag) {
        //var bindGraphic = piegraphic.piegraphic.bindGraphic;
        if (!piegraphic.bindGraphic) {
            return;
        }
        if (zoomFlag) {
            dojo.byId(this.divid).removeChild(piegraphic.parentDiv);
            //dojo.connect()
            //this.remove(piegraphic);
        }
        //var graphicDojoShapeStateful=new dojo.Stateful();
        //graphicDojoShapeStateful.watch
        //理论上需要利用多边形的重心的
        if (piegraphic.bindGraphic.visible && piegraphic.bindGraphic._extent && (offsets = this._intersects(this._map, piegraphic.bindGraphic._extent, piegraphic.bindGraphic.geometry._originOnly))) {
            if (piegraphic.bindGraphic._shape) {
                var svgDojoShape = piegraphic.bindGraphic.getDojoShape();
                var svgx = svgDojoShape.bbox.l;
                var svgy = svgDojoShape.bbox.t;
                piegraphic.divWidth = svgDojoShape.bbox.r - svgx;
                piegraphic.divHeight = svgDojoShape.bbox.b - svgy;
                var svgtransform = svgDojoShape.parent.matrix;
                var piedivx = svgx + svgtransform.dx;
                var piedivy = svgy + svgtransform.dy;
                if (!piegraphic.parentDiv||zoomFlag) {
                    var piediv = dojo.doc.createElement("div");
                    dojo.style(piediv, {
                        "left": piedivx + "px",
                        "top": piedivy + "px",
                        "position": "absolute",
                        "width": piegraphic.getDivWidth() + "px",
                        "height": piegraphic.getDivHeight() + "px",
                        "margin": "0px",
                        "padding": "0px",
                        "z-index": "100"
                    });
                    debugger;
                    dojo.byId(this.divid).appendChild(piediv);
                    piegraphic._draw(piediv);
                    piegraphic.parentDiv = piediv;
                } else if (piegraphic.parentDiv) {
                    dojo.style(piegraphic.parentDiv, {
                        "left": piedivx + "px",
                        "top": piedivy + "px",
                        "position": "absolute",
                        "width": piegraphic.getDivWidth() + "px",
                        "height": piegraphic.getDivHeight() + "px",
                        "margin": "0px",
                        "padding": "0px",
                        "z-index": "100"
                    });
                }
            }

            //var mapGraphic= esri.geometry.toMapGeometry(this._map.extent,this._map.width,this._map.height,piegraphic.bindGraphic.geometry.getExtent);
            //} else if (!piegraphic.bindGraphic._shape && piegraphic.parentDiv) {
        } else {
            dojo.byId(this.divid).removeChild(piegraphic.parentDiv);
            piegraphic.parentDiv=null;
            //this.remove(piegraphic);
        }

    }
});

然后扩展Graphic进行图表的绘制,此处使用的是dojo图表,建议使用highCharts

dojo.provide("sggchart.SggChartGraphics");
dojo.require("dojox.charting.Chart");
dojo.require("dojox.charting.plot2d.Pie");
dojo.require("dojox.charting.themes.Claro");
dojo.require("dojox.charting.themes.PlotKit.green");
dojo.require("dojox.charting.themes.Tufte");
dojo.require("dojox.charting.themes.CubanShirts");
dojo.require("dojox.charting.action2d.MoveSlice");
dojo.require("dojox.charting.action2d.Tooltip");
dojo.require("dojox.charting.widget.Legend");
//dojo.require("dojo.Stateful");

dojo.declare("sggchart.SggChartGraphics", esri.Graphic, {
    bindGraphic: null,
    parentDiv: null,
    series: null,
    id: null,
    divHeight: null,
    divWidth: null,
    map: null,
    setId: function(id) {
        this.id = id;
    },
    setSeries: function(series) {
        this.series = series;
    },
    setDivHeight: function(height) {
        this.divHeight = height;
    },
    setDivWidth: function(width) {
        this.divWidth = width;
    },
    getDivHeight: function() {
        return this.divHeight;
    },
    getDivWidth: function() {
        return this.divWidth;
    },
    getSeries: function() {
        return this.series;
    },
    getId: function() {
        return this.id;
    },
    hide: function() {
        if (this.parentDiv) {
            dojo.style(this.parentDiv, "display", "none");
        }
    },
    show: function() {
        if (this.parentDiv) {
            dojo.style(this.parentDiv, "display", "");
        }
    },
    _getMap: function() {
        var gl = this._graphicsLayer;
        return gl._map;
    }
});

dojo.declare("sggchart.SggPieChart", sggchart.SggChartGraphics, {
    watchobject:null,
    constructor: function(graphic) {
        dojo.mixin(this, {
            bindGraphic: graphic
        });
        //var tempwatch=new dojo.Stateful();
        //this.watchobject=tempwatch;
    },

    _draw: function(divContainer) {
        var _chart = new dojox.charting.Chart(divContainer);
        //var r = this.divWidth / 2;
        var r=50;
        var thetheme1=dojox.charting.themes.PlotKit.green;
        thetheme1.chart.fill = "transparent";
        thetheme1.chart.stroke = "transparent";
        thetheme1.plotarea.fill = "transparent";

        _chart.setTheme(thetheme1).
        addPlot("default", {
            type: dojox.charting.plot2d.Pie,
            radius: r
        }).
        addSeries(this.getId(), this.getSeries());
        new dojox.charting.action2d.Tooltip(_chart, "default");
        new dojox.charting.action2d.MoveSlice(_chart, "default");
        _chart.render();
        this.chart = _chart;
    }
});

/*dojo.declare("SggBarChart",SggChartGraphics,{
    _draw:function(divContainer){
        var _chart=new dojox.charting.Chart(divContainer);

    }
})*/

时间: 2024-10-21 21:07:40

基于ArcGIS API for JavaScript的统计图表实现的相关文章

基于ArcGIS API for Javascript的地图编辑工具

转自:http://www.cnblogs.com/znlgis/p/3505646.html 最近工作上需要用ArcGIS API for Javascript来开发一个浏览器上使用的地图编辑工具,分享一下一些相关的开发经验. 我开发的地图编辑工具是根据ESRI提供的例子修改而来的,参考的例子是https://developers.arcgis.com/en/javascript/jssamples/ed_default_editingwidget.html 我们下面只说一些需要注意的问题:

arcgis api for javascript 3.16开发(一)

原来一直都在用Flex开发arcgis的地图接口,用的时间很长,用的习惯也顺手,可Flex这个开发工具已经基本要淘汰了,并且地图借助flash的方式加载在浏览器里已经不能适应webgis的快速开发需求,并且在多种客户端下支持度不是很好,所以转向了html5加arcgis api for javascript的开发,用了一段时间下来,感觉还挺好的,所以分享下经验.开发javasript的唯一不好的地方就是所有对象声明的时候都要看下开发文档,不像flex,AE开发都会有提示.我的开发环境是VS201

ArcGIS API for JavaScript 4.2学习笔记[5] 官方API大章节概述与内容转译

内容如上,截图自ESRI官网,连接:ArcGIS API for JavaScript 4.2 [Get Started] 类似于绪论一样的东西,抽取了最需要关注的几个例子.如:加载Map和View,加载layers,使用弹出窗口,视觉化,与使用窗口小部件.(wtf居然没有分析你想搞事情啊web除了展示难道不应该有()&&*--@) [Mapping and Views] (点击进入我写的章节详细介绍) 最基础的,知道地图和视图的区别,能使用2D和3D地图,对地图的布局有一定的了解,对地图

ArcGIS API for JavaScript 4.2学习笔记[1] 显示地图

ArcGIS API for JavaScript 4.2直接从官网的Sample中学习,API Reference也是从官网翻译理解过来,鉴于网上截稿前还没有人发布过4.2的学习笔记,我就试试吧. 什么是ArcGIS API for JS?这里就不多介绍了,最关键的一点是4.x版本与3.x版本的变化,按官方的意思是重新写了底层. 笔记中规定: ArcGIS API for JavaScript简称AJS 使用CDN(即不配置本地环境)进行测试开发 其余根据需要进行修改.增删. 要将地图显示在h

ArcGIS API for JavaScript(2)-ArcGIS Server发布要素图层服务

1.前言 上一篇该系列的文章我们主要讲了一下基础Web地图搭建,这篇我们主要讲一下ArcGIS Server发布服务,并且如何调用服务.将自己的数据加载到Web地图当中来,实现Web端浏览数据. 2.ArcGIS Server介绍与安装 1.ArcGIS Server 是功能强大的基于服务器的 GIS 产品,用于构建集中管理的.支持多用户的.具备高级GIS功能的企业级GIS应用与服务,如:空间数据管理.二维三维地图可视化.数据编辑.空间分析等即拿即用的应用和类型丰富的服务.ArcGIS Serv

ArcGIS API for JavaScript 与Dojo的关系

API(之后都把ArcGIS API for JavaScript简称为API)构建在Dojo之上,从而充分利用Dojo来屏蔽各种浏览器差异. 那什么是Dojo呢? 伴随着Web2.0.Ajax和RLA的蓬勃发展,各种AJAX开发工具包发展起来,Dojo 正是其中的佼佼者.Dojo 为RIA的开发提供了完整的端到端的解决方案. Dojo主要由3大模块组成,分别是Core.Dijit.DojoX Core提供Ajax.事件.基于CSS的查询.动画及JSON 等的相关操作API. Dijit是一个可

初学ArcGIS API for JavaScript

初学ArcGIS API for JavaScript 对于初学者来说,关于esri提供的一些样式和dojo自带的一些样式还是需要有一定的了解,这块在<WebGIS开发从基础到实践>讲解的特别详细,在这里以笔记的形式来帮助自己加以理解和记忆. esri.css样式主要用于ESRI提供的小部件与组件,比如地图.信息框等.此外,还可以引用Dojo提供的样式表,Dojo提供了4组样式,分别是claro\tundra\soria以及nihilo,每种是一组定义用户界面的字体.颜色与大小等设置.在Arc

我的ArcGIS API for Javascript

为大家贴贴最基本的地图加载: 一. API 根据Dom树上节点的 ID 确定 Map 的显示位置; 二. setBasemap 方法可得到一些ArcGIS制作好的底图,例如: "streets" , "satellite" , "hybrid", "topo", "gray", "oceans", "national-geographic", "osm&qu

ArcGIS API for JavaScript

好几个月没用ArcGIS API for JavaScript,去官网看了一下,最新api已经是4.0了,也开始支持3D了,先运行看看吧. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-