echarts 中国地图大区分区(五六七任意分区)

最近接到一个小需求,领导让做一个地图分区,无论是七大区也好,六,五大区,其实逻辑都一样,都是基于echarts合并大区里省份,将合并后的省份信息作为源数据传入option,好了废话不多说,直接开始

由于目前只写了jquery版本的,所以其它版本的如vue、react的,如果有需要,我可以帮忙整理;

就不分享源码了,都在链接里面了,可以自行查看:https://jianghaifei.top/map2/map.html
个人服务器访问速度有点慢,多等一会,如果地址失效,可以直接私信我

分区.png
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>echarts地图合并-生成中国大区</title>
</head>

<body>
    <div class="echarts-map">
        <div class="echarts-map-box" id="echartsMapBox" style="width: 1000px;height:700px;border:1px solid #ccc;"></div>
        <script type="text/javascript" src="./jquery-1.8.3.min.js"></script>
        <script type="text/javascript" src="./echarts.min.js"></script>
        <script type="text/javascript" src="./china.js"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                repRegionStrategy();
            })

            var mergeProvinces = function (chinaJson, names, properties) {//合并大区里省份的coordinates
                var features = chinaJson.features;
                var polygons = [];
                var polygons2 = [];

                for (var i = 0; i < names.length; i++) {
                    var polygonsCoordinates = [];
                    var polygonsEncodeOffsets = [];
                    for (var z = 0; z < names[i].length; z++) {
                        for (var j = 0; j < features.length; j++) {
                            if (features[j].properties.name == names[i][z]) {
                                if (features[j].geometry.coordinates[0].constructor == String) {//合并coordinates
                                    for (var l = 0; l < features[j].geometry.coordinates.length; l++) {
                                        polygonsCoordinates.push(features[j].geometry.coordinates[l]);
                                    }

                                } else if (features[j].geometry.coordinates[0].constructor == Array) {
                                    for (var k = 0; k < features[j].geometry.coordinates.length; k++) {
                                        for (var d = 0; d < features[j].geometry.coordinates[k].length; d++) {
                                            polygonsCoordinates.push(features[j].geometry.coordinates[k][d]);
                                        }
                                    }
                                }



                                if (features[j].geometry.encodeOffsets[0].constructor == String) {//合并encodeOffsets
                                    polygonsEncodeOffsets.push(features[j].geometry.encodeOffsets);
                                } else if (features[j].geometry.encodeOffsets[0].constructor == Array) {
                                    for (var k = 0; k < features[j].geometry.encodeOffsets.length; k++) {
                                        if (features[j].geometry.encodeOffsets[k][0].constructor == Array) {
                                            for (var e = 0; e < features[j].geometry.encodeOffsets[k].length; e++) {
                                                polygonsEncodeOffsets.push(features[j].geometry.encodeOffsets[k][e]);
                                            }
                                        } else {
                                            polygonsEncodeOffsets.push(features[j].geometry.encodeOffsets[k]);
                                        }
                                    }
                                }

                                break;
                            }
                        }
                    }
                    polygons.push(polygonsCoordinates);
                    polygons2.push(polygonsEncodeOffsets);

                }

                // 构建新的合并区域
                var features = [];

                for (var a = 0; a < names.length; a++) {
                    var feature = {
                        id: features.length.toString(),
                        type: "FeatureCollection",
                        geometry: {
                            type: "Polygon",
                            coordinates: polygons[a],
                            encodeOffsets: polygons2[a]
                        },
                        properties: {
                            name: properties.name[a] || "",
                            childNum: polygons[a].length
                        },
                        temStyle: { normal: { areaColor: 'red', label: { show: false } } }
                    };
                    if (properties.cp[a]) {
                        feature.properties.cp = properties.cp[a];
                    }

                    // 将新的合并区域添加到地图中
                    features.push(feature);
                }
                chinaJson.features = features;

            };

            function repRegionStrategy() {
                $.get('./china.json', function (chinaJson) {
                    var params = {
                        names: [//把各个大区的省份用二维数组分开
                            ['北京', '天津', '河北', '山西', '山东', "河南"],
                            ["黑龙江", "吉林", "辽宁", '内蒙古'],
                            ['江苏', '安徽', '浙江', '福建', '上海', '台湾'],
                            [],
                            ['广东', '广西', '湖南', '湖北', '江西', '海南', '香港', '澳门'],
                            ['重庆', '四川', '云南', '西藏', '贵州'],
                            ['陕西', '甘肃', '青海', '宁夏', '新疆']
                        ],
                        properties: {//自定义大区的名字,要和上面的大区省份一一对应
                            name: ['华北区', '东北区', '华东区', '', '中南区', '西南区', '西北区'],
                            cp: [//经纬度可以自己随意定义
                                [115.24, 37.04],
                                [120.32, 44.50],
                                [121.28, 30.13],
                                [114.20, 30.32],
                                [113.00, 24.08],
                                [104.04, 29.39],
                                [96.49, 37.03]
                            ]
                        }
                    };
                    // 如果时候五大区,您就修改上面的数据,不能山删掉,可以空着
                    mergeProvinces(chinaJson, params.names, params.properties);

                    console.log(chinaJson)

                    echarts.registerMap('china', chinaJson); // 注册地图
                    var pRChart = echarts.init(document.getElementById('echartsMapBox'));

                    var data = [//地图数据
                        {
                            "name": "东北区",
                            "value": 3685,
                            "color": "#90ca88"
                        },
                        {
                            "name": "华北区",
                            "value": 7342,
                            "color": "#f09b7a"
                        },
                        {
                            "name": "华南",
                            "value": 21416,
                            "color": "yellow"
                        },
                        {
                            "name": "华东区",
                            "value": 25314,
                            "color": "#7ab8e2"
                        },
                        {
                            "name": "中南区",
                            "value": 2500,
                            "color": "#f1bd4c"
                        },
                        {
                            "name": "西南区",
                            "value": 10427,
                            "color": "#c1e2cf"
                        },
                        {
                            "name": "西北区",
                            "value": 2440,
                            "color": "#edb365"
                        },
                        {
                            "name": "南海诸岛",
                            "value": 2440,
                            "color": "#f1bd4c"
                        }
                    ];

                    var customSettings = [];
                    data.forEach(function (item, index) {
                        customSettings.push({
                            name: item.name,
                            itemStyle: {
                                normal: {
                                    areaColor: item.color,
                                    color: item.color,
                                },
                            }
                        })
                    })

                    option = {
                        tooltip: {
                            show: false,// 是否显示提示
                            formatter: function (params, ticket, callback) {
                                return params.seriesName + '<br />' + params.name + ':' + params.value
                            }//数据格式化
                        },
                        geo: {
                            map: 'china',
                            zoom: 1,//视角缩放比例
                            center: [108.5525, 34.3227],
                            label: {
                                normal: {
                                    show: true,
                                    fontSize: '10',
                                    color: 'rgba(0,0,0,0.7)',// 大区文本颜色
                                    fontSize: '20',
                                }
                            },
                            itemStyle: {
                                normal: {
                                    borderWidth: 2,
                                    borderColor: 'rgba(0, 0, 0, 0.1)'// 边界框线颜色 
                                },
                                emphasis: {
                                    areaColor: '',//鼠标选择区域颜色
                                    shadowOffsetX: 0,
                                    shadowOffsetY: 0,
                                    shadowBlur: 10,
                                    borderWidth: 0,
                                    borderColor: 'rgba(0, 0, 0, 0)',
                                    shadowColor: ''
                                }
                            },
                            regions: customSettings   // 设置大区单独的样式。
                        },
                        series: [
                            {
                                name: '',
                                type: 'map',
                                geoIndex: 0,
                                data: data
                            }
                        ]
                    };
                    pRChart.setOption(option, true);

                    pRChart.on('mouseover', function (params) {// 监听被划过状态
                        // console.log(params)
                    });


                    setTimeout(function () {
                        pRChart.dispatchAction({// 测试js设置某个模块高亮,被选中状态
                            type: 'highlight',
                            // 可选,系列 index,可以是一个数组指定多个系列
                            // seriesIndex: 0,
                            // 可选,系列名称,可以是一个数组指定多个系列
                            // seriesName: string|Array,
                            // 数据的 index,如果不指定也可以通过 name 属性根据名称指定数据
                            // dataIndex: number,
                            // 可选,数据名称,在有 dataIndex 的时候忽略
                            name: '东北区'
                        });
                    }, 3000)

                    setTimeout(function () {
                        console.log("22222");
                        pRChart.dispatchAction({
                            type: 'downplay',
                            // 可选,系列 index,可以是一个数组指定多个系列
                            // seriesIndex: 0,
                            // 可选,系列名称,可以是一个数组指定多个系列
                            // seriesName: string|Array,
                            // 数据的 index,如果不指定也可以通过 name 属性根据名称指定数据
                            // dataIndex: number,
                            // 可选,数据名称,在有 dataIndex 的时候忽略
                            name: '东北区'
                        });
                    }, 6000)
                });
            }

        </script>
    </div>
</body>

</html>

根据业务需求,我的各大区都是自定义颜色,如果需要设置能动态颜色,根据数值来自动设置各区块颜色,我也处理过,私信就行了

jquery的json文件加载是需要一个服务器环境的,代码下载后可以直接放在您的服务器上访问,或者利用IDEA、webstorm打开,或用vscode安装live-serve插件进行本地打开;

书山有路勤为径,努力吧;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容