echarts 中国地图效果,并附上小旗子

news2024/12/24 18:55:04

地图的基础部分

使用echarts开发中国地图,并修改地图默认颜色,以及hover效果以及背景色
可以放大缩小
以此文章记录

在这里插入图片描述

首先安装echarts npm install echarts
并引入 import * as echarts from 'echarts'
然后去下载中国地图的 json数据

import * as echarts from 'echarts'
import china from '@/assets/geo-json/china.json'

/**
 获取对应的json地图数据,然后向echarts注册该区域的地图,最后加载地图信息
 @params {String} mapData:json数据的地址
 @params {String} name: 地图名称
 */
const loadMap = (mapData, name) => {
  if (mapData) {
    echarts.registerMap(name, mapData)
    const option = {
      tooltip: {
        show: true,
        backgroundColor: 'rgba(13, 77, 61, 0.7)',
        textStyle: {
          color: '#FFF', // 文字的颜色
          fontStyle: 'normal',
          fontWeight: 'normal',
          fontSize: '12', // 文字字体大小
        },
        borderColor: 'rgba(13, 77, 61, 0.7)',
        enterable: true, // 鼠标可进入浮层内
        extraCssText: 'box-shadow: none',
        padding: 10,
        formatter: (params) => {
          const res = `<div style="width:156px;height:120px;display: flex;flex-direction: column;">
                    <h3 style="margin: 5px 10px"> ${params?.name}</h3>
                    <div style="display:flex;flex-direction: column;flex: 1;justify-content: space-evenly;">
                      <div> <span style="margin: 0px 10px">使用单位:</span>2156家</div>
                      <div> <span style="margin: 0px 10px">在用电梯:</span>18万台</div>
                      <div> <span style="margin: 0px 10px">待检测电梯:</span>1526台</div>
                      <div> <span style="margin: 0px 10px">待检验电梯:</span>1409台</div>
                    </div>
                  </div>
              `
          return res
        },
      },
      series: [
        {
          name: 'MAP',
          type: 'map',
          geoIndex: 0,
          roam: true, // 是否可缩放
          zoom: 1.1,
          mapType: name,
          selectedMode: 'false', // 是否允许选中多个区域
          itemStyle: { // 这里是默认颜色
            normal: {
              show: true,
              areaColor: '#C2F2E6',
              borderColor: 'rgb(185, 220, 227)',
              borderWidth: '1',
            },
          },
          label: {
            normal: {
              show: true,
              fontSize: 10,
            },
          },
          emphasis: { // 这里是hover上去时的效果
            show: true,
            label: {
              color: 'rgba(255,255,255,1)',
            },
            itemStyle: {
              areaColor: '#16A984',
            },
          },
          data: [{
            name: '北京',
            value: 2256
        }, {
            name: '天津',
            value: 744
        }, {
            name: '上海',
            value: 578
        }, {
            name: '重庆',
            value: 806
        }, {
            name: '河北',
            value: 432
        }, {
            name: '河南',
            value: 590
        }, {
            name: '云南',
            value: 132
        }, {
            name: '辽宁',
            value: 487
        }, {
            name: '黑龙江',
            value: 336
        }, {
            name: '湖南',
            value: 295
        }, {
            name: '安徽',
            value: 398
        }, {
            name: '山东',
            value: 1055
        }, {
            name: '新疆',
            value: 201
        }, {
            name: '江苏',
            value: 795
        }, {
            name: '浙江',
            value: 655
        }, {
            name: '江西',
            value: 311
        }, {
            name: '湖北',
            value: 993
        }, {
            name: '广西',
            value: 261
        }, {
            name: '甘肃',
            value: 349
        }, {
            name: '山西',
            value: 273
        }, {
            name: '内蒙古',
            value: 343
        }, {
            name: '陕西',
            value: 319
        }, {
            name: '吉林',
            value: 325
        }, {
            name: '福建',
            value: 317
        }, {
            name: '贵州',
            value: 275
        }, {
            name: '广东',
            value: 1000
        }, {
            name: '青海',
            value: 97
        }, {
            name: '西藏',
            value: 18
        }, {
            name: '四川',
            value: 601
        }, {
            name: '宁夏',
            value: 126
        }, {
            name: '海南',
            value: 186
        }, {
            name: '台湾',
            value: 0
        }, {
            name: '香港',
            value: 11
        }, {
            name: '澳门',
            value: 0
        }]
        }],
    }
    const myChart = echarts.init(chartRef.value)
    myChart.setOption(option, true)
  } else {
    Message.warning('无法加载该地图')
  }
}

onMounted(() => {
  loadMap(china, 'china') // 初始化全国地图
})

在地图上进行标记

在地图上进行标记 ,就要使用到 geo的配置
加上了geo那么series下面的配置就可以删除了,前提是你得配置geoIndex: 0,这个相当于HTML元素里面的index层级

itemStyle: {
            normal: {
              show: true,
              areaColor: '#C2F2E6',
              borderColor: 'rgb(185, 220, 227)',
              borderWidth: '1',
            },
          },
          label: {
            normal: {
              show: true,
              fontSize: 10,
            },
          },
          emphasis: {
            show: true,
            label: {
              color: 'rgba(255,255,255,1)',
            },
            itemStyle: {
              areaColor: '#16A984',
            },
          },

在这里插入图片描述

下面是完成代码,可以直接运行

import * as echarts from 'echarts'
import china from '@/assets/geo-json/china.json'

const data = [{
  name: '320000',
  value: 320000,
}, {
  name: '578',
  value: 578,
}, {
  name: '744',
  value: 744,
}, {
  name: '806',
  value: 806,
}, {
  name: '336',
  value: 336,
}, {
  name: '325',
  value: 325,
}, {
  name: '487',
  value: 487,
}, {
  name: '343',
  value: 343,
}, {
  name: '432',
  value: 432,
}, {
  name: '273',
  value: 273,
}, {
  name: '1055',
  value: 1055,
}, {
  name: '590',
  value: 590,
}, {
  name: '319',
  value: 319,
}, {
  name: '349',
  value: 349,
}, {
  name: '126',
  value: 126,
}, {
  name: '97',
  value: 97,
}, {
  name: '201',
  value: 201,
}, {
  name: '398',
  value: 398,
}, {
  name: '795',
  value: 795,
}, {
  name: '655',
  value: 655,
}, {
  name: '295',
  value: 295,
}, {
  name: '311',
  value: 311,
}, {
  name: '993',
  value: 993,
}, {
  name: '601',
  value: 601,
}, {
  name: '275',
  value: 275,
}, {
  name: '317',
  value: 317,
}, {
  name: '1000',
  value: 1000,
}, {
  name: '186',
  value: 186,
}, {
  name: '261',
  value: 261,
}, {
  name: '132',
  value: 132,
}, {
  name: '18',
  value: 18,
}, {
  name: '11',
  value: 11,
}]

const geoCoordMap = {
  320000: [116.46, 39.92],
  578: [121.29, 31.14],
  744: [117.2, 39.13],
  806: [106.32, 29.32],
  336: [126.41, 45.45],
  325: [125.19, 43.52],
  487: [123.24, 41.50],
  343: [111.48, 40.49],
  432: [114.28, 38.02],
  273: [112.34, 37.52],
  1055: [117, 36.38],
  590: [113.42, 34.48],
  319: [108.54, 34.16],
  349: [103.49, 36.03],
  126: [106.16, 38.20],
  97: [101.45, 36.38],
  201: [87.36, 43.48],
  398: [117.18, 31.51],
  795: [118.50, 32.02],
  655: [120.09, 30.14],
  295: [113, 28.11],
  311: [115.52, 28.41],
  993: [114.21, 30.37],
  601: [104.05, 30.39],
  275: [106.42, 26.35],
  317: [119.18, 26.05],
  1000: [113.15, 23.08],
  186: [110.20, 20.02],
  261: [108.20, 22.48],
  132: [102.41, 25],
  18: [91.10, 29.40],
  11: [114.10, 22.18],
}

const convertData = (data) => {
  const res = []
  for (let i = 0; i < data.length; i++) {
    const geoCoord = geoCoordMap[data[i].name]
    if (geoCoord) {
      res.push({
        name: data[i].name,
        value: geoCoord.concat(data[i].value),
      })
    }
  }
  return res
}

/**
 获取对应的json地图数据,然后向echarts注册该区域的地图,最后加载地图信息
 @params {String} mapData:json数据的地址
 @params {String} name: 地图名称
 */
const loadMap = (mapData, name) => {
  if (mapData) {
    echarts.registerMap(name, mapData)
    const option = {
      tooltip: {
        show: true,
        backgroundColor: 'rgba(13, 77, 61, 0.7)',
        textStyle: {
          color: '#FFF', // 文字的颜色
          fontStyle: 'normal',
          fontWeight: 'normal',
          fontSize: '12', // 文字字体大小
        },
        borderColor: 'rgba(13, 77, 61, 0.7)',
        enterable: true, // 鼠标可进入浮层内
        extraCssText: 'box-shadow: none',
        padding: 10,
        formatter: (params) => {
          if (params?.seriesType === 'effectScatter') {
            return ''
          }
          const res = `<div style="width:156px;height:120px;display: flex;flex-direction: column;">
                    <h3 style="margin: 5px 10px"> ${params?.name}</h3>
                    <div style="display:flex;flex-direction: column;flex: 1;justify-content: space-evenly;">
                      <div> <span style="margin: 0px 10px">使用单位:</span>2156家</div>
                      <div> <span style="margin: 0px 10px">在用电梯:</span>18万台</div>
                      <div> <span style="margin: 0px 10px">待检测电梯:</span>1526台</div>
                      <div> <span style="margin: 0px 10px">待检验电梯:</span>1409台</div>
                    </div>
                  </div>
              `
          return res
        },
      },
      geo: {
        map: name,
        roam: true,
        label: {
          normal: {
            show: true,
            textStyle: {
              fontSize: 10,
              color: '#000000',
            },
          },
        },
        itemStyle: {
          normal: {
            show: true,
            areaColor: '#C2F2E6',
            borderColor: 'rgba(255,255,255,1)',
            borderWidth: '1',
          },
        },
        emphasis: {
          show: true,
          label: {
            color: 'rgba(255,255,255,1)',
          },
          itemStyle: {
            areaColor: '#16A984',
          },
        },
      },
      series: [
        { // tipImage 是UI给的标记图,如果没有,可以打开我注释的部分代码运行查看
          type: 'scatter',
          coordinateSystem: 'geo',
          data: convertData(data),
          // symbolSize: 20,
          // symbol: 'path://M35.025,17.608c-5.209-4.786-11.483-2.301-15.303-4.281v-1.482c0-0.41-0.333-0.743-0.743-0.743c-0.411,0-0.743,0.333-0.743,0.743v24.682c-1.855,0.104-3.261,0.59-3.261,1.175c0,0.661,1.793,1.197,4.005,1.197c2.21,0,4.003-0.536,4.003-1.197c0-0.585-1.405-1.071-3.261-1.175V26.151C24.575,24.573,28.408,17.166,35.025,17.608z',
          // symbolRotate: 0,
          symbolOffset: ['50%', '-100%'],
          // label: { // label 是在标记下方展示当前数据,不需要展示数据 false
          //   normal: {
          //     formatter: '{b}',
          //     position: 'top',
          //     show: false,
          //     textStyle: {
          //       color: '#ffffff',
          //       fontSize: 10,
          //     },
          //   },
          //   emphasis: {
          //     show: false,
          //   },
          // },
          symbolSize: [40, 24],
          // 自定义图片的 路径
          symbol: `image://${tipImage}`,
          label: {
            show: false,
          },
          itemStyle: {
            normal: {
              color: '#F06C00',
            },
          },
        },
        {
          name: 'MAP',
          type: 'map',
          geoIndex: 0,
          roam: true, // 是否可缩放
          zoom: 1.1,
          mapType: name,
          selectedMode: 'false', // 是否允许选中多个区域
          data: [{
            name: '北京',
            value: 2256
        }, {
            name: '天津',
            value: 744
        }, {
            name: '上海',
            value: 578
        }, {
            name: '重庆',
            value: 806
        }, {
            name: '河北',
            value: 432
        }, {
            name: '河南',
            value: 590
        }, {
            name: '云南',
            value: 132
        }, {
            name: '辽宁',
            value: 487
        }, {
            name: '黑龙江',
            value: 336
        }, {
            name: '湖南',
            value: 295
        }, {
            name: '安徽',
            value: 398
        }, {
            name: '山东',
            value: 1055
        }, {
            name: '新疆',
            value: 201
        }, {
            name: '江苏',
            value: 795
        }, {
            name: '浙江',
            value: 655
        }, {
            name: '江西',
            value: 311
        }, {
            name: '湖北',
            value: 993
        }, {
            name: '广西',
            value: 261
        }, {
            name: '甘肃',
            value: 349
        }, {
            name: '山西',
            value: 273
        }, {
            name: '内蒙古',
            value: 343
        }, {
            name: '陕西',
            value: 319
        }, {
            name: '吉林',
            value: 325
        }, {
            name: '福建',
            value: 317
        }, {
            name: '贵州',
            value: 275
        }, {
            name: '广东',
            value: 1000
        }, {
            name: '青海',
            value: 97
        }, {
            name: '西藏',
            value: 18
        }, {
            name: '四川',
            value: 601
        }, {
            name: '宁夏',
            value: 126
        }, {
            name: '海南',
            value: 186
        }, {
            name: '台湾',
            value: 0
        }, {
            name: '香港',
            value: 11
        }, {
            name: '澳门',
            value: 0
        }]
        }],
    }
    const myChart = echarts.init(chartRef.value)
    myChart.setOption(option, true)
  } else {
    Message.warning('无法加载该地图')
  }
}

onMounted(() => {
  loadMap(china, 'china') // 初始化全国地图
})

与地图的交互

地图的下点击钻
地图的自适应

  • 根据浏览器窗口变化自适应
window.addEventListener('resize', () => {
      myChart.resize()
})
  • 点击从国家级 -> 省级 -> 市 -> 县(区)
  • 下钻的多少取决于你的数据
  • 比如我下钻到苏州省 - 南京市 - 玄武区

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

myChart.on('click', ({ data }) => {
    if (data) {
       const { value, jsonData, name } = data
       // 这个 jsonData 跟 china的数据一样的 JSON 数据结构
       loadMap(jsonData, name) // 动态加载每个地区的数据
     } else {
        Message.warning('暂无该区域数据')
     }
})

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

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

相关文章

免费在线真好用的思维脑图

大家好这里是tony4geek 。 今天给大家介绍一个工具。思维脑图生成器。最近写文章需要用到思维脑图&#xff0c;如果手上没有xmind 这种类工具是挺麻烦的。下载xmind 还得破解注册很费时间。 看看有没有在线生成的&#xff0c;找了好久没有找到合适的&#xff0c;最后在国外一…

鱼哥赠书活动第②期:《AWD特训营:技术解析、赛题实战与竞赛技巧》《ATTCK视角下的红蓝对抗实战指南》《智能汽车网络安全权威指南》上下册

鱼哥赠书活动第①期&#xff1a; 《AWD特训营&#xff1a;技术解析、赛题实战与竞赛技巧》1.1介绍&#xff1a; 《ATT&CK视角下的红蓝对抗实战指南》1.1介绍&#xff1a; 《Kali Linux高级渗透测试》1.1介绍&#xff1a; 《智能汽车网络安全权威指南》上册1.1介绍&#xff…

外汇天眼:Bitcore与Amtop Markets Ltd──诓称数据分析操盘稳赚不赔,指控账户违法逼缴校验金

近几年网络投资风气盛行&#xff0c;但市面上充斥许多诈骗平台&#xff0c;透过保证获利、稳赚不赔等话术诱导民众投资&#xff0c;如今已成为社会不可忽视的严重威胁。 日前&#xff0c;外汇天眼就收到一位受害者爆料&#xff0c;分享她遭到Bitcore假交友诈骗的详细经过。 一开…

Mysql5.7大限将至升级Mysql 8.0过程记录(未完)

一、前言 时间很快&#xff0c;到2023年10月底&#xff0c;MySQL 5.7就到了它的EOL&#xff08;End of Life&#xff09;&#xff0c;届时将不会提供任何补丁&#xff0c;无法应对潜在的安全风险&#xff1b;是时候和 MySQL 5.7 说再见了&#xff01;&#xff01;&#xff01;&…

系统架构师2023备考新版教材-之计算机系统知识01

说明 本篇博客主要围绕2022年系统架构师最新版教程&#xff0c;算上时间&#xff0c;今年应该是这一版教材的第一次考试&#xff0c;说来也气人&#xff0c;一年考一次&#xff0c;然后我毅然就直接报名了&#xff0c;报名之前还不知道教程已经改版了&#xff0c;到近期刷题的…

2023年终旺季正式拉开帷幕,赛盈分销盘点亚马逊秋季Prime Day热销款式!

2023年终旺季正式拉开帷幕&#xff0c;卖家已陆续进入亚马逊秋季prime day、万圣节、圣诞节等各大假日促销的冲刺阶段。 和往年相比&#xff0c;今年的美国消费者将会在假日促销期间增加支出。海外权威机构Deloitte研究表明&#xff0c;11月份开始到次年1月份美国年终旺季线上销…

【WOFOST和PCSE】如何运用模型进行科学研究,如何设置实验和模拟,以及如何解释和分析模型结果

WOFOST&#xff08;WorldFoodStudies&#xff09;和PCSE&#xff08;PythonCropSimulationEnvironment&#xff09;是两个用于农业生产模拟的模型&#xff1a;WOFOST是一个经过多年开发和验证的模型&#xff0c;被广泛用于全球的农业生产模拟和农业政策分析&#xff1b;采用了模…

智能文件夹改名助手,秒级恢复原始文件夹名称,避免繁琐操作!

文件夹改名是我们在整理和管理文件时经常遇到的任务之一。但有时候&#xff0c;在改名的过程中&#xff0c;我们可能会因为操作失误或其他原因而需要恢复回原来的文件夹名称。为了帮助您避免繁琐的操作&#xff0c;我们为您提供了一款智能文件夹改名助手&#xff0c;让您能够在…

【TensorFlow2 之014】在 TF 2.0 中实现 LeNet-5

一、说明 在这篇文章中&#xff0c;我们将展示如何在 TensorFlow 中实现像 \(LeNet-5\) 这样的基础卷积神经网络。LeNet-5 架构由 Yann LeCun 于 1998 年发明&#xff0c;是第一个卷积神经网络。 数据黑客变种rs 深度学习 机器学习 TensorFlow 2020 年 2 月 29 日 | 0 …

JavaScript(上)

1.JavaScript概述 JavaScript 是一种客户端脚本语言。运行在客户端浏览器中&#xff0c;每一个浏览器都具备解析 JavaScript 的引擎 脚本语言&#xff1a;不需要编译&#xff0c;就可以被浏览器直接解析执行了 核心功能就是增强用户和 HTML 页面的交互过程&#xff0c;让页面…

400电话怎么办理

400电话&#xff0c;又称为全国统一客服热线电话&#xff0c;是一种企业或机构为了提供更便捷的客户服务而开通的电话号码。通过拨打400电话&#xff0c;客户可以免费或按照本地市话费率与企业或机构进行沟通&#xff0c;解决问题或获得相关服务。下面将介绍400电话的办理流程和…

企业集中式日志管理解决方案

集中式日志记录解决方案收集日志并统一来自各种网络设备&#xff08;如服务器、防火墙、路由器、工作站&#xff09;、应用程序&#xff08;如IIS、Apache、DHCP&#xff09;、入侵检测系统等的数据。该解决方案在中央控制台中显示日志&#xff0c;使其易于访问&#xff0c;日志…

【若依】定时任务问题:关闭了定时任务,但是依然在跑,且同一时刻跑了多条记录,为什么?

文章目录 问题1描述&#xff1a;原因:办法&#xff1a; 问题2描述&#xff1a;原因&#xff1a;办法&#xff1a; 问题1 描述&#xff1a; 定时任务关闭了&#xff0c; 但是服务器定时任务依然在跑 原因: 若依自带定时任务有缓存&#xff0c;且缓存是服务器内存&#xff0c…

布隆过滤器的优缺点及哈希切割问题

文章目录 1.布隆过滤器优点2.布隆过滤器缺陷3.哈希切割 1.布隆过滤器优点 增加和查询元素的时间复杂度为:O(K)(K为哈希函数的个数&#xff0c;一般较小)&#xff0c;与数据量大小无关哈希函数相互之间没有关系&#xff0c;方便硬件并行运算布隆过滤器不需要存储元素本身&#…

Stable Diffusion XL搭建

本文参考&#xff1a;Stable Diffusion XL1.0正式发布了&#xff0c;赶紧来尝鲜吧-云海天教程 Stable Diffision最新模型SDXL 1.0使用全教程 - 知乎 1、SDXL与SD的区别 &#xff08;1&#xff09;分辨率得到了提升 原先使用SD生成图片&#xff0c;一般都是生成512*512&…

软件测试工程师简历项目经验怎么写?--1000个已成功入职的软件测试工程师简历范文模板(含真实简历)

一、前言&#xff1a;浅谈面试 ​ 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试&#xff0c;得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里…

【牛客面试必刷TOP101】Day11.BM63 跳台阶和 BM67 不同路径的数目(一)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

SpringSecurity + jwt + vue2 实现权限管理 , 前端Cookie.set() 设置jwt token无效问题(已解决)

问题描述 今天也是日常写程序的一天 , 还是那个熟悉的IDEA , 还是那个熟悉的Chrome浏览器 , 还是那个熟悉的网站 , 当我准备登录系统进行登录的时候 , 发现会直接重定向到登录页 , 后端也没有报错 , 前端也没有报错 , 于是我得脸上又多了一张痛苦面具 , 紧接着在前端疯狂debug…

WPF中prism模块化

1、参照&#xff08;wpf中prism框架切换页面-CSDN博客&#xff09;文中配置MainView和MainViewModel 2、模块其实就是引用类库&#xff0c;新建两个类库ModuleA ModuleB&#xff0c;修改输出类型为类库,并配置以下文件&#xff1a; ModuleA ModuleAProfile ModuleB Module…

用位运算实现加减乘除法

我们知道计算机只认识0和1&#xff0c;而计算机在计算加减乘除的是也不是我们理解的直接预算&#xff0c;而是通过逻辑运算来实现的&#xff0c;也就是与、非、或、异或&#xff0c;下面就通过这些逻辑运算符来实现加减乘除法 加法&#xff1a;比如11用二进制表示就是00000001…