概述
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%; width: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%; width: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']], width: 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)