echarts生成地图(自定义区域色块,自定义图标样式,自定义移入效果)

news2025/2/6 0:56:10

一、使用echarts生成一个地图,看一下生成效果图

二、使用步骤

1.先准备需要的数据

DataV.GeoAtlas地理小工具系列 可以去这个网站下载需要的json数据,也可在线引入,但是发布到线上有问题,所以我这边是直接把数据下载到本地使用。

把下载好的数据放入到public里面

在api写入一个axios引用本地数据,此处可区分一下在线环境和本地环境

代码如下:

import axios from "axios";

let path;

if (process.env.NODE_ENV === "production") {

    path = `在线前端访问地址/chinaData/510000.json`;

} else {

     path = `/chinaData/510000.json`;

}

export default axios.get(path);

2.准备dom实例,引入数据使用

3.自定义区域颜色块 

给每个区域加上需要的颜色就可以,此处数据是写死的,如果是后端提供就需要拼接一下成这个样式,关键代码块:

itemStyle: { normal: { areaColor: "#2C6AE8" } }, 

 4.自定义鼠标移入显示字段

  tooltip: {

                formatter: function (params) {

                    var dataCon = params.data;

                    let txtCon = `${dataCon.value}`;

                    return txtCon;

                },

            },

5.自定义地图图标

 {

                    type: "scatter",

                    coordinateSystem: "geo",

                    itemStyle: {

                        color: "transparent",

                    },

                    symbol: `image://${imgUrl}`,

                    //针对于多个不同图标使用

                    // symbol: function (params) {

                    //   const mapIcon = seriesData.find((item) => {

                    //     return item.value == params[2]

                    //   })

                    //   return mapIcon.icon

                    // }, // svg图标

                    symbolSize: [15, 21],

                    symbolOffset: [3, -5],

                    z: 999,

                    zoom: 1,

                    roam: true,

                    animationDurationUpdate: 0,

                    data: convertData(seriesData),

                    //自定义鼠标移到图标上显示的东西

                    tooltip: {

                        formatter: function (params) {

                            let txtCon =

                                params.name == "成都市" ||

                                params.name == "绵阳市"

                                    ? "红色预警"

                                    : "哈哈哈";

                            return txtCon;

                        },

                    },

                },

6.地图点击事件,点击某块区域进行跳转

 myChart.on("click", function (args) {

            console.log("地图点击事件");

        });

具体代码,复制即使用
<template>
    <div class="map-chart">
        <div
            id="echatsMap"
            ref="chartsDOM"
            style="width: 100%; height: 100%"
        ></div>
    </div>
</template>
<script setup>
import { onMounted, ref, reactive, watch } from "vue";
import * as echarts from "echarts/core";
import mapApi from "@/api/mapApi.js";
import imgUrl from "@/assets/imgs/adr.png";
import imgUrl1 from "@/assets/imgs/adr1.png";
import imgUrl2 from "@/assets/imgs/adr2.png";
import imgUrl3 from "@/assets/imgs/adr3.png";
onMounted(() => {
    getMap();
});
const getMap = () => {
    var myChart = echarts.init(document.getElementById("echatsMap"));
    // 显示 loading 动画
    myChart.showLoading();
    // 再得到数据的基础上,进行地图绘制
    mapApi.then((res) => {
        // 得到结果后,关闭动画
        myChart.hideLoading();
        // 注册地图(数据放在axios返回对象的data中哦)
        echarts.registerMap("MAP", res.data);
		//各城市显示数据
        var seriesData = [
            {
                name: "成都市",
                value: 482,
                itemStyle: { normal: { areaColor: "#2C6AE8" } },
                icon: "",
            },
            {
                name: "自贡市",
                value: 642,
                itemStyle: { normal: { areaColor: "#A7CEFC" } },
                icon: "",
            },
            {
                name: "攀枝花市",
                value: 385,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: "",
            },
            {
                name: "泸州市",
                value: 545,
                itemStyle: { normal: { areaColor: "#A7CEFC" } },
                icon: "",
            },
            {
                name: "德阳市",
                value: 564,
                itemStyle: { normal: { areaColor: "#A7CEFC" } },
                icon: "",
            },
            {
                name: "绵阳市",
                value: 339,
                itemStyle: { normal: { areaColor: "#2C6AE8" } },
                icon: "",
            },
            {
                name: "广元市",
                value: 110,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: "",
            },
            {
                name: "遂宁市",
                value: 905,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "内江市",
                value: 394,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: "",
            },
            {
                name: "乐山市",
                value: 650,
                itemStyle: { normal: { areaColor: "#A7CEFC" } },
                icon: "",
            },
            {
                name: "南充市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "眉山市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "宜宾市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "广安市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "达州市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "雅安市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "巴中市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#2C6AE8" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "资阳市",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "阿坝藏族羌族自治州",
                value: 1075,
                itemStyle: { normal: { areaColor: "#669EF5" } },
                icon: `image://${imgUrl1}`,
            },
            {
                name: "甘孜藏族自治州",
                value: 1075,
                itemStyle: { normal: { areaColor: "#2C6AE8" } },
                icon: `image://${imgUrl2}`,
            },
            {
                name: "凉山彝族自治州",
                value: 1075,
                itemStyle: { normal: { areaColor: "#2C6AE8" } },
                icon: `image://${imgUrl2}`,
            },
        ];
		//坐标点显示的位置
        const geoCoordMap = {
            成都市: [104.065735, 30.659462],
            自贡市: [104.773447, 29.352765],
            攀枝花市: [101.716007, 26.580446],
            泸州市: [105.443348, 28.889138],
            德阳市: [104.398651, 31.127991],
            绵阳市: [104.741722, 31.46402],
            广元市: [105.829757, 32.433668],
            遂宁市: [105.571331, 30.513311],
            内江市: [105.066138, 29.58708],
            乐山市: [103.761263, 29.582024],
            南充市: [106.082974, 30.795281],
            眉山市: [103.831788, 30.048318],
            宜宾市: [104.630825, 28.760189],
            广安市: [106.633369, 30.456398],
            达州市: [107.502262, 31.209484],
            雅安市: [103.001033, 29.987722],
            巴中市: [106.753669, 31.858809],
            资阳市: [104.641917, 30.122211],
            阿坝藏族羌族自治州: [102.221374, 31.899792],
            甘孜藏族自治州: [101.963815, 30.050663],
            凉山彝族自治州: [102.258746, 27.886762],
        };
        let convertData = function (data) {
            let scatterData = [];
            for (var i = 0; i < data.length; i++) {
                var geoCoord = geoCoordMap[data[i].name];
                if (geoCoord) {
                    scatterData.push({
                        name: data[i].name,
                        value: geoCoord.concat(data[i].value),
                    });
                }
            }
            return scatterData;
        };
        var option = {
            title: {
                text: "",
            },
            geo: {
                map: "MAP",
                aspectScale: 0.75, //长宽比
                zoom: 1,
                roam: true, //滚轮 放大缩小
                animationDurationUpdate: 0,
                itemStyle: {
                    normal: {
                        borderWidth: 2, //设置外层边框
                        borderColor: "rgb(28,72,122)",
                        areaColor: "#013C62",
                        shadowColor: "#182f68",
                        shadowOffsetX: 0,
                        shadowOffsetY: 8,
                    },
                    emphasis: {
                        areaColor: "#2AB8FF",
                        borderWidth: 0,
                        color: "green",
                        label: {
                            show: false,
                        },
                    },
                },
            },
			//鼠标移入效果
            tooltip: {
                formatter: function (params) {
                    var dataCon = params.data;
                    let txtCon = `${dataCon.value}`;
                    return txtCon;
                },
            },
            series: [
                {
                    name: "",
                    type: "map",
                    map: "MAP", // 这个是上面注册时的名字,registerMap('这个名字保持一致')
                    label: {
                        normal: {
                            show: true,
                            textStyle: {
                                color: "#fff",
                                fontSize: 12,
                            },
                        },
                        emphasis: {
                            textStyle: {
                                color: "rgb(183,185,14)",
                            },
                        },
                    },
                    itemStyle: {
                        normal: {
                            borderColor: "rgb(147, 235, 248,.8)",
                            borderWidth: 0.2,

                            areaColor: {
                                type: "linear",
                                x: 0.2,
                                y: 0.8,
                                r: 0.8,
                                colorStops: [
                                    {
                                        offset: 0,
                                        color: "#002283", // 0% 处的颜色
                                    },
                                    {
                                        offset: 0.3,
                                        color: "#011f6d", // 0% 处的颜色
                                    },
                                    {
                                        offset: 1,
                                        color: "#021640", // 100% 处的颜色
                                    },
                                ],
                                globalCoord: true, // 缺省为 false
                            },
                            //   zoom: 1,
                            //   roam: true,
                            //   animationDurationUpdate:0,
                        },
                        emphasis: {
                            areaColor: {
                                type: "radial",
                                x: 0.2,
                                y: 0.8,
                                r: 0.8,
                                colorStops: [
                                    {
                                        offset: 0,
                                        color: "#091739", // 0% 处的颜色
                                    },
                                    {
                                        offset: 1,
                                        color: "#0b1843", // 100% 处的颜色
                                    },
                                ],
                                globalCoord: true, // 缺省为 false
                            },
                            borderWidth: 1,
                            // borderColor: '#f9bc90',
                            zoom: 1,
                            roam: true,
                            animationDurationUpdate: 0,
                        },
                    },
                    zoom: 1,
                    roam: true,
                    animationDurationUpdate: 0,
                    data: seriesData,
                },

                {
                    type: "scatter",
                    coordinateSystem: "geo",
                    itemStyle: {
                        color: "transparent",
                    },
                    symbol: `image://${imgUrl}`,
                    //针对于多个不同图标使用
                    // symbol: function (params) {
                    //   const mapIcon = seriesData.find((item) => {
                    //     return item.value == params[2]
                    //   })
                    //   return mapIcon.icon
                    // }, // svg图标
                    symbolSize: [15, 21],
                    symbolOffset: [3, -5],
                    z: 999,
                    zoom: 1,
                    roam: true,
                    animationDurationUpdate: 0,
                    data: convertData(seriesData),
                    //自定义鼠标移到图标上显示的东西
                    tooltip: {
                        formatter: function (params) {
                            let txtCon =
                                params.name == "成都市" ||
                                params.name == "绵阳市"
                                    ? "红色预警"
                                    : "哈哈哈";
                            return txtCon;
                        },
                    },
                },
            ],
        };
        myChart.setOption(option);
        myChart.on("click", function (args) {
            console.log("地图点击事件");
        });
        myChart.on("georoam", function (params) {
            let option1 = myChart.getOption(); //获得option对象
            if (params.zoom != null && params.zoom != undefined) {
                //捕捉到缩放时
                option1.geo[0].zoom = option1.series[0].zoom; //下层geo的缩放等级跟着上层的geo一起改变
                option1.geo[0].center = option1.series[0].center; //下层的geo的中心位置随着上层geo一起改变
                option1.geo[0].animationDurationUpdate = 0; //防止地图缩放卡顿
                option1.series[0].animationDurationUpdate = 0; //防止地图缩放卡顿
            } else {
                //捕捉到拖曳时
                option1.geo[0].center = option1.series[0].center; //下层的geo的中心位置随着上层geo一起改变
            }
            myChart.setOption(option1); //设置option
        });
    });
};
</script>

<style lang="scss" scoped>
.map-chart {
    width: 50%;
    height: 700px;
    margin-top: 30px;
    background-color: #012366;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FPGA】分享一些FPGA高速信号处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

Python实现API接口并发测试

目录 一、引言 二、准备工作 三、并发测试的实现 1、导入必要的库 2、定义并发测试函数 3、调用并发测试函数 四、测试结果分析和优化 五、总结 一、引言 随着微服务架构和RESTful API的普及&#xff0c;API接口测试变得越来越重要。并发测试是API测试的一个重要方面&…

入门IC必读书目推荐!你真的不能错过

在IC行业&#xff0c;技术和经验都很重要&#xff0c;为了更好的学习&#xff0c;现为大家整理了各岗位的学习书目。 以上书目&#xff0c;可以免费分享&#xff0c;你想要哪本呢~ 这里放个口&#xff1a;入门IC必读书目 通用基础类 《半导体物理学》 这本书被国内大部分高校…

PostgreSQL数据库有哪些优点

在现在的这个数据驱动的社会中&#xff0c;数据库管理系统的选择对于企业来说非常重要的。PostgreSQL凭着他卓越的特性和优势成为了大多数组织和开发者的选择。那PostgreSQL数据库有哪些优势呢&#xff0c;下面以我的理解简单的介绍一下。 可靠性 系统设计重视数据完整性和一…

SpringBoot3 核心原理

1. 事件和监听器 1. 生命周期监听 场景&#xff1a;监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件&#xff1b; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springfram…

MyBatis框架——MyBatis实现查询功能

一、简单查询 查询数据中的一条数据或多条数据&#xff0c;返回&#xff0c;有两种实现方式&#xff1a; 第一种&#xff0c;用注解的方式实现&#xff0c;方法如下图&#xff1a; 第二种&#xff0c;用mapper的方式实现&#xff0c;方法如下图&#xff1a; 注意&#xff1a;…

Python-logging模块之配置字典

Python-logging模块之配置字典 目录 介绍模版功能详情 formatters日志格式fitters过滤器handlers日志处理器loggers日志记录器 字典的加载进阶操作 无名loggers日志轮转 介绍 由于不少小伙伴在使用logging.basicConfig基本日志配置时经常遇到乱码问题&#xff0c;这其实是…

Flamingo与亚马逊云科技合作,进一步优化海外客户的访问体验

据中国海关统计&#xff0c;2023年上半年&#xff0c;我国跨境电商进出口规模约1.1万亿元&#xff0c;比上年同期&#xff08;下同&#xff09;增长16.6%&#xff0c;增速加快13.7个百分点。其中&#xff0c;出口约8254亿元&#xff0c;增长20.6%&#xff0c;占同期我国出口总值…

分支限界法求解01背包(优先队列)【java】

实验内容&#xff1a;运用分支限界法解决0-1背包问题 实验目的&#xff1a;分支限界法按广度优先策略遍历问题的解空间树&#xff0c;在遍历过程中,对已经处理的每一个结点根据限界函数估算目标函数的可能取值&#xff0c;从中选取使目标函数取得极值的结点优先进行广度忧先搜…

xxl-job报错:xxl-job registry fail:The access token is wrong

1、报错信息 .ExecutorRegistryThread : >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroupEXECUTOR, registryKeyxxl-job-executor-sample, registryValuehttp://192.168.133.1:9999/}, registryResult:Re…

支持二开可定制化的企业电子招标采购系统源码

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

Pandas 数据处理入门

Python的Pandas库是数据科学家和分析师的神器。在本文中&#xff0c;我们将详细探讨如何利用Pandas进行有效的数据处理&#xff0c;包括数据结构的理解、数据的导入、探索和基本处理。 认识Pandas 简要介绍Pandas的重要性安装和导入Pandas库 import pandas as pdPandas数据结…

简单实现通过代码启动 appium server

一、前置说明 总体目录&#xff1a;《从 0-1 搭建企业级 APP 自动化测试框架》上节回顾&#xff1a;在 os_util 工具类和方法的实现 中&#xff0c;实现了启动应用程序和查杀进程的一些基本方法。本节目标&#xff1a;简单实现通过代码启动 appium server&#xff0c;代替手动…

【低照度图像增强系列(2)】Retinex(SSR/MSR/MSRCR)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

云仓酒庄的品牌雷盛红酒LEESON分享干红是纯葡萄酿造的吗?

干红是一种葡萄酒的简称&#xff0c;全称是干型红葡萄酒。葡萄酒按含残糖量分为干型、半干型、半甜型和甜型。无论什么型的酒&#xff0c;只要是葡萄酒&#xff0c;那就是葡萄酿造的。 云仓酒庄的品牌雷盛红酒LEESON分享干红是葡萄酒的一种&#xff0c;而葡萄酒却不止干红一种…

[问题随记]-如何修改网页中input type=file按钮名字

在使用HTML编辑网页的时候经常会出现如下问题&#xff0c;使用<input typefile>的类型控件上传文件按钮的时候&#xff0c;无法对按钮的名字进行修改&#xff0c;如下为解决方案 <input typefile nameBseleFile style"display:none" onchange"iTest.va…

【代码随想录】刷题笔记Day39

前言 下午答疑课过于无聊了&#xff0c;后台在跑代码也写不了作业&#xff0c;再刷点题吧~难得一天两篇 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 和之前重叠区间是同个类型&#xff0c;和res里的元素比较&#xff0c;重叠就更新res里最后元素的最右边界 class…

JavaScript 中的双等号(==)和三等号(===)有何不同?何时使用它们?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-等号区别 目录 和 区别&#xff0c;分别在什么情况使用 一、等于操作符…

Vue与低代码开发:简化前端开发的强力组合

在当下瞬息万变的软件开发领域&#xff0c;前端开发的速率与效益显得尤为关键。为适应市场的不断变迁&#xff0c;开发者们致力于寻求更为快捷、高效的开发模式。因此&#xff0c;Vue框架与低代码开发平台受到了开发者们的高度关注。本文旨在探讨Vue框架与低代码开发的融合&…

如何在水经微图中加载调用长光卫星影像

我们在这里&#xff0c;再来分享长光卫星影像在水经微图中的加载方法。 如何获取地图服务地址 如果你还没有在长光的官网注册&#xff0c;请通过以下地址注册。 https://www.jl1mall.com/rskit/?agentCompanySJZ&agentfangfang 因为&#xff0c;只有注册之后才能获取到…