zoukankan      html  css  js  c++  java
  • Echart在Openlayers的应用

    概述

    echart,一个由百度前端发起的canvas国产类库(官网:http://echarts.baidu.com/index.html)。echart其实是在canvas类库zrender的基础上做的主题图库,优点有数据驱动,图例丰富,功能强大,支持数据拖拽重计算,数据区域漫游等功能,不论是从使用便捷程度、美观程度等方面都是不错的选择,在本文讲述如何在Openlayers中结合echart实现地图统计图的展示。


    效果



    实现代码

    1、piechart

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>openlayers map</title>
        <link rel="stylesheet" href="../../../plugin/OpenLayers-2.13.1/theme/default/style.css" type="text/css">
        <style>
            html, body, #map{
                padding:0;
                margin:0;
                height:100%;
                100%;
                overflow: hidden;
            }
            .tool{
                position: absolute;
                top:10pt;
                right: 10pt;
                padding: 5px;
                background: #fff;
                border: 1px solid #ff5500;
                z-index: 1000;
            }
        </style>
        <script src="../../../plugin/OpenLayers-2.13.1/OpenLayers.js"></script>
        <script src="../../../plugin/jquery/jquery-1.8.3.js"></script>
        <script src="../../../plugin/echart/build/dist/echarts.js"></script>
        <script>
            require.config({
                paths: {
                    echarts: '../../../plugin/echart/build/dist'
                }
            });
            var data = [{name:"乌鲁木齐",x:87.5758285931,y:43.7822116460,data:[
                {
                    name: '男',
                    value: 40.0
                },{
                    name: '女',
                    value: 60.0
                }
            ]},
                {name:"拉萨",x:91.1629975040,y:29.7104204643,data:[
                    {
                        name: '男',
                        value: 45.0
                    },{
                        name: '女',
                        value: 55.0
                    }
                ]},
                {name:"北京",x:116.4575803581078,y:40.04054437977018,data:[
                    {
                        name: '男',
                        value: 35.0
                    },{
                        name: '女',
                        value: 65.0
                    }
                ]},
                {name:"兰州",x:103.584297498,y:36.1190864503,data:[
                    {
                        name: '男',
                        value: 44.0
                    },{
                        name: '女',
                        value: 56.0
                    }
                ]}];
            var map;
            var tiled;
            OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
            OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
            $(window).load(function() {
                var format = 'image/png';
                var bounds = new OpenLayers.Bounds(
                        73.45100463562233, 18.16324718764174,
                        134.97679764650596, 53.531943152223576
                );
                var options = {
                    controls: [],
                    maxExtent: bounds,
                    maxResolution: 0.2403351289487642,
                    projection: "EPSG:4326",
                    units: 'degrees'
                };
                map = new OpenLayers.Map('map', options);
                var url = "http://localhost:8088/geoserver/lzugis/wms";
                tiled = new OpenLayers.Layer.WMS(
                        "Geoserver layers - Tiled",
                        url,
                        {
                            "LAYERS": 'lzugis:province',
                            "STYLES": '',
                            format: format
                        },
                        {
                            buffer: 0,
                            displayOutsideMaxExtent: true,
                            isBaseLayer: true,
                            yx : {'EPSG:4326' : true}
                        }
                );
                map.addLayers([tiled]);
                map.addControl(new OpenLayers.Control.Zoom());
                map.addControl(new OpenLayers.Control.Navigation());
                map.zoomToExtent(bounds);
    
                $("#addchart").on("click",function(){
                    addMapChart();
                    map.events.register("zoomend", map, function(){
                        addMapChart();
                    });
                });
            });
    
            function addMapChart(){
                $(".olPopup").remove();
                var zoom = map.getZoom();
                for(var i=0;i<data.length;i++){
                    var d = data[i];
                    var size=30+(zoom-1)*10;
                    var domid = "chart"+i;
                    var content = "<div class='mapChart' id='"+domid+"' ></div>";
                    var popup = new OpenLayers.Popup(domid,
                            new OpenLayers.LonLat(d.x,d.y),
                            new OpenLayers.Size(size,size),
                            content,
                            false);
                    popup.setBackgroundColor("transparent");
                    popup.setBorder("0px #0066ff solid");
                    popup.keepInMap = false;
                    map.addPopup(popup,false);
                    addChart(domid,d);
                }
                var pops = $(map.div).find(".olPopup");
                for(var i=0;i<pops.length;i++){
                    var pop = $(pops[i]);
                    var top = pop.position().top,
                            left = pop.position().left;
                    pop.css("top",(top-size/2)+"px").css("left",(left-size/2)+"px");
                }
            }
            function addChart(domid,data){
                require(
                [
                    'echarts',
                    'echarts/chart/pie'
                ],
                    function (ec) {
                        // 基于准备好的dom,初始化echarts图表
                        var myChart = ec.init(document.getElementById(domid));
                        var option = {
                            // renderAsImage:true,
                            animation:true,
                            tooltip : {
                                trigger: 'item',
                                formatter: "{b}:{c}"
                            },
                            series : [
                                {
                                    type:'pie',
                                    radius : '100%',
                                    center: ['50%', '50%'],
                                    itemStyle:{
                                        normal: {
                                            labelLine:{show: false}
                                        },                        
                                    },
                                    data:data.data,
                                    line:false
                                }
                            ]
                        };
                        // 为echarts对象加载数据
                        myChart.setOption(option);
                    }
                );
            }
        </script>
    </head>
    <body>
    <div id="map">
        <div class="tool">
            <button id="addchart">添加统计图</button>
        </div>
    </div>
    </body>
    </html>

    2、gaugechart

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>openlayers map</title>
        <link rel="stylesheet" href="../../../plugin/OpenLayers-2.13.1/theme/default/style.css" type="text/css">
        <style>
            html, body, #map{
                padding:0;
                margin:0;
                height:100%;
                100%;
                overflow: hidden;
            }
            .tool{
                position: absolute;
                top:10pt;
                right: 10pt;
                padding: 5px;
                background: #fff;
                border: 1px solid #ff5500;
                z-index: 1000;
            }
        </style>
        <script src="../../../plugin/OpenLayers-2.13.1/OpenLayers.js"></script>
        <script src="../../../plugin/jquery/jquery-1.8.3.js"></script>
        <script src="../../../plugin/echart/build/dist/echarts.js"></script>
        <script>
            require.config({
                paths: {
                    echarts: '../../../plugin/echart/build/dist'
                }
            });
            var data = [{name:"乌鲁木齐",x:87.5758285931,y:43.7822116460,value:22},
                {name:"拉萨",x:91.1629975040,y:29.7104204643,value:-10},
                {name:"北京",x:116.4575803581078,y:40.04054437977018,value:32},
                {name:"兰州",x:103.584297498,y:36.1190864503,value:25}];
            var map;
            var tiled;
            OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
            OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
            $(window).load(function() {
                var format = 'image/png';
                var bounds = new OpenLayers.Bounds(
                        73.45100463562233, 18.16324718764174,
                        134.97679764650596, 53.531943152223576
                );
                var options = {
                    controls: [],
                    maxExtent: bounds,
                    maxResolution: 0.2403351289487642,
                    projection: "EPSG:4326",
                    units: 'degrees'
                };
                map = new OpenLayers.Map('map', options);
                var url = "http://localhost:8088/geoserver/lzugis/wms";
                tiled = new OpenLayers.Layer.WMS(
                        "Geoserver layers - Tiled",
                        url,
                        {
                            "LAYERS": 'lzugis:province',
                            "STYLES": '',
                            format: format
                        },
                        {
                            buffer: 0,
                            displayOutsideMaxExtent: true,
                            isBaseLayer: true,
                            yx : {'EPSG:4326' : true}
                        }
                );
                map.addLayers([tiled]);
                map.addControl(new OpenLayers.Control.Zoom());
                map.addControl(new OpenLayers.Control.Navigation());
                map.zoomToExtent(bounds);
    
                $("#addchart").on("click",function(){
                    addMapChart();
                    map.events.register("zoomend", map, function(){
                        addMapChart();
                    });
                });
            });
    
            function addMapChart(){
                $(".olPopup").remove();
                var zoom = map.getZoom();
                for(var i=0;i<data.length;i++){
                    var d = data[i];
                    var size=60+(zoom-1)*10;
                    var domid = "chart"+i;
                    var content = "<div class='mapChart' id='"+domid+"' ></div>";
                    var popup = new OpenLayers.Popup(domid,
                            new OpenLayers.LonLat(d.x,d.y),
                            new OpenLayers.Size(size,size),
                            content,
                            false);
                    popup.setBackgroundColor("transparent");
                    popup.setBorder("0px #0066ff solid");
                    popup.keepInMap = false;
                    map.addPopup(popup,false);
                    addChart(domid,d);
                }
                var pops = $(map.div).find(".olPopup");
                for(var i=0;i<pops.length;i++){
                    var pop = $(pops[i]);
                    var top = pop.position().top,
                            left = pop.position().left;
                    pop.css("top",(top-size/2)+"px").css("left",(left-size/2)+"px");
                }
            }
            function addChart(domid,data){
                require(
                [
                    'echarts',
                    'echarts/chart/gauge'
                ],
                    function (ec) {
                        // 基于准备好的dom,初始化echarts图表
                        var myChart = ec.init(document.getElementById(domid));
                        var option = {
                            tooltip : {
                                formatter: "{c}℃"
                            },
                            series : [
                                {                                
                                    type:'gauge',
                                    radius:'80%',
                                    min:-20,
                                    max:40,
                                    axisLine: {            // 坐标轴线
                                        lineStyle: {       // 属性lineStyle控制线条样式
                                            color: [[0.33, '#48b'],[0.8, '#228b22'],[1, '#ff4500']], 
                                             4
                                        }
                                    },
                                    axisTick: {            // 坐标轴小标记
                                        splitNumber: 2,   // 每份split细分多少段
                                        length :12,        // 属性length控制线长
                                        lineStyle: {       // 属性lineStyle控制线条样式
                                            color: 'auto'
                                        }
                                    },
                                    axisLabel: { 
                                        show:false,
                                        interval:'auto',
                                        textStyle: {
                                            color: 'auto',
                                            fontFamily:'微软雅黑',
                                            fontSize: '10'
                                        }
                                    },
                                    splitLine: {
                                        show: true,
                                        length :16,   
                                        lineStyle: {       // 属性lineStyle控制线条样式
                                            color: 'auto'
                                        }
                                    },
                                    detail : {
                                        formatter:'{value}℃',
                                        textStyle: {       // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                                            color: 'auto',
                                            fontWeight: 'bolder',
                                            fontSize: '15'
                                        }
                                    },
                                    data:[{value: data.value}]
                                }
                            ]
                        };
                        // 为echarts对象加载数据
                        myChart.setOption(option);
                    }
                );
            }
        </script>
    </head>
    <body>
    <div id="map">
        <div class="tool">
            <button id="addchart">添加统计图</button>
        </div>
    </div>
    </body>
    </html>

    传播GIS知识 | 交流GIS经验 | 分享GIS价值 | 专注GIS发展

    技术博客

    http://blog.csdn.net/gisshixisheng

    在线教程

    http://edu.csdn.net/course/detail/799
    Github

    https://github.com/lzugis/

    联系方式

    q       q:1004740957

    e-mail:niujp08@qq.com

    公众号:lzugis15

    Q Q 群:452117357(webgis)
                 337469080(Android)




  • 相关阅读:
    文档管理项目
    根据商品名称、价格区间检索商品的SQL语句
    ASP.NET MVC进阶三
    ASP.NET MVC进阶二
    vscode编写html,常用快捷方式与插件
    bpexpdate – 更改映像目录库中备份的截止日期以及介质目录库中介质的截止日期nbu
    Netbackup用于技术支持的问题报告(报障模版)
    netbackup 8.1安装注意事项
    金融的本质是什么?终于有人讲清楚了!(源于网络)
    nbu集群Alwayson相关问题
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539776.html
Copyright © 2011-2022 走看看