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)




  • 相关阅读:
    3.1 创建模型-实体属性
    3. 创建模型
    2.1 DbContext
    2. EF Core 如何显示执行的SQL语句
    1.1 为现有数据库生成实体模型
    1. EF Core 概述
    【2020-08-01】人生十三信条
    【一句日历】2020年8月
    【2020-07-31】一个像我一样精力充沛的孩子
    【2020-07-30】强大内心是自己的义务
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539776.html
Copyright © 2011-2022 走看看