vue中使用echarts实现省市地图绘制,根据数据显示不同区域颜色,点击省市切换,根据经纬度打点

news2024/11/25 7:10:56
一、实现效果
  • 使用echarts实现省市地图绘制
  • 根据数据不同显示不同区域颜色
  • 实现省市地图点击切换效果
  • 实现地图上根据经纬度打点
二、实现方法
1、安装echarts插件
npm install echarts --save
2、获取省市json数据

https://datav.aliyun.com/portal/school/atlas/area_selector

通过 阿里旗下的高德地图提供的api ,可以获取到中国各个省份/区级/县级的json数据,但是区级和县级,并没有包含街道和乡镇的数据。

3、地图经纬度数据

经度和纬度常合称为经纬度,把地球球面上的经纬度显示在平面地图上需要采用某种地图投影。
与之相关的地理坐标系一般是指由经度、纬度和相对高度组成的坐标系,能够标示地球上的任何一个位置。

http://jingweidu.757dy.com/

4、本例中data 数据

本文以吉林省地图为例,来实现吉林省及所有市的切换效果。

在这里插入图片描述

<template>
  <div class="center-body">
      <div class="map" id="map"></div>
      <div class="rest-button" v-if="showButton" @click="reChinaMap()">返回吉林省</div>
  </div>
</template>

导入插件

import * as echarts from "echarts";

准备数据

export default {
  data() {
      return {
          showButton: true,//是否显示返回按钮
          currentCity: "",//当前城市
          // 市json数据名称
          province: {
              "长春市": "changchunshi",
              "吉林市": "jilinshi",
              "通化市": "tonghuashi",
              "四平市": "sipingshi",
              "白山市": "baishanshi",
              "辽源市": "liaoyuanshi",
              "白城市": "baichengshi",
              "延边朝鲜族自治州": "yanbianchaoxianzuzizhiqu",
              "松原市": "songyuanshi"
          },
      };
  },
}
5、视觉映射组件
visualMap: { // 视觉映射组件
  type: 'piecewise',
  show: true,
  bottom: '2%',
  left: '2%',
  textStyle: {
      fontsize: 12
  },
  pieces: [{
      gt: 600,
      lte: 1000,
      label: '600-1000个'
  },
  {
      gt: 400,
      lte: 600,
      label: '400-600个'
  },
  {
      gt: 200,
      lte: 400,
      label: '200-400个'
  },
  {
      gt: 0,
      lte: 200,
      label: '0-200个'
  },
  ],
  color: ['#F56C6C', '#E6A23C', '#67C23A', '#409EFF'], //自定义范围的颜色
},
6、标记的图形
markPoint: {
  /**
   * 标记的图形,标记类型包括:'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
   * 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。
   */
  symbol: 'circle',
  //标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,例如 [20, 10] 表示标记宽为20,高为10。
  symbolSize: 6, 
  //文字标签
  label: {
      show: false, //是否显示标签
      position: 'top',//标签的位置
      color: '#ffffff', //文字的颜色
      fontSize: 12 //文字的字体大小
  },
  //标注的样式
  itemStyle: {
      opacity: 0.8,//图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。
      color: '#ffffff' //图形的颜色。支持使用rgb(255,255,255),rgba(255,255,255,1),#fff等方式设置为纯色,也支持设置为渐变色和纹理填充。
  },
  silent: true,//图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。
  /**
   * 标注的数据数组。每个数组项是一个对象:{ name: '舒兰市', coord: [126.97170, 44.41223], value: '78', symbolSize: 10, },
   * name 标注名称
   * coord 数据在相应坐标系上的坐标位置 经纬度值
   * value 标注值,可以不设。
   * symbolSize 标记的大小,可以单独设置每个标记的大小
   */
  data: markData
},
7、地图渲染
series: [{
  type: 'map',
  map: name,
  zoom: 1.2,
  top: '10%',
  x: 'center',
  label: {
      show: true,
      color: '#770928'
  },
  itemStyle: {
      normal: { // 静态的时候显示的默认样式
          borderWidth: 1, // 边框宽度
          areaColor: '#C0C4CC', // 地图颜色
          borderColor: '#ffffff' // 边框颜色
      },
      emphasis: { // 鼠标移入动态的时候显示的默认样式
          borderWidth: 2, // 边框宽度
          areaColor: '#909399' // 地图颜色
      }
  },
}],
8、点击切换市地图
myChart.on('click', e => {
  this.darwProvniceMap(e)
})

// 切换市
darwProvniceMap(val) {
  this.currentCity = val.name
  if (this.province[val.name]) {
      let json = require(`@/json/${this.province[val.name]}.json`)
      this.drawMap(this.province[val.name], json)
      this.showButton = true
  }
},
9、实例代码已上传,去顶部可下载

附全部代码

<template>
  <div class="center-body">
      <div class="map" id="map"></div>
      <div class="rest-button" v-if="showButton" @click="reChinaMap()">返回吉林省</div>
  </div>
</template>

<script>
import * as echarts from "echarts";
export default {
  data() {
      return {
          showButton: true,//是否显示返回按钮
          currentCity: "",//当前城市
          // 市json数据名称
          province: {
              "长春市": "changchunshi",
              "吉林市": "jilinshi",
              "通化市": "tonghuashi",
              "四平市": "sipingshi",
              "白山市": "baishanshi",
              "辽源市": "liaoyuanshi",
              "白城市": "baichengshi",
              "延边朝鲜族自治州": "yanbianchaoxianzuzizhiqu",
              "松原市": "songyuanshi"
          },
          //地图展示数据
          mapData: [
              {
                  name: '长春市',
                  value: '92',
                  mapArea: [
                      { name: '南关区', value: '50' },
                      { name: '宽城区', value: '100'},
                      { name: '朝阳区', value: '150' },
                      { name: '二道区', value: '200'},
                      { name: '绿园区', value: '300' },
                      { name: '双阳区', value: '400'},
                      { name: '九台区', value: '500' },
                      { name: '农安县', value: '600'},
                      { name: '榆树市', value: '700'},
                      { name: '德惠市', value: '800'},
                      { name: '公主岭市', value: '900'},
                  ],
                  markPoints: [
                      { name: '宽城区', coord: [125.33329, 44.10415]},
                      { name: '二道区', coord: [125.62065, 43.87264]},
                      { name: '双阳区', coord: [125.67145, 43.53109]},
                      { name: '九台区', coord: [125.86288, 44.21006]},
                      { name: '农安县', coord: [125.03372, 44.43899]},
                      { name: '榆树市', coord: [126.59487, 44.93444]},
                      { name: '德惠市', coord: [125.83678, 44.60390]},
                      { name: '公主岭市', coord: [124.66729, 43.84164]},
                  ]
              },
              {
                  name: '吉林市',
                  value: '963',
                  mapArea: [
                      { name: '舒兰市', value: '100' },
                      { name: '永吉县', value: '200' },
                      { name: '龙潭区', value: '300' },
                      { name: '丰满区', value: '400' },
                      { name: '船营区', value: '500' },
                      { name: '昌邑区', value: '600' },
                      { name: '磐石市', value: '700' },
                      { name: '蛟河市', value: '800' },
                      { name: '桦甸市', value: '900' },
                  ],
                  markPoints: [
                      { name: '舒兰市', coord: [127.14763, 44.34747]},
                      { name: '永吉县', coord: [126.24366, 43.58495]},
                      { name: '龙潭区', coord: [126.63733, 44.02580]},
                      { name: '丰满区', coord: [126.70059, 43.67911]},
                      { name: '船营区', coord: [126.30294, 43.83106]},
                      { name: '昌邑区', coord: [126.25877, 44.02708]},
                      { name: '磐石市', coord: [126.15245, 43.10234]},
                      { name: '蛟河市', coord: [127.35148, 43.73000]},
                      { name: '桦甸市', coord: [126.93714, 43.09717]},
                  ]
              },
              {
                  name: '通化市',
                  value: '125'
              },
              {
                  name: '四平市',
                  value: '536'
              },
              {
                  name: '白山市',
                  value: '86'
              },
              {
                  name: '辽源市',
                  value: '60'
              },
              {
                  name: '白城市',
                  value: '31'
              },
              {
                  name: '延边朝鲜族自治州',
                  value: '196'
              },
              {
                  name: '松原市',
                  value: '380'
              }
          ]
      };
  },
  created() {
      
  },
  mounted() {
      this.reChinaMap()
  },
  methods: {
      drawMap(name, json) {
          // 判断地图是否渲染
          let myChart = echarts.getInstanceByDom(document.getElementById("map"))
          // 如果渲染则清空地图 
          if (myChart != null) {
              myChart.dispose()
          }
          // 初始化地图
          myChart = echarts.init(document.getElementById("map"));
          if (!json) {
              json = require("@/json/jilin.json");
              this.showButton = false
          }

          echarts.registerMap(name, json)

          let currentCity = this.currentCity
          let seriesData = []
          let markData = []
          if (currentCity) {
              let tempData = this.mapData.filter(x => x.name == currentCity)
              seriesData = tempData[0]?.mapArea
          } else {
              seriesData = this.mapData
              this.mapData.forEach(x => {
                  if (x.markPoints) {
                      markData.push(...x.markPoints)
                  }
              })
          }
          var option = {
              visualMap: { // 视觉映射组件
                  type: 'piecewise',
                  show: true,
                  bottom: '2%',
                  left: '2%',
                  textStyle: {
                      fontsize: 12
                  },
                  pieces: [{
                      gt: 600,
                      lte: 1000,
                      label: '600-1000个'
                  },
                  {
                      gt: 400,
                      lte: 600,
                      label: '400-600个'
                  },
                  {
                      gt: 200,
                      lte: 400,
                      label: '200-400个'
                  },
                  {
                      gt: 0,
                      lte: 200,
                      label: '0-200个'
                  },
                  ],
                  color: ['#F56C6C', '#E6A23C', '#67C23A', '#409EFF'], //自定义范围的颜色
              },
              tooltip: { // 悬浮框
                  trigger: 'item', // 触发条件
                  backgroundColor: 'RGBA(136, 123, 135, 0.8)',
                  formatter: '{b}<br/>占用数:{c}个', // 自定义显示数据
                  textStyle: {
                      color: '#ffffff'
                  }
              },
              series: [{
                  type: 'map',
                  map: name,
                  zoom: 1.2,
                  top: '10%',
                  x: 'center',
                  label: {
                      show: true,
                      color: '#770928'
                  },
                  itemStyle: {
                      normal: { // 静态的时候显示的默认样式
                          borderWidth: 1, // 边框宽度
                          areaColor: '#C0C4CC', // 地图颜色
                          borderColor: '#ffffff' // 边框颜色
                      },
                      emphasis: { // 鼠标移入动态的时候显示的默认样式
                          borderWidth: 2, // 边框宽度
                          areaColor: '#909399' // 地图颜色
                      }
                  },
                  markPoint: {
                      /**
                       * 标记的图形,标记类型包括:'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
                       * 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。
                       */
                      symbol: 'circle',
                      //标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,例如 [20, 10] 表示标记宽为20,高为10。
                      symbolSize: 6, 
                      //文字标签
                      label: {
                          show: false, //是否显示标签
                          position: 'top',//标签的位置
                          color: '#ffffff', //文字的颜色
                          fontSize: 12 //文字的字体大小
                      },
                      //标注的样式
                      itemStyle: {
                          opacity: 0.8,//图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。
                          color: '#ffffff' //图形的颜色。支持使用rgb(255,255,255),rgba(255,255,255,1),#fff等方式设置为纯色,也支持设置为渐变色和纹理填充。
                      },
                      silent: true,//图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。
                      /**
                       * 标注的数据数组。每个数组项是一个对象:{ name: '舒兰市', coord: [126.97170, 44.41223], value: '78', symbolSize: 10, },
                       * name 标注名称
                       * coord 数据在相应坐标系上的坐标位置 经纬度值
                       * value 标注值,可以不设。
                       * symbolSize 标记的大小,可以单独设置每个标记的大小
                       */
                      data: markData
                  },
                  // 数据
                  data: seriesData
              }],
          }
          myChart.setOption(option)

          myChart.on('click', e => {
              this.darwProvniceMap(e)
          })
          window.addEventListener("resize", () => {
              myChart.resize()
          })
      },
      // 切换市
      darwProvniceMap(val) {
          this.currentCity = val.name
          if (this.province[val.name]) {
              let json = require(`@/json/${this.province[val.name]}.json`)
              this.drawMap(this.province[val.name], json)
              this.showButton = true
          }
      },
      // 返回吉林省
      reChinaMap() {
          this.currentCity = ""
          this.drawMap('jilin')
      }
  },
}
</script>

<style scoped>
.rest-button {
  position: absolute;
  right: 20px;
  bottom: 20px;
  z-index: 999;
  border-radius: 6px;
  font-size: 14px;
  border: 1px #770928 solid;
  color: #770928;
  height: 30px;
  line-height: 28px;
  padding: 0 20px;
  overflow: hidden;
  box-sizing: border-box;
  cursor: pointer;
}

.map,
.center-body {
  width: 800px;
  height: 600px;
  position: relative;
}
</style>
10、效果图

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

vue 表单重置功能

1、标签加上ref属性&#xff0c;名称自定义 <el-form ref"searchForm"></el-form>2、表单项标签添加prop属性&#xff0c;prop属性需要与input框绑定v-model的属性一致 <el-form-item label"名称" prop"name"><el-input …

大数据的技术运用:探索未来的无限可能性

随着科技的不断进步和社会信息的快速增长&#xff0c;大数据已成为一个热门话题。本文将探讨大数据技术在多个领域的应用&#xff0c;以及它对未来的影响和无限可能性。 导言 在过去的几十年里&#xff0c;大数据技术取得了惊人的发展&#xff0c;它不仅改变了企业的经营方式&a…

ArcGIS Maps SDK for JS:监听图层的visible属性

文章目录 1 问题描述2 解决方案3 拓展 1 问题描述 近期有这么一个需求。在 ArcGIS Maps SDK for JavaScript 中&#xff0c;使用图层的visible属性同步显示某个组件&#xff0c;即打开图层时显示组件&#xff0c;关闭图层时隐藏组件。 首先想到的是&#xff0c;通过点击图层列…

走进ERP管理系统:企业信息化的加速器

走进ERP管理系统&#xff1a;企业信息化的加速器 企业信息化已成为企业提高效率、降低成本、优化资源配置的重要手段。ERP管理系统作为企业信息化的重要组成部分&#xff0c;已经成为了越来越多企业的必备工具。本文将带您走进ERP管理系统&#xff0c;探讨其优势、应用场景以及…

蓝桥杯 大小写转换

islower/isupper函数 islower和issupper是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母 需要头文件< cctype>,也可用万能头包含 函数的返回值为bool类型 char ch1A; char ch2b; //使用islower函数判断字符是否为小写字母 if(islower(…

揭示高防CDN的局限性与探讨其小众化原因

在网络安全领域&#xff0c;高防CDN&#xff08;高防御内容分发网络&#xff09;被认为是保护网站免受恶意攻击的强大工具&#xff0c;然而&#xff0c;尽管其在防护方面表现卓越&#xff0c;高防CDN在广泛应用中仍然相对小众。本文将从高防CDN的局限性出发&#xff0c;深入探讨…

仅需三行代码! C# 快速实现PDF转PPT

一般在会议、教学或培训活动中&#xff0c;我们都会选择PPT文档来进行内容展示。与PDF文档相比&#xff0c;PPT文档具有较强的可编辑性&#xff0c;可以随时增删元素&#xff0c;并且还可以设置丰富多样的动画效果来吸引观众注意。那么如何通过C#将PDF文档转为PPT文档呢&#x…

Looker Studio | 带来强大的探索、更新鲜的数据和更快的过滤

【信息来源 Google Cloud。Cloud Ace 是 Google Cloud 全球战略合作伙伴。】 Looker Studio 支持对临时数据进行自助分析&#xff0c;并与 Looker 一起为每月访问 Looker 系列产品的超过 1000 万用户做出贡献。今天&#xff0c;谷歌云为分析师推出新方法&#xff0c;为业务用户…

spark的资源调度与任务调度

blockManager 资源调度与任务调度

有什么好用的后勤管理软件?学校后勤服务要怎么提升满意度?

后勤服务是院校管理中的重要一环&#xff0c;直接影响到师生的工作、学习和生活质量。师生作为学校的核心用户&#xff0c;对后勤服务的质量和满意度有着深刻的体验和感受。因此&#xff0c;他们的评价对于提升学校品牌形象、提高服务质量以及改进学校管理具有至关重要的作用。…

Java 中的全部锁

目录 一. 前言 二. 乐观锁 VS 悲观锁 三. 自旋锁 VS 适应性自旋锁 四. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁 五. 公平锁 VS 非公平锁 六. 可重入锁 VS 非可重入锁 七. 独享锁&#xff08;排他锁&#xff09; VS 共享锁 八. 总结 一. 前言 Java提供了种类丰富的锁&a…

工业镜头中的普通(FA)工业镜头特点

普通&#xff08;FA&#xff09;工业镜头特点 焦距大小的影响情况&#xff1a; 焦距越小&#xff0c;景深越大&#xff1b; 焦距越小&#xff0c;畸变越大&#xff1b; 焦距越小&#xff0c;渐晕现象越严重&#xff0c;使像差边缘的照度降低。 光圈大小的影响情况&#xff1a;…

【技术分享】EIGRP stub实验

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 拓扑图&#xff1a; R1配置&#xff1a; route…

易点易动固定资产管理系统场景应用一:集成ERP/财务系统

在企业的日常运营中&#xff0c;固定资产管理是一个重要而繁琐的任务。传统的手工管理方式往往效率低下且容易出错&#xff0c;给企业带来不必要的成本和风险。为了解决这一问题&#xff0c;易点易动固定资产管理系统应运而生。本文将重点介绍易点易动固定资产管理系统在集成ER…

别再吐槽大学教材了,来看看这些网友强推的数学神作!

前言 关于大学数学教材的吐槽似乎从来没停止过。有人慨叹&#xff1a;数学教材晦涩难懂。错&#xff01;难懂&#xff0c;起码还可以读懂。数学教材你根本读不懂&#xff1b;也有人说&#xff1a;数学教材简直就是天书。 数学教材有好有坏&#xff0c;这话不假&#xff0c;但更…

JS-项目实战-鼠标悬浮设置字体颜色以及控制键盘输入

1、fruit.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格的所有的行&a…

会议动态 | 浙江省水泥行业高质量发展暨碳达峰推进会成功召开

2023年11月9日&#xff0c;由浙江省水泥协会和百年建筑网主办的“2023年浙江省水泥行业高质量发展暨碳达峰推进会”在浙江杭州成功召开。 水泥生产企业、环保企业、智能装备企业、研究机构等水泥产业上下游重点企业和行业知名专家领导近400人出席了本次会议。 参会代表围绕《浙…

在Pycharm不同项目中使用同一环境

一、打开代码1&#xff08;理想环境&#xff09; 查看环境所在地址。 二、打开另一个项目

淘宝商家私信脚本,自动批量阿里旺旺版,按键精灵源码分享

在UI界面设置话术后用#号分割多条&#xff0c;然后启动就会自动给搜素下面的商家发送指定消息的私信&#xff0c;脚本代码和UI界面代码我下面会分享出来&#xff0c;自己粘贴就可以用。 UI界面&#xff1a; UI界面代码&#xff1a; 界面1: { 请在下面设置话术: { 输入框: …

【机器学习基础】对数几率回归(logistic回归)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…