用 echarts 开发地图、点击展示自定义信息框

news2024/11/15 23:35:28

1、下载所需地市的json   链接:DataV.GeoAtlas地理小工具系列 

      在右侧输入需要的名称,然后下载json文件到本地

2、在html 中准备容器,并设置宽高

<div id="mapContent">

    <div ref="mapChart" style="width:100%;height:100%;margin-bottom: 0" />

</div>

#mapContent {

  width: 100%;

  height: 100%;

}

3、导入echarts 和 json 文件

import * as echarts from 'echarts'

import json_150000 from '@/static/neimenggu/county/150000.json'

4、处理数据

//data 数据 

data() {

    return {

      charts: null,

      mapjson: json_150000,

      codeToJson: {

        '150000': json_150000

      },

     mapOptions:{},

      cityName: {

        呼和浩特市: {

             value: '',

             jcz: '',

             kc: '',

             fwz: ''

        },

        ...................

    

      },

     cityCodeAndName:{

           '150100000000' :'呼和浩特市',

           '150700000000' :'呼伦贝尔市',

            '150200000000' :'包头市',

             ...................................

    }

}

5、初始化方法

   initEcharts(areaCode) {

      const name = 'json_' + areaCode

      const cityName = this.cityName

      const mapjson = this.codeToJson[areaCode]

      if (this.charts) {

        this.charts.clear()

      } else {

        this.charts = echarts.init(this.$refs.mapChart)

      }

      const top = 28

      const zoom = 1.2 //地图缩放层级(控制地图大小)

      const option = {

        backgroundColor: 'rgba(0,0,0,0)',

        tooltip: {

          show: false

        },

        legend: {

          show: false

        },

        grid: {

          height: '100%'

        },

        geo: {

          map: name,

          roam: false,

          selectedMode: false, // 是否允许选中多个区域

          zoom: zoom,

          top: top,

          show: false

        },

        series: [

          {

            name: 'MAP',

            type: 'map',

            map: name,

            label: {

              show: false,

              color: '#fff'

            },

            showLegendSymbol: false,

            data: [],

            selectedMode: 'single', // 是否允许选中多个区域

            zoom: zoom,

            geoIndex: 1,

            top: top,

            tooltip: {

              show: true,

              formatter: function(params) {

                return params.name + '(' + cityName[params.name].value + ')'

              }, //内容

              backgroundColor: 'rgba(0,0,0,.6)', //提示框样式

              borderColor: 'rgba(147, 235, 248, .8)',

              textStyle: {

                color: '#FFF'

              },

              triggerOn: 'click'

            },

            emphasis: {

              //划过区域时,样式设置

              label: {

                show: false //是否显示区域名称(在面积中)

              },

              itemStyle: {

                areaColor: '#389BB7', //区域的面积颜色

                borderWidth: 1 //区域边框

              }

            },

            select: {

              disabled: true

            },

            //区域样式设置

            itemStyle: {

              borderColor: '#2084bc',

              borderWidth: 2,

              areaColor: {

                type: 'radial',

                x: 0.5,

                y: 0.5,

                r: 0.8,

                colorStops: [

                  {

                    offset: 0,

                    color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色

                  },

                  {

                    offset: 1,

                    color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色

                  }

                ],

                globalCoord: false // 缺为 false

              },

              shadowOffsetX: -2,

              shadowOffsetY: 2,

              shadowBlur: 10

            }

          }

        ]

      }

      this.mapOptions = option

      echarts.registerMap(name, mapjson)

      //处理数据

      const jsonData = this.getGeoCoordMap(mapjson)

      this.mapOptions.series[0].data = jsonData

      const that = this

      //给区域添加点击事件

      this.charts.on('click', function(params) {

        //先移除上个标签

        const popDiv = document.getElementById('popup')

        if (popDiv) {

          document.getElementById('mapContent').removeChild(popDiv)

        }

        // 自定义弹框

        var popup = document.createElement('div')

        popup.id = 'popup'

        popup.style.position = 'absolute'

        popup.style.left = params.event.event.clientX - 90 + 'px'

        popup.style.top = params.event.offsetY - 120 + 'px'

        popup.style.backgroundColor = '#22312f'

        popup.style.zIndex = 999

        popup.style.padding = '0 20px'

        popup.style.borderRadius = '10px'

        popup.innerHTML =

          '<div id="nmgInfoWindow">' +

          '<div class="title">' +

          params.data.name +

          '详情<i class="el-icon-close closebt" id = "closeBtn"></i></div>' +

          '<div class="items"> <span style="color:#62b2bc;">项目一</span><span>' +

          '<span style="color:#62b2bc;">' +

          cityName[params.data.name].jcz +

          '</span>' +

          '<i class="el-icon-arrow-right toDetail" style="color:#62b2bc;"></i></span>' +

          '</div>' +

          '<div class="items"> <span style="color:#62b2bc;">项目二</span><span>' +

          '<span style="color:#62b2bc;">' +

          cityName[params.data.name].kc +

          '</span>' +

          '<i class="el-icon-arrow-right toDetail" style="color:#62b2bc;"></i></span>' +

          '</div>' +

          '<div class="items"> <span style="color:#62b2bc;">项目三</span><span>' +

          '<span style="color:#62b2bc;">' +

          cityName[params.data.name].fwz +

          '</span>' +

          '<i class="el-icon-arrow-right toDetail " style="color:#62b2bc;"></i></span>' +

          '</div>' +

          '</div>'

        //添加到页面上

        document.getElementById('mapContent').appendChild(popup)

        //给自定义弹框中添加关闭事件

        const closeButton = document.querySelector('#closeBtn')

        closeButton.addEventListener('click', function() {

          const popDiv = document.getElementById('popup')

          if (popDiv) {

            document.getElementById('mapContent').removeChild(popDiv)

          }

        })

        //给自定义弹框中的按钮跳转事件

        const detailButton = document.querySelectorAll('.toDetail')

        detailButton.forEach((item, index) => {

          item.addEventListener('click', function() {

             console.log('点击事件',that)

          })

        })

      })

      this.charts.setOption(option)

    },

 getGeoCoordMap(mapjson) {

      const mapFeatures = mapjson.features

      const cityCenter = {}

      mapFeatures.map((item) => {

        cityCenter[item.properties.name] = item.properties.centroid || item.properties.center || []

      })

      const newData = []

      mapFeatures.map((item) => {

        if (cityCenter[item.properties.name]) {

          newData.push({

            name: item.properties.name,

            value: cityCenter[item.properties.name],

            adcode: item.properties.adcode

          })

        }

      })

      return newData

    }

6、结果

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

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

相关文章

全网详解LVS的四种工作模式及案例

目录 LVS&#xff08;Linux virual server&#xff09; 一、集群和分布式的简介 二、LVS的运行原理 1、LVS简介 2、LVS 相关术语 3、LVS的集群类型 三、LVS-NAT工作模式 部署NAT工作模式案例&#xff1a; 1、实验环境 2、实验环境说明 3、配置 四、LVS-DR工作模式 …

Http:八股

1、Https加密方式 1.1Https通过 摘要算法保证数据的完整性&#xff0c; 1、服务器将公钥注册到CA&#xff0c; CA用自己的私钥给 服务器的公钥进行数字签名。 2、客户端拿到服务器证书后&#xff0c;用CA的公钥确认数字证书的真实性。 3、获取服务器的公钥&#xff0c;使用它对…

SpringBoot Actuator

对应用进行观测,监控,预警 健康状况[组件状态,存活状态] health 健康端点:返回存活,死亡. Health对象 运行指标[CPU,内存,垃圾回收,吞吐量,响应成功率] Metrics 指标监控端点:访问次数/率等等 链路追踪等等 引入web和actuator依赖 在…

如何在不丢失数据的情况下绕过IPhone密码?

不幸的是&#xff0c;不可能在不丢失数据的情况下绕过 iPhone 密码。通过密码的唯一方法是使用iTunes或iCloud恢复设备。这将清除您设备的内容&#xff0c;因此请务必在恢复之前备份所有重要数据。如果您忘记了密码&#xff0c;请按照以下步骤操作&#xff1a; 1. 将您的 iPhon…

AI绘画 Stable Diffusion后期处理—无需ControlNet也能轻松高清放大图像与老旧照片修复,SD新手必看教程

大家好&#xff0c;我是设计师阿威 分享了这么多期AI绘画Stable DIffusion的入门教程和一些常用的插件玩法后&#xff0c;不知道大家有没有发现&#xff0c;SD还有一个功能&#xff0c;似乎没怎么用到过&#xff0c;它就是—后期处理。 今天就给大家分享一下SD中的 “后期处理…

VLSI | 计算CMOS反相器的负载电容

ref. 数字集成电路 电路、系统与设计&#xff08;第二版&#xff09;&#xff0c;周润德 译 为了计算方便&#xff0c;本人编写了MATLAB代码进行计算&#xff0c;需要可至&#xff1a;MATLAB计算CMOS反相器等效负载电容 。资源中也给出了PTM的MOS模型参数。对于MOS的模型参数&…

TMGM:日本加息预期被推迟,日元相对稳定

根据最新的日本银行《意见总结》&#xff0c;"实现通胀目标的可能性进一步增加"&#xff0c;预计将进一步上升。 "假设通胀目标将在2025财年下半年实现&#xff0c;央行应在那时将政策利率提高到中性利率水平。由于中性利率水平至少在1%左右&#xff0c;为避免…

injected stylesheet 导致 页面重置按钮文字样式改变,按钮中的文字看不清晰

项目场景&#xff1a; 相关背景&#xff1a; injected stylesheet 导致 页面重置按钮文字样式改变&#xff0c;看不清晰 问题描述 遇到的问题&#xff1a; 检查页面中该按钮的代码如下所示&#xff1a; <div class"el-form-item__content"> <button d…

手把手从0开始,使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型

&#x1f4a5;Ollama介绍 Ollama是一个开源框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计。它提供了一套简单的工具和命令&#xff0c;使任何人都可以轻松地启动和使用各种流行的LLM&#xff0c;例如GPT-3、Megatron-Turing N…

Python教程(十二):面向对象高级编程详解

目录 专栏列表前言变量命名规则说明&#xff1a;一、类的内部变量和特殊方法1.1 内部变量示例测试结果: 1.2 __slots__未使用__slots__使用__slots__ 二、装饰器2.1 函数装饰器示例 2.2 property示例 三、枚举类3.1 枚举类概述3.2 枚举类定义示例 四、元类4.1 什么是元类4.2 自…

去除猫咪浮毛哪款更胜一筹?希喂、有哈宠物空气净化器测试对比

随着养宠人群的增多&#xff0c;宠物空气净化器受到铲屎官们的喜爱&#xff0c;成为家庭清洁的好帮手。然而&#xff0c;市场上的选择繁多&#xff0c;不少品牌以次充好&#xff0c;让人们掉入消费陷阱。为此&#xff0c;挑选一台优质有保障的宠物空气净化器品牌&#xff0c;需…

智界S7 小鹏P7 G3 G3i P5 G9 P7i G6 X9维修手册和电路图线路图接线资料更新

汽修帮手资料库提供各大厂家车型维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等&#xff0c;并长期保持高频率资料更新&#xff01; 覆盖车型2020-2024年智界S7 小鹏…

不是智商税!六个核桃健脑效果获科学支持,效果源自七大方面

这两年来&#xff0c;关于脑雾、脑损伤的话题在社交媒体上越发受到关注&#xff0c;健脑也越发成为国民刚需。 不过&#xff0c;要做到科学健脑并不容易。有消费者选择专业保健品补剂&#xff0c;也有消费者倾向于食补。中国饮食传统中就有核桃补脑的说法&#xff0c;但不少人…

Untiy Modbus 西门子 S7-1200 基础通信

Untiy Modbus 西门子 S7-1200 基础通信 ModbusModbus是什么Modbus 协议版本Modbus 通信和设备Modbus 如何实现Modbus 使用限制Modbus 通信协议学理上的弱点分析 UnityUnity ModbusTCPUnity ModbusTCP 单个线圈读取方法Unity ModbusTCP 单个线圈写入方法 IntUnity ModbusTCP 单个…

Android 让程序随系统自动启动并允许后台运行(白名单)

最近制作一个管理程序&#xff0c;需要在开机时候启动&#xff0c;并持续运行。这里简单记录下如何制作。 自启动原理 系统在启动的时候会广播一个ACTION_BOOT_COMPLETED&#xff0c;带有接收的程序可以收到&#xff0c;所以我们在接收到以后把程序运行起来。 清单文件设置 …

PyMysql快速上手操作详解

PyMySQL是从Python连接到MySQL数据库服务器的接口。 它实现了Python数据库API v2.0&#xff0c;并包含一个纯Python的MySQL客户端库 一、PyMysql安装 pip install pymysql 或者 pip3 install pymysql二、连接数据库 pymysql连接数据库使用的是 pymsql.connect() 函数&#xff…

数据库设计笔记3-事务管理,冲突串行化,锁定协议,死锁测试

#1.指令冲突 注&#xff1a;读读操作不冲突&#xff0c;剩下的冲突。 #2.冲突串行化 <1理解 如果一个调度可以在不改变冲突操作顺序的情况转换为任意串行调度&#xff0c;那么两个调度的结果是相同的&#xff0c;也就是说这个调度是可冲突串行化的 <2正反举例 <3测…

【教师秘籍】AI预测学生未来?职场规划大揭秘!

​声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2150.html 嘿老师们&#xff0c;你们有没有和我一样的烦恼&#xff1a;学生各有千秋&#xff0c;家长各有各的操心&#xff0c;信息一箩筐却总是不够用&#xff1f;&am…

基于JAVA的校园跑腿网站的设计与实现

摘要 随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;校园跑腿网站给学校的业务带来了更大的发展机遇。 在经济快速发展的带动下&#xff…

[NPUCTF2020]ReadlezPHP1

打开题目&#xff0c;看到信息 ctrlu查看源代码 看到php代码&#xff0c;打开 代码审计看一下&#xff0c;进行代码审计&#xff0c;发现存在反序列化语句&#xff1a;$ppp unserialize($_GET["data"]);和执行漏洞&#xff1a;echo $b($a);&#xff0c;此处未想到fl…