百度ECharts插件 立體地圖陰影實現帶軌跡連接

陰影實現方式是:

css3翻轉畫布層,

疊加幾層陰影顏色的geo地圖,陰影的邊也是其中一層,調整各個畫布層的位置確保視覺上最符合設計。

其中漸變可不加,有點冗餘。

 

js代碼:

//默認地圖配置
const defaultMapOption={
    tooltip:{
        show:false,
        trigger:'item',
        showDelay:100,
        padding:0,
        confine:true,
        

    },
    geo: [
        {
            map:'FZ',
            roam:false,
            zoom:1.1,
            zlevel:2,
            z:1,
            aspectScale:1.05,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderColor:'#013a67',
                    borderWidth:2,
                    areaColor: '#0aade4',

                },
                emphasis: {
                    borderWidth:2,
                    areaColor: '#07aae1',
                    borderColor:'#013a67'
                }
            }
        },
        {
            map:'FZ',
            roam:false,
            zoom:1.1,
            zlevel:0,
            aspectScale:1.05,
            center:[338.04,310.15],
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderColor:'#639fdb',
                    borderWidth:1.5,
                    areaColor: '#003b65'

                },
                emphasis: {
                    borderWidth:1.5,
                    areaColor: '#003b65',
                    borderColor:'#639fdb'
                }
            }
        },
        {
            map:'FZ',
            roam:false,
            zlevel:1,
            zoom:1.1,
            z:1,
            aspectScale:1.05,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderColor:'#013a67',
                    borderWidth:2,
                    areaColor: '#0aade4',
                    shadowColor: 'rgba(1,58,101, 1)',
                    shadowBlur: 0,
                    shadowOffsetX:0,
                    shadowOffsetY:10

                },
                emphasis: {
                    borderWidth:3,
                    areaColor: '#07aae1',
                    borderColor:'#013a67'
                }
            }
        },
        {
            map:'FZ',
            roam:false,
            zlevel:1,
            zoom:1.1,
            z:1,
            aspectScale:1.05,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderColor:'#013a67',
                    borderWidth:2,
                    areaColor: '#0aade4',
                    shadowColor: 'rgba(1,58,101, 1)',
                    shadowBlur: 0,
                    shadowOffsetX:-1,
                    shadowOffsetY:10

                },
                emphasis: {
                    borderWidth:3,
                    areaColor: '#07aae1',
                    borderColor:'#013a67'
                }
            }
        },
        {
            map:'FZ',
            roam:false,
            zoom:1.1,
            zlevel:1,
            z:1,
            aspectScale:1.05,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderColor:'#013a67',
                    borderWidth:2,
                    areaColor: '#0aade4',
                    shadowColor: 'rgba(1,58,101, 1)',
                    shadowBlur: 0,
                    shadowOffsetX:-1,
                    shadowOffsetY:14

                },
                emphasis: {
                    borderWidth:3,
                    areaColor: '#07aae1',
                    borderColor:'#013a67'
                }
            }
        },
        {
            map:'FZ',
            roam:false,
            zoom:1.1,
            zlevel:1,
            z:1,
            aspectScale:1.05,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderColor:'#013a67',
                    borderWidth:2,
                    areaColor: '#0aade4',
                    shadowColor: 'rgba(1,58,101, 1)',
                    shadowBlur: 0,
                    shadowOffsetX:-1,
                    shadowOffsetY:21

                },
                emphasis: {
                    borderWidth:3,
                    areaColor: '#07aae1',
                    borderColor:'#013a67'
                }
            }
        },

    ],
    series:[
        {
            name:'標籤',
            type:'effectScatter',
            effectType:'ripple',
            rippleEffect:{
                brushType:'stroke',
                period:3
            },
            coordinateSystem:'geo',
            symbolSize: function (val){
                return val[2] / 200;
            },
            symbol:'circle',
            geoIndex:0,

            label: {
                normal: {
                    position: 'top',
                    show: true
                },
                emphasis: {
                    show: true,
                    color:'#fff'
                }
            },
            zlevel:5

        },
        {
            name:'散點圖',
            type:'effectScatter',
            effectType:'ripple',
            rippleEffect:{
                brushType:'stroke',
                period:3
            },
            coordinateSystem:'geo',
            symbolSize: function (val){
                return val[2] / 200;
            },
            symbol:'circle',
            geoIndex:0,
            label: {
                //show:false
            },

            itemStyle:{
                borderColor:'#f1c74b',
                color:'#f1c74b'
            },
            emphasis:{
                itemStyle:{
                    borderColor:'#f68454',
                    color:'#f68454'
                }

            },
            zlevel:3
        },
        {
            name:'地圖圖形',
            mapType:'FZ',
            type:'map',
            geoIndex:0,
            data:[],
            itemStyle:{
                areaColor:'#fff',
                borderWidth:1.5
            },
            zlevel:1
        },
        {
            name:'地圖連線',
            type:'lines',
            geoIndex:0,
            lineStyle: {
                color: '#fff7e5',
                width: 0.5,
                curveness: 0.3
            },
            zlevel:4
        },
        {
            name:'地圖陰影',
            mapType:'FZ',
            type:'map',
            geoIndex:1,
            aspectScale:1,
            data:[],
            itemStyle:{
                areaColor:'rgb(30,49,108)',
                borderWidth:7
            },
            zlevel:0
        }

    ]

};
//根據數據計算配置,併合並得到所有配置
function getopt(data){
        var geoCoordMap={
            '城廂區':[346.04,236.15],
            '荔城區':[460.09,190.64],
            '涵江區':[405.91,473.09],
            '仙遊縣':[161.26,328.13],
            '秀嶼區':[552.6,156.36],
            '湄洲島管委會':[482.6,20.3],
            '市直屬':[326.04,376.15],
            '北岸管委會':[472.6,106.3]
        };
        var geoCoordMap1={
            '城廂區':[346.04,256.15],
            '荔城區':[460.09,222.64],
            '涵江區':[405.91,433.09],
            '仙遊縣':[161.26,328.13],
            '秀嶼區':[552.6,200.36],
            '湄洲島管委會':[482.6,100.3],
            '市直屬':[326.04,346.15],
            '北岸管委會':[472.6,159.3]
        };
        var coneGeo=this.deepClone(geoCoordMap),me=this;
        var spName='市直屬';
        var planePath = 'path://M14.367,28.444 L11.003,67.087 L7.600,28.437 L0.014,28.429 L10.675,0.008 L21.298,28.452 L14.367,28.444 Z';

        var color=[colorObj.red,'#e96e16','#f2b30b'];

        function convertData(data,geoCoordMap) {
            var res = [];
            var labelStyle={
                normal: {
                    position:'top',
                    lineHeight:16,
                    formatter: function(param){
                        return '{a|'+param.name+' '+param.value[2]+'}\n\n{b| }';
                    },
                    rich:{
                        a:{
                            color:'#fff',
                            padding:5,
                            backgroundColor:'',
                            fontSize:defautFont()
                        },
                        b:{
                            width:1,
                            height:40,
                            backgroundColor:'',
                            align:'center'
                        }
                    }
                }
            };
            for (var i = 0; i < data.length; i++) {
                var geoCoord = geoCoordMap[data[i].name],thiscolor;
                if (geoCoord) {
                    var tepdata={
                        name: data[i].name,
                        value: geoCoord.concat(data[i].value)
                    };
                    if(tepdata.name=='市直屬'){
                        tepdata.label={
                            position:'right'
                        };
                        tepdata.symbolSize=15;
                        tepdata.symbol='path://M1077.529145 388.206248C1072.06379 371.533456 1056.511742 360.326019 1039.008769 360.326019L686.956883 360.326019 578.161726 27.824884C572.876243 11.207437 557.37954 0 539.765877 0 522.262904 0 506.710856 11.207437 501.370028 27.700357L392.450343 360.326019 40.467639 360.326019C22.909321 360.326019 7.398781 371.533456 2.002608 388.206248-3.462747 404.713004 2.528389 422.963139 16.682967 433.119014L301.504067 638.533348 192.764255 971.214355C187.243555 987.776457 193.234691 1005.860556 207.444614 1016.127121 221.474665 1026.338342 240.845544 1026.338342 254.944776 1016.127121L539.765877 810.588261 824.642322 1016.127121C831.629675 1021.191223 839.972989 1023.820128 848.371649 1023.820128 856.701127 1023.820128 865.099787 1021.191223 872.142485 1016.127121 886.297062 1005.860556 892.288199 987.776457 886.767498 971.214355L778.138377 638.533348 1062.793441 433.119014C1076.934183 422.963139 1082.869974 404.713004 1077.529145 388.206248Z';
                        tepdata.itemStyle={
                            color:'#ff3d3d',
                            borderColor:'#ff3d3d'
                        }
                    }
                    if(i<3){
                        thiscolor=color[0];
                    }else if(i<5){
                        thiscolor=color[1];
                    }else{
                        thiscolor=color[2];
                    }
                    var style=me.deepClone(labelStyle),newStyle={
                        normal: {
                            rich:{
                                a:{
                                    backgroundColor:thiscolor
                                },
                                b:{
                                    backgroundColor:thiscolor
                                }
                            }
                        }
                    };
                    newStyle=me.extendOption(style,newStyle);
                    tepdata.label=newStyle;

                    tepdata.itemStyle={
                        color:thiscolor,
                        borderColor:thiscolor
                    };

                    res.push(tepdata);
                }
            }
            return res;
        }
        function coverLinesData(data){
            var res = [];
            for (var i = 0; i < data.length; i++) {
                var dataItem = data[i],fromName=dataItem['fromName'],toName=dataItem['toName'];
                var fromCoord = geoCoordMap[fromName];
                var toCoord = geoCoordMap[toName];

                if (fromCoord && toCoord) {
                    dataItem.coords=[fromCoord, toCoord];
                    dataItem.effect={
                        show: true,
                        period: 6,
                        trailLength:.5,
                        symbol: planePath,
                        symbolSize: [10,30]
                    };
                    if(fromName==spName){
                        dataItem.effect.color='#ffda8a';
                    }else{
                        dataItem.effect.color='#ef4c3a';
                    }
                    res.push(dataItem);
                }

                //剔除有數據的連線
                if(coneGeo[fromName]){
                    delete coneGeo[fromName];
                }
                if(coneGeo[toName]){
                    delete coneGeo[toName];
                }
            }

            return {res:res,coneGeo:coneGeo};
        }

        var sData=this.deepClone(data.series[0].data);//深度複製
        //排序
        sData=this.sortData(sData);

        
        //bg.src='images/bar_top2.png';
        for(var j=0;j<sData.length;j++){
            var tempD=sData[j];
            /* tempD.itemStyle={
             color:'rgba(128, 128, 128,0)'
             };*/
            switch(tempD.name){
                case '仙遊縣':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2:0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#07a7e0' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#26cefe' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;

                case '荔城區':
                    tempD.itemStyle={
                        color:{
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2:0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#10b4e9' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#20c6f8' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '城廂區':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#0eb1e7' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#21c8f9' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '秀嶼區':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#00a1da' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#14b8ed' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '涵江區':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#17bcf0' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#26ceff' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '莆田市':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#1348ac' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#1650b3' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '福州市':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#144cb0' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#1a5ec1' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '寧德市':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#1959bd' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#1e6ace' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
                case '南平市':
                    tempD.itemStyle={
                        color: {
                            type: 'linear',
                            x: 0,
                            y: 0,
                            x2: 0,
                            y2: 1,
                            colorStops: [{
                                offset: 0, color: '#1a5cbe' // 0% 處的顏色
                            }, {
                                offset: 1, color: '#2070d2' // 100% 處的顏色
                            }],
                            globalCoord: false // 缺省爲 false
                        }
                    };
                    break;
            }

        }

        var maxValue=sData[0].value,maxSize=25,minSize= 5,
            lineDataObj=coverLinesData(data.series[0].lines);
        var resData=convertData(sData,geoCoordMap),resDataLabel=convertData(sData,geoCoordMap1),
            lineData=lineDataObj.res,
            noLineData=[];
        coneGeo=lineDataObj.coneGeo;

        //構造無數據lines
        for(var key in coneGeo){
            var fromCoord = geoCoordMap[spName];
            var toCoord = geoCoordMap[key];
            noLineData.push({
                name:spName+'-'+key,
                fromName:spName,
                toName:key,
                value:10,
                coords:[fromCoord,toCoord],
                effect:{
                    symbolSize: 0,
                    color:'rgba(255,255,255,0)'
                }
            });
        }
        lineData=lineData.concat(noLineData);
        var curveness={//區縣曲線方向弧度
            '涵江區':{fromcurveness:-0.4,tocurveness:0.4},
            '仙遊縣':{fromcurveness:0.6,tocurveness:-0.6},
            '城廂區':{fromcurveness:-0.25,tocurveness:0.25},
            '北岸管委會':{fromcurveness:-0.2,tocurveness:0.2},
            '湄洲島管委會':{fromcurveness:-0.25,tocurveness:0.25},
            '荔城區':{fromcurveness:-0.35,tocurveness:-0.35},
            '秀嶼區':{fromcurveness:-0.6,tocurveness:0.6}

        };
        for(var i=0;i<lineData.length;i++){
            //線條處理
            var tempD=lineData[i];
            if(curveness[tempD.fromName]){
                tempD.lineStyle={
                    curveness:curveness[tempD.fromName].fromcurveness
                };
            }
            if(curveness[tempD.toName]){
                tempD.lineStyle={
                    curveness:curveness[tempD.toName].tocurveness
                };
            }
        }
        var thisOption={
            series:[
                {
                    //標籤
                    data:resDataLabel,
                    symbolSize:1,
                    label:{
                        //offset:[40,40],
                        distance:50
                    },
                    animationDelay:1000,
                    animationDuration:1500
                    //zIndex
                },
                {
                //點
                data:resData,
                symbolSize:function(value) {
                    var p = value[2] / maxValue, size;
                    size = p * maxSize;
                    if (size <= minSize) {
                        size = minSize;
                    }
                    return size
                },
                    animationDelay:2000,
                    animationDuration:2000
            },{
                //圖形
                data:sData,
                left:0,
                itemStyle:{
                    borderColor:'#097cac',
                    shadowColor: 'rgba(255, 255, 255, 1)',
                    shadowBlur: 10
                }

            },{
                //線
                type:'lines',
                data:lineData,
                effect: {
                    show: true,
                    delay:2000
                },
                    animationDelay:1000,
                    animationDuration:1500
            },{
                //陰影
                data:data.series[0].data
            }
            ]
        };

        var mapOption=this.extendOption(defaultMapOption,thisOption);
        return mapOption;
    }
    //獲得echarts實例
    function echartSetOpt(id,opt){
        var echartsInstance=echarts.init(document.getElementById(id));
        echartsInstance.setOption(opt);
        return echartsInstance;
    },
//初始化地圖
function echartMapInit (id,data){
        var opt =echartMapOpt(data);
        var ins=echartSetOpt(id,opt);
        var ids=$('#'+id).find('canvas'),cs=$('#'+id).find('canvas:last-child');
        ids.css({
            'transform':'rotateX(45deg)',
            'transform-origin':'50% 50%',
            'transform-style':'preserve-3d'
        });

        cs.css({
            'transform':'rotateX(0deg)',
            'transform-origin':'50% 60%',
            'transform-style':'preserve-3d'
        });
       
        return ins;
    }

        //地圖數據 區域數據+連接線數據
        var mapData={
            series:[{
                name:'地圖',
                data:[
                    {name:'市直屬',value:2320},
                    {name:'城廂區',value:520},
                    {name:'荔城區',value:1600},
                    {name:'涵江區',value:1200},
                    {name:'仙遊縣',value:2235},
                    {name:'秀嶼區',value:2365},
                    {name:'北岸管委會',value:365},
                    {name:'湄洲島管委會',value:1365}
                ],
                lines:[
                    {name:'市直屬-涵江區',fromName:'市直屬',toName:'涵江區',value:20},
                    {name:'荔城區-市直屬',fromName:'荔城區',toName:'市直屬',value:20},
                    {name:'仙遊縣-市直屬',fromName:'仙遊縣',toName:'市直屬',value:10}
                ]
            }]
        };
        var map1;

        //350300.json是地圖geojson數據

        $.get('./javascript/map/350300.json', function (geoJson) {
            //註冊地圖,用於配置中
            echarts.registerMap('FZ', geoJson);
            map1=echartMapInit('map1',mapData);
        });

html:

<div class="map-chart" id="map1"></div>
<!-- map-chart設置div的高度寬度等樣式-->

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章