zoukankan      html  css  js  c++  java
  • 聚类统计图

    概述:

    前天有网友提到了这样的需求:1、地图的统计图展示;2、统计图的聚类。统计图的展示非常好理解,但是什么是统计图的聚类的?所谓统计图的聚类是按照地图等级与数据等级,实现统计图的分级展示。鉴于此,趁着这个霾天,早起来给这位网友解下惑,并在此marker一下,有相同需求的筒子可以看过来^_^


    实现思路:

    1、数据组织

    因为是分级,所以,经过一番思考,觉得数据通过树形的方式来组织是比较方便使用的。

    2、地图展示

    地图展示其实是很简单的,例如在0-1级,展示第一级数据;在2-4级展示第二级数据;5级以上展示第三级数据,等等。这个分级规则可以按照地图的世纪情况来确定。

    备注:参照代码理解。


    实现效果:




    实现代码:

    <!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/highcharts/highcharts.js"></script>
        <script>
            var chartData = [{name:"中国",x:103.584297498,y:36.1190864503,data:[
                    {
                        name: '男',
                        y: 164.0,
                        color:"#5ab1ef"
                    },{
                        name: '女',
                        y: 236.0,
                        color:"#d87a80"
                    }
                ],
                children:[
    	            {name:"乌鲁木齐",x:87.5758285931,y:43.7822116460,data:[
    		            {
    		                name: '男',
    		                y: 40.0,
    		                color:"#5ab1ef"
    		            },{
    		                name: '女',
    		                y: 60.0,
    		                color:"#d87a80"
    		            }
    	        	]},
    	            {name:"拉萨",x:91.1629975040,y:29.7104204643,data:[
    	                {
    	                    name: '男',
    	                    y: 45.0,
    	                    color:"#5ab1ef"
    	                },{
    	                    name: '女',
    	                    y: 55.0,
    	                    color:"#d87a80"
    	                }
    	            ]},
    	            {name:"北京",x:116.4575803581078,y:40.04054437977018,data:[
    	                {
    	                    name: '男',
    	                    y: 35.0,
    	                    color:"#5ab1ef"
    	                },{
    	                    name: '女',
    	                    y: 65.0,
    	                    color:"#d87a80"
    	                }
    	            ]},
    	            {name:"兰州",x:103.584297498,y:36.1190864503,data:[
    	                {
    	                    name: '男',
    	                    y: 44.0,
    	                    color:"#5ab1ef"
    	                },{
    	                    name: '女',
    	                    y: 56.0,
    	                    color:"#d87a80"
    	                }
    	            ]}
                ]
            }];
            var map;
            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 time = new Date();
                time = time.getTime();
                var tiled = new OpenLayers.Layer.WMS(
                        "province", "http://localhost:8088/geoserver/lzugis/wms",
                        {
                            "LAYERS": 'province',
                            "STYLES": '',
                            format: 'image/png'
                        },
                        {
                            buffer: 0,
                            displayOutsideMaxExtent: true,
                            isBaseLayer: true,
                            yx : {'EPSG:4326' : true}
                        }
                );
                map.addLayers([tiled]);
                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();
                var data = zoom>2?chartData[0].children:chartData;
                for(var i=0;i<data.length;i++){
                    var d = data[i];
                    var size=120+zoom*8;                
                    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,size);
                }
                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,size){
                $('#'+domid).highcharts({
                    chart: {
                        backgroundColor: 'rgba(255, 255, 255, 0)',
                        plotBorderColor: null,
                        plotBackgroundColor: null,
                        plotBackgroundImage: null,
                        plotBorderWidth: null,
                        plotShadow: false,
                         size,
                        height: size
                    },
                    tooltip: {
                        pointFormat: '<b>{point.percentage:.1f}%</b>'
                    },
                    credits:{
                        enabled:false
                    },
                    title: {
                        text: ''
                    },
                    plotOptions:{
                        pie: {
                            dataLabels: {
                                enabled: false
                            }
                        }
                    },
                    series: [{
                        type: 'pie',
                        name: data.name,
                        data: data.data
                    }]
                });
            }
        </script>
    </head>
    <body>
    <div id="map">
        <div class="tool">
            <button id="addchart">添加统计图</button>
        </div>
        <div style="display: none;" id="chart">
        </div>
    </div>
    </body>
    </html>

    ---------------------------------------------------------------------------------------------------------------

    技术博客

    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)


  • 相关阅读:
    深度解析正则表达式exec和match两者使用的异同以及要注意的地方
    CSS中有关水平居中和垂直居中的解决办法
    Ubunut16.04 安装 Mahout
    正则表达式常用方法
    python字符串判断
    python list
    python一些包
    数据科学中的R和Python: 30个免费数据资源网站
    simple vimrc for python
    python的一些方法
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539764.html
Copyright © 2011-2022 走看看