echart与百度地图实现省、市、县地图

用eachart轻松实现江苏地图效果如下

实现其他省份、县级地图与实现江苏地图原理相同。实现江苏省地图步骤及源码如下:

1.获取江苏省的geojson格式数据,获取途径http://datav.aliyun.com/ 输入江苏省,下载geojson数据。如要获取某个具体地方的标记位置,可通过http://geojson.io mark获取具体点位置。

2.具体代码如下

<!DOCTYPE html>
<html style="height: 100%">
   <head>
       <meta charset="utf-8">
   </head>
   <style>
       body{
           height: 100%;
           background: url(bg.png);
       }
   </style>
   <body>
       <div id="container" style="height: 100%"></div>
       <script type="text/javascript" src="d3/jquery-1.12.0.min.js"></script>
       <script type="text/javascript" src="echarts.min.js"></script>
       <script type="text/javascript">
//var dom = document.getElementById("container");
//var myChart = echarts.init(dom);

option = null;
//myChart.showLoading();

var suzhou = "suzhou.json";
echarts.extendsMap = function(id, opt) {
    // 实例
    var chart = this.init(document.getElementById(id));
    var curGeoJson = {};
    var cityMap = {
        '苏州': suzhou
    };
    var geoCoordMap = {
        '虎丘区': [120.388523,31.337691],
        '吴中区': [120.316597,31.140543],
        '相城区': [120.636143,31.445694],
        '姑苏区': [120.718877,31.329375],
        '吴江区': [120.632213,31.008628],
        '常熟市': [120.82405,31.660416],
        '张家港市': [120.629597,31.899406],
        '昆山市': [120.959204,31.321546],
        '太仓市': [121.151507,31.569435]
    };

    var levelColorMap = {
        '1': 'rgba(241, 109, 115, .8)',
        '2': 'rgba(255, 235, 59, .7)',
        '3': 'rgba(147, 235, 248, 1)'
    };

    var defaultOpt = {
        mapName: 'suzhou', // 地图展示
        goDown: false, // 是否下钻
        bgColor: '#404a59', // 画布背景色
        activeArea: [], // 区域高亮,同echarts配置项
        data: [],
        // 下钻回调(点击的地图名、实例对象option、实例对象)
        callback: function(name, option, instance) {}
    };
    if (opt) opt = this.util.extend(defaultOpt, opt);

    // 层级索引
    var name = [opt.mapName];
    var idx = 0;
    var pos = {
        leftPlus: 115,
        leftCur: 150,
        left: 198,
        top: 50
    };

    var line = [
        [0, 0],
        [8, 11],
        [0, 22]
    ];
    // style
    var style = {
        font: '18px "Microsoft YaHei", sans-serif',
        textColor: '#eee',
        lineColor: 'rgba(147, 235, 248, .8)'
    };

    var handleEvents = {
        /**
         * i 实例对象
         * o option
         * n 地图名
         **/
        resetOption: function(i, o, n) {
            var j = name.indexOf(n);
            var l = o.graphic.length;
            if (j < 0) {
                o.graphic[0].children[0].shape.x2 = 145;
                o.graphic[0].children[1].shape.x2 = 145;
                if (o.graphic.length > 2) {
                    var cityData = [];
                    var cityJson;
                    for (var x = 0; x < opt.data.length; x++) {
                        if(n === opt.data[x].city){
                            $([opt.data[x]]).each(function(index,data){
                                cityJson = {city:data.city,name:data.name,value:data.value,crew:data.crew,company:data.company,position:data.position,region:data.region};
                                cityData.push(cityJson)
                            })
                        }
                    }

                    if(cityData!=null){
                        o.series[0].data = handleEvents.initSeriesData(cityData);
                    }else{
                        o.series[0].data = [];
                    }


                }
                name.push(n);
                idx++;
            } else {
                o.graphic.splice(j + 2, l);
                if (o.graphic.length <= 2) {
                    o.graphic[0].children[0].shape.x2 = 60;
                    o.graphic[0].children[1].shape.x2 = 60;
                    o.series[0].data = handleEvents.initSeriesData(opt.data);
                }
                name.splice(j + 1, l);
                idx = j;
                pos.leftCur -= pos.leftPlus * (l - j - 1);
            }

            o.geo.map = n;
            o.geo.zoom = 0.4;
            i.clear();
            i.setOption(o);
            this.zoomAnimation();
            opt.callback(n, o, i);
        },

        // 设置effectscatter
        initSeriesData: function(data) {
            var temp = [];
            for (var i = 0; i < data.length; i++) {
                var geoCoord = geoCoordMap[data[i].name];
                if (geoCoord) {
                    temp.push({
                        name: data[i].name,
                        value: geoCoord.concat(data[i].value),
                        crew:data[i].crew,
                        company:data[i].company,
                        position:data[i].position,
                        region:data[i].region
                    });
                }
            }
            return temp;
        },
        zoomAnimation: function() {
            var count = null;
            var zoom = function(per) {
                if (!count) count = per;
                count = count + per;
                chart.setOption({
                    geo: {
                        zoom: count
                    }
                });
                if (count < 1) window.requestAnimationFrame(function() {
                    zoom(0.2);
                });
            };
            window.requestAnimationFrame(function() {
                zoom(0.2);
            });
        }
    };

    var option = {
        backgroundColor: opt.bgColor,
        tooltip: {
            show: true,
            trigger:'item'
        },
        geo: {
            map: opt.mapName,
            roam: false,
            zoom: 1,
            label: {
                normal: {
                    show: true,
                    textStyle: {
                        color: '#fff'
                    }
                },
                emphasis: {
                    textStyle: {
                        color: '#fff'
                    }
                }
            },
            itemStyle: {
                normal: {
                    borderColor: 'rgba(147, 235, 248, 1)',
                    borderWidth: 1,
//                    areaColor:'rgba(5,84,77,0.4)',
                    areaColor: {
                        type: 'linear',
                        x: 0,
                        y: 0,
                        x2: 0,
                        y2: 1,
                        colorStops: [{
                            offset: 0, color: 'rgba(5,84,77,0.4)' // 0% 处的颜色
                        }, {
                            offset: 1, color: 'rgba(5,84,77,0.4)' // 100% 处的颜色
                        }],
                        global: false // 缺省为 false
                    },
                    shadowColor: '#00102a',
                    shadowOffsetX: 0,
                    shadowOffsetY: 12,
                    shadowBlur: 20
                },
                emphasis: {
                    areaColor: '#20BCE3',
                    borderWidth: 0,
                    shadowColor: 'rgba(254,253,201,0.3)',
                    shadowBlur: 20
                }
            },
            regions: opt.activeArea.map(function(item) {
                if (typeof item !== 'string') {
                    return {
                        name: item.name,
                        itemStyle: {
                            normal: {
                                areaColor: item.areaColor || '#389BB7'
                            }
                        },
                        label: {
                            normal: {
                                show: item.showLabel,
                                textStyle: {
                                    color: '#fff'
                                }
                            }
                        }
                    }
                } else {
                    return {
                        name: item,
                        itemStyle: {
                            normal: {
                                borderColor: '#91e6ff',
                                areaColor: '#389BB7'
                            }
                        }
                    }
                }
            })
        },
        series: [
            {
                "name":"姑苏区 Top10",
                "type":"lines",
                "tooltip": {
                    formatter:function(params, ticket, callback){
                        var tips = '<ul style="list-style: none">';
                        tips += '<li>行政区划:' + params.data.fromName +'-'+ params.data.toName+ '</li>';
                        tips += '<li>最近上报时间:' + new Date().toLocaleTimeString() + '</li>';
                        tips += '</ul>';
                        return tips;
                    }
                },
                "zlevel":1,
                "lineStyle":{"normal":{color: {
                    type: 'linear',
                    x: 0,
                    y: 0,
                    x2: 0,
                    y2: 1,
                    colorStops: [{
                        offset: 0, color: '#0AFDFD' // 0% 处的颜色
                    }, {
                        offset: 1, color: 'white' // 100% 处的颜色
                    }],
                    global: false // 缺省为 false
                },"width":1,"curveness":0.2}},
                "data":[
                    {"fromName":"张家港市","toName":"姑苏区","coords":[[120.629597,31.899406],[120.718877,31.329375]]},
                    {"fromName":"常熟市","toName":"姑苏区","coords":[[120.82405,31.660416],[120.718877,31.329375]]},
                    {"fromName":"太仓市","toName":"姑苏区","coords":[[121.151507,31.569435],[120.718877,31.329375]]},
                    {"fromName":"吴江区","toName":"吴中区","coords":[[120.632213,31.008628],[120.316597,31.140543]]},
                    {"fromName":"吴中区","toName":"虎丘区","coords":[[120.316597,31.140543],[120.388523,31.337691]]},
                    {"fromName":"昆山市","toName":"吴江区","coords":[[120.959204,31.321546],[120.632213,31.008628]]},
                    {"fromName":"虎丘区","toName":"相城区","coords":[[120.388523,31.337691],[120.636143,31.445694]]}
                ],
                /*markPoint: {
                    symbol: 'pin',
                    symbolSize: 50,
                    effect: {
                        show: true,
                        shadowBlur: 0
                    },
                    itemStyle: {
                        color: {
                            type: 'radial',
                            x: 0.5,
                            y: 0.5,
                            r: 0.5,
                            colorStops: [{
                                offset: 0, color: 'red' // 0% 处的颜色
                            }, {
                                offset: 1, color: 'blue' // 100% 处的颜色
                            }],
                            global: false // 缺省为 false
                        },
                        normal: {
                            label: {show: false}
                        },
                        emphasis: {
                            label: {position: 'top'}
                        }
                    },
                    data: [
                        {name: '昆山市', x: '50%', y: '60%'},
                        {name: '常熟市', x: 50, y: 100},
                        {name: '太仓市', x: 60, y: 100},
                        {name: '昆山市', x: 40, y: 100},
                        {name: '吴江区', x: 90, y: 100}
                    ]
                }*/
            },
            {
                "name":"苏州",
                "type":"effectScatter",
                "tooltip": {
                    formatter:function(params, ticket, callback){
                        var tips = '<ul style="list-style: none">';
                        tips += '<li>行政区划:' + params.data.name+ '</li>';
                        tips += '<li>最近上报时间:' + new Date().toLocaleTimeString() + '</li>';
                        tips += '</ul>';
                        return tips;
                    }
                },
                "coordinateSystem":"geo",
                "zlevel":2,
                "showEffectOn":"render",
                hoverAnimation: true,
//                "rippleEffect":{period:6, scale: 4, brushType: 'stoke'},
                "rippleEffect":{period:2, scale: 4, brushType: 'fill'},
//                "label":{"normal":{"show":false,"position":"right","formatter":"{b}"},"color":"#fff"},
                "itemStyle":{"normal":{"color":"#16FDFD"}},
                "data":[
                    {"name":"虎丘区","value":[120.388523,31.337691]},
                    {"name":"吴中区","value":[120.316597,31.140543]},
                    {"name":"相城区","value":[120.636143,31.445694]},
                    {"name":"姑苏区","value":[120.718877,31.329375]},
                    {"name":"吴江区","value":[120.632213,31.008628]},
                    {"name":"常熟市","value":[120.82405,31.660416]},
                    {"name":"张家港市","value":[120.629597,31.899406]},
                    {"name":"昆山市","value":[120.959204,31.321546]},
                    {"name":"太仓市","value":[121.151507,31.569435]}
                ]}
    ]
    };

    chart.setOption(option);
    // 添加事件
    chart.on('click', function(params) {
        console.log(params);
        var _self = this;
        if (opt.goDown && params.name !== name[idx]) {
            if (cityMap[params.name]) {
                var url = cityMap[params.name];
                $.get(url, function(response) {
                    curGeoJson = response;
                    echarts.registerMap(params.name, response);
                    handleEvents.resetOption(_self, option, params.name);
                });
            }
        }
    });
    chart.setMap = function(mapName) {
        var _self = this;
        if (mapName.indexOf('市') < 0) mapName = mapName + '市';
        var citySource = cityMap[mapName];
        if (citySource) {
            var url = './map/' + citySource + '.json';
            $.get(url, function(response) {
                curGeoJson = response;
                echarts.registerMap(mapName, response);
                handleEvents.resetOption(_self, option, mapName);
            });
        }

    };

    return chart;
};
var myChart = null;
$.getJSON('suzhou.json', function(geoJson) {
    echarts.registerMap('苏州', geoJson);
    myChart = echarts.extendsMap('container', {
        bgColor: 'transparent', // 画布背景色
        mapName: '苏州', // 地图名
        text:'火电业务',
        goDown: false // 是否下钻
    });
});
/*分享需要的*/
if (option && typeof option === "object") {
    myChart.setOption(option, true);
}
       </script>
   </body>
</html>

 

Guess you like

Origin blog.csdn.net/lyn1772671980/article/details/89493014