美文网首页
echarts 中国地图大区分区(五六七任意分区)

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

作者: seaflyj | 来源:发表于2021-06-07 09:25 被阅读0次

最近接到一个小需求,领导让做一个地图分区,无论是七大区也好,六,五大区,其实逻辑都一样,都是基于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插件进行本地打开;

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

相关文章

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

    最近接到一个小需求,领导让做一个地图分区,无论是七大区也好,六,五大区,其实逻辑都一样,都是基于echarts合并...

  • 磁盘分区

    四个主分区,一个扩展分区,任意多个逻辑分区扩展分区是名义上的分区,用来存放逻辑分区虚拟机以Virtual Box为...

  • echarts地图添加南海诸岛

    最近因项目需求,需要制作一个大区的中国地图,在使用 node_modules\echarts\lib\coord\...

  • mysql表分区

    mysql表分区主要分为RANGE分区,LIST分区,HASH分区,LINEAR HASH分区,KEY分区 目前,...

  • hive分区表

    分区就是分目录: 增加分区: 显示所有分区: 同时创建多个分区: 删除单个分区: 删除多个分区: 创建二级分区: ...

  • fdisk

    一、磁盘分区原理与规则 磁盘分区类型:主分区,扩展分区,逻辑分区 分区规则: 1、主分区+扩展分区的数量不能超过4...

  • linux 分区说明

    一、磁盘管理 1、分区类型:主分区、扩展分区、逻辑分区 2、分区要求: 分区不是必须的操作 主分区最多创建4个 主...

  • Ubuntu系统安装分区攻略

    主分区和逻辑分区 主分区 英语是Primary Partition。也称为主磁盘分区,和扩展分区、逻辑分区...

  • Swift--004:内存分区 & 方法调度

    内存分区 内存五大区内存分区按地址从高到低排列: 栈区->堆区->全局静态区->常量区-> 代码区栈区的地址比堆区...

  • 硬盘分区

    开始分区 n p 删除分区 d 添加扩展分区 n e (逻辑分区) 有了扩展分区才能添加逻辑分区 l和...

网友评论

      本文标题:echarts 中国地图大区分区(五六七任意分区)

      本文链接:https://www.haomeiwen.com/subject/xtxkeltx.html