京津冀空气质量

描述:当前是关于Echarts图表中的 柱状图 示例。
 
            function getColor(type) {
    var color;
    if (isNaN(type)) {
        switch (type) {
            case '暂无数据':
                color = 'gray';
                break;
            case '优':
                color = '#43ce17';
                break;
            case '良':
                color = '#efdc31';
                break;
            case '轻度污染':
                color = '#fa0';
                break;
            case '中度污染':
                color = '#ff401a';
                break;
            case '重度污染':
                color = '#d20040';
                break;
            case '严重污染':
                color = '#9c0a4e';
                break;
            case 'AQI':
                color = 'hsl(40,100%,50%)';
                break;
            case '臭氧':
                color = 'hsl(80,100%,50%)';
                break;
            case '二氧化硫':
                color = 'hsl(120,100%,50%)';
                break;
            case 'NO2':
                color = 'hsl(160,100%,50%)';
                break;
            case '一氧化碳':
                color = 'hsl(200,100%,50%)';
                break;
            case '细颗粒物':
                color = 'hsl(240,100%,50%)';
                break;
            case '可吸入颗粒物':
                color = 'hsl(280,100%,50%)';
                break;
            default:
                break;
        }
    } else {
        function getAQITYPE(aqi) {
            if (aqi <= 50) {
                return '优';
            } else if (aqi <= 100) {
                return '良';
            } else if (aqi <= 150) {
                return '轻度污染';
            } else if (aqi <= 200) {
                return '中度污染';
            } else if (aqi <= 300) {
                return '重度污染';
            } else {
                return '严重污染';
            }
        }
        color = getColor(getAQITYPE(type));
    }
    return color;
}

let backgroundColor, //'#1f1a1a',
    textColor = 'gray',
    fontFamily = '仿宋',
    $body = $(myChart.getDom());
$body.css({
    'font-family': fontFamily
})
option = {
    title: {
        subtext: '数据来源:中国环境监测总站',
        sublink: 'http://123.127.175.45:8082/',
        left: 10,
        bottom: '400',
        textStyle: {
            color: textColor,
        }
    },
    grid: {
        show: false,
        containLabel: true,
        zlevel: '2',
        left: '10',
        bottom: '180',
        width: '30%',
        height: '30%',
        borderWidth: 0
    },
    xAxis: {
        type: 'value',
        splitLine: {
            show: false
        },
        show: false
    },
    bmap: {
        roam: true,
        center: [116.39825, 40.045975]
    },
    visualMap: [{
        seriesIndex: 0,
        backgroundColor: 'whitesmoke',
        bottom: 2,
        left: 2,
        borderRadius: 0,
        itemWidth: 38,
        itemGap: 4,
        padding: 5,
        inverse: true,
        pieces: [{
                value: 'NaN',
                label: '暂无',
                color: getColor('暂无'),
            }, {
                min: 0,
                max: 50,
                label: '优',
                color: getColor('优')
            },
            {
                min: 51,
                max: 100,
                label: '良',
                color: getColor('良')
            }, {
                min: 101,
                max: 150,
                label: '轻度',
                color: getColor('轻度污染')
            }, {
                min: 151,
                max: 200,
                label: '中度',
                color: getColor('中度污染')
            }, {
                min: 201,
                max: 300,
                label: '重度',
                color: getColor('重度污染')
            }, {
                min: 301,
                label: '严重',
                color: getColor('严重污染')
            },

        ],
        textStyle: {
            color: 'black'
        }
    }],
    tooltip: {
        trigger: 'item',
        confine: true,
        enterable: true,
        textStyle: {
            fontFamily: fontFamily
        }
    },
    series: [{
        type: 'effectScatter',
        coordinateSystem: 'bmap',
        symbol: 'rect',
        symbolSize: function(a, p) {
            var size = [12 * (p.name.length), 25];
            return size;
        },
        showEffectOn: 'render',
        rippleEffect: {
            brushType: 'stroke'
        },
        tooltip: {
            formatter: function(params) {
                const data = params.data.data;
                var $ul = $('<ul><li><b>' + params.name + '</b></li></ul>');
                $ul.css({
                    'font-size': 'small',
                    'border-radius': '5px',
                    'list-style': 'none',
                    padding: '10px',
                    'box-shadow': '0 1px 4px #ddd',
                    //'background-color': 'rgba(0,0,0,.21)',
                    color: params.color
                });
                $ul.children().first().css({
                    'font-size': 'large',
                    'border-bottom': '1px double',
                });
                
                let option = {
                    title: {
                        text: data.name
                    },
                    grid: {
                        show: true
                    },
                    yAxis: {
                        type: 'category',
                        axisLabel: {
                            rotate: -45,
                            textStyle: {
                                color: 'white'
                            },
                            show: false,
                        },
                        data: [],
                        show: false,
                        name: data.name,
                        nameLocation: 'end',
                        nameTextStyle: {
                            color: 'white'
                        },
                    },
                    series: [{}, {
                        zlevel: '2',
                        type: 'bar',
                        gridIndex: 0,
                        label: {
                            normal: {
                                show: true,
                                position: 'insideLeft',
                                formatter: '{b}:{c}',
                                fontFamily: fontFamily,
                                fontWeight: 'bold'
                            }
                        },
                        data: []
                    }]
                };

                $ul.children().first().find('b').css({
                    'color': 'whitesmoke',
                    'text-shadow': '0 1px 2px black'
                })
                if (data.aqi) {
                    $ul.children().first().append('<b style="font-size: xx-large;float: right;">' + data.aqi + '</b>');
                    option.yAxis.data.push('AQI');
                    option.series[1].data.push({
                        value: data.aqi,
                        itemStyle: {
                            color: getColor(data.aqi)
                        }
                    });
                }
                if (data.pm2_5) {
                    $('<li><b>细颗粒物:</b>' + data.pm2_5 + '<span>μg/m<sup>3</sup></span></li>').appendTo($ul);
                    option.yAxis.data.push('细颗粒物');
                    option.series[1].data.push({
                        value: data.pm2_5,
                        itemStyle: {
                            color: getColor('细颗粒物')
                        }
                    });
                }
                if (data.pm10) {
                    $('<li><b>可吸入颗粒物:</b>' + data.pm10 + '<span>μg/m<sup>3</sup></span></li>').appendTo($ul);
                    option.yAxis.data.push('可吸入颗粒物');
                    option.series[1].data.push({
                        value: data.pm10,
                        itemStyle: {
                            color: getColor('可吸入颗粒物')
                        }
                    });

                }
                if (data.o3) {
                    $('<li><b>臭氧:</b>' + data.o3 + '<span>μg/m<sup>3</sup></span></li>').appendTo($ul);

                    option.yAxis.data.push('臭氧');
                    option.series[1].data.push({
                        value: data.o3,
                        itemStyle: {
                            color: getColor('臭氧')
                        }
                    });
                }
                if (data.co) {
                    $('<li><b>一氧化碳:</b>' + data.co + '<span>mg/m<sup>3</sup></span></li>').appendTo($ul);
                    option.yAxis.data.push('一氧化碳');
                    option.series[1].data.push({
                        value: data.co,
                        itemStyle: {
                            color: getColor('一氧化碳')
                        }
                    });
                }
                if (data.so2) {
                    $('<li><b>二氧化硫:</b>' + data.so2 + '<span>μg/m<sup>3</sup></span></li>').appendTo($ul);
                    option.yAxis.data.push('二氧化硫');
                    option.series[1].data.push({
                        value: data.so2,
                        itemStyle: {
                            color: getColor('二氧化硫')
                        }
                    });
                }
                /*if (data.pubtime) {
                    $('<li><b>监测时间:</b>' + new Date(data.pubtime).toLocaleString() + '</li>').appendTo($ul);
                }*/
                $ul.children('li').find('span').css('font-size', 'xx-small');
                myChart.setOption(option);
                return $ul.prop('outerHTML');
            }
        },
        hoverAnimation: true,
        label: {
            normal: {
                formatter: '{b}',
                //position: 'right',
                show: true,
                borderColor: '#ddd',
                borderWidth: 1,
                fontFamily: fontFamily,
                fontWeight: 'bold',
                fontSize: 13,
                color: 'whitesmoke',
                padding: 4
            }
        },
        itemStyle: {
            normal: {
                shadowBlur: 10,
                shadowColor: '#333'
            }
        }
    }]


}

setTimeout(function() {
    const data = [{
        "name": "张家口市",
        "o3": 61,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "40.812435",
        "pm2_5": 10,
        "so2": 6,
        "aqi": 23,
        "pm10": 23,
        "city_code": "131200",
        "co": 0.2,
        "longitude": "114.89305"
    }, {
        "name": "秦皇岛市",
        "o3": 55,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "39.9366",
        "pm2_5": 15,
        "so2": 10,
        "aqi": 28,
        "pm10": 28,
        "city_code": "130300",
        "co": 0.8,
        "longitude": "119.60482"
    }, {
        "name": "承德市",
        "o3": 58,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "40.96416",
        "pm2_5": 7,
        "so2": 6,
        "aqi": 31,
        "pm10": 31,
        "city_code": "130800",
        "co": 0.3,
        "longitude": "117.92774"
    }, {
        "name": "北京市",
        "o3": 53,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "40.045975",
        "pm2_5": 9,
        "so2": 3,
        "aqi": 32,
        "pm10": 32,
        "city_code": "110000",
        "co": 0.3,
        "longitude": "116.39825"
    }, {
        "name": "石家庄市",
        "o3": 57,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "38.03179861125",
        "pm2_5": 15,
        "so2": 12,
        "aqi": 34,
        "pm10": 34,
        "city_code": "130100",
        "co": 0.7,
        "longitude": "114.4970652875"
    }, {
        "name": "唐山市",
        "o3": 55,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "39.6449533333333",
        "pm2_5": 19,
        "so2": 8,
        "aqi": 36,
        "pm10": 36,
        "city_code": "130200",
        "co": 0.6,
        "longitude": "118.182916666667"
    }, {
        "name": "廊坊市",
        "o3": 58,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "39.54584",
        "pm2_5": 12,
        "so2": 4,
        "aqi": 40,
        "pm10": 40,
        "city_code": "131000",
        "co": 0.5,
        "longitude": "116.72406"
    }, {
        "name": "沧州市",
        "o3": 65,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "38.3157666666667",
        "pm2_5": 16,
        "so2": 12,
        "aqi": 45,
        "pm10": 45,
        "city_code": "130900",
        "co": 0.5,
        "longitude": "116.871566666667"
    }, {
        "name": "天津市",
        "o3": 51,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "39.0985566666667",
        "pm2_5": 8,
        "so2": 6,
        "aqi": 51,
        "pm10": 52,
        "city_code": "120000",
        "co": 0.4,
        "longitude": "117.319033333333"
    }, {
        "name": "保定市",
        "o3": 54,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "38.8762666666667",
        "pm2_5": 24,
        "so2": 18,
        "aqi": 52,
        "pm10": 53,
        "city_code": "130600",
        "co": 0.6,
        "longitude": "115.4852"
    }, {
        "name": "衡水市",
        "o3": 55,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "37.74335",
        "pm2_5": 28,
        "so2": 12,
        "aqi": 54,
        "pm10": 57,
        "city_code": "131100",
        "co": 0.6,
        "longitude": "115.6743"
    }, {
        "name": "邢台市",
        "o3": 52,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "37.0771",
        "pm2_5": 31,
        "so2": 14,
        "aqi": 54,
        "pm10": 58,
        "city_code": "130500",
        "co": 0.5,
        "longitude": "114.506675"
    }, {
        "name": "邯郸市",
        "o3": 49,
        "pubtime": "2018-12-28 14:00:00",
        "latitude": "36.60786",
        "pm2_5": 32,
        "so2": 18,
        "aqi": 64,
        "pm10": 77,
        "city_code": "130400",
        "co": 0.8,
        "longitude": "114.513875"
    }].sort(function(a,b){
        return a.aqi>b.aqi;
    });
    const $tbody = $('<table></table>');
    $tbody.css({
        position: 'fixed',
        right: '12px',
        bottom: '21px',
        'z-index': 9,
        'box-shadow': '0 1px 4px #ddd',
    });
    $tbody.appendTo($body);
    
     myChart.setOption({
        series: [{
            data: data.filter(function(item) {
                return item.latitude && item.longitude;
            }).map(function(item, index) {
                item.value = [item.longitude, item.latitude].concat(item.aqi);
                var $tr = $('<tr><td>' + (index + 1) + '</td><td>' + item.name + '</td><td>' + (item.aqi ? item.aqi : '--') + '</td></tr>');
                $tr.appendTo($tbody);

                $tr.children().not(':eq(1)').css({
                    'text-align': 'center'
                });
                $tr.children().css({
                    'border-bottom': '1px dotted'
                });
                $tr.children().last().css('background-color', getColor(item.aqi));
                return {
                    name: item.name,
                    value: item.value,
                    data: item
                };
            })
        }]
    })

    var bmap = myChart.getModel().getComponent('bmap').getBMap();
    bmap.setMinZoom(7);
    bmap.setMaxZoom(10);
    bmap.addControl(new BMap.NavigationControl());
    const $mapStyle = $('<select></select');
    $mapStyle.css({
        position: 'fixed',
        right: '.521%',
        top: '.521%'
    });
    $mapStyle.appendTo($body);
    $mapStyle.append('<option value="normal"></option>');
    $mapStyle.append('<option value="dark">极夜黑</option>');
    $mapStyle.change(function() {
        let style = $(this).val();
        console.log(style)
        switch (style) {
            case 'normal':
            case 'dark':
            case 'light':
                bmap.setMapStyle({
                    style: style
                });
                break;
            default:
                json = $(this).find('option:selected').data('json');
                json.push({
                    "featureType": "road",
                    "elementType": "all",
                    "stylers": {
                        "visibility": "off"
                    }
                });
                bmap.setMapStyle({
                    styleJson: json
                });
        }

        function resetColor(backgroundColor, textColor) {
            myChart.setOption({
                title: {
                    textStyle: {
                        color: textColor,
                    }
                },
                grid: {
                    backgroundColor: backgroundColor
                },
                tooltip: {
                    backgroundColor: backgroundColor
                },
                series: [{
                    label: {
                        backgroundColor: backgroundColor,
                        color: textColor
                    }
                }]
            });
            $body.css({
                'background-color': backgroundColor,
                'color': textColor
            });
            $tbody.css({
                'background-color': backgroundColor
            })
        }
        switch (style) {
            case '一蓑烟雨':
                resetColor('rgba(237, 243, 243,.88)', 'gray');
                break;
            case 'dark':
                resetColor('rgba(33, 33, 33,.88)', 'white');
                break;
            case '绿野仙踪':
                resetColor('rgba(31, 60, 69,.88)', 'whitesmoke');
                break;
            case '青花瓷':
                resetColor('rgba(241, 241, 241,.88)', 'rgb(27, 129, 197)');
                break;
            default:
                resetColor(backgroundColor, textColor);
        }
    });
    const bmapStyleURL = "/asset/get/s/data-1572317283167-8bAaywO7.json";
    $.getJSON(bmapStyleURL, function(style) {
        for (key in style) {
            if (key != '眼眸') {
                let $option = $('<option>' + key + '</option>');
                $option.data('json', style[key]);
                $mapStyle.append($option);
            }
        }
        $mapStyle.children().eq(3).prop('selected', true);
        $mapStyle.trigger('change');
    });
}, 100);