当前位置: 首页 > news >正文

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

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、结果

相关文章:

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

1、下载所需地市的json 链接&#xff1a;DataV.GeoAtlas地理小工具系列 在右侧输入需要的名称&#xff0c;然后下载json文件到本地 2、在html 中准备容器&#xff0c;并设置宽高 <div id"mapContent"> <div ref"mapChart" style"width:10…...

Android 应用兼容性变更调试

引言 本文将介绍如何调试和解决这些兼容性问题,并记录调试过程中实际操作的步骤和方法。在Android应用开发中,随着Android系统版本的不断更新,应用的兼容性问题变得越来越复杂。 推荐:《Android系统开发中高级定制专栏导读》08-03 16:04:53.518 6555 6555 D Compatibili…...

76 多态

多态&#xff08;polymorphism&#xff09;是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。 派生类继承了基类的行为和属性之后&#xff0c;还会增加某些特定的行为和属性&#xff0c;同时还可能会对继承来的某些行为进行一定的改变&#xff0c;这都是多态的表现…...

数据采集工具之Canal

本文主要介绍canal采集mysql数据的tcp、datahub(kafka)模式如何实现 1、下载canal https://aliyun-datahub.oss-cn-hangzhou.aliyuncs.com/tools/canal.deployer-1.1.5-SNAPSHOT.tar.gz canal的原理类似于mysql的主从复制&#xff0c;canal模拟的是从节点拉取主节点的binlog数…...

【后端】消息中间件小册

1.RabbitMQ RabbitMQ 是一个流行的消息中间件系统&#xff0c;采用 AMQP&#xff08;高级消息队列协议&#xff09;来管理消息的传递。它的工作原理涉及多个组件和机制来确保消息的可靠性和完整性。以下是 RabbitMQ 的基本工作原理以及如何保证消息不丢失的机制&#xff1a; R…...

【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】

目录 1、转换流1.1 转换流分类&#xff1a;1.2 转换流的作用&#xff08;1&#xff09;按照指定的字符编码读写操作&#xff1a;&#xff08;2&#xff09;将字节流转换为字符流进行操作&#xff1a; 2、序列化流2.1 序列化的基本使用&#xff1a;2.2 序列化的操作流程&#xf…...

【Material-UI】Checkbox 组件中的 Label Placement 设置详解

文章目录 一、Checkbox 组件简介1. 组件概述2. labelPlacement 属性 二、labelPlacement 属性的使用方法三、各标签位置的效果与应用场景1. Top&#xff08;顶部&#xff09;2. Start&#xff08;左侧&#xff09;3. Bottom&#xff08;底部&#xff09;4. End&#xff08;右侧…...

XJTUSE-离散数学-集合

基本概念 集合的包含与相等&#xff0c;如子集幂集&#xff1a;以A的所有子集组成的集合称为A的幂集AB <> 集合的基本运算 基本运算证明会考 交运算并运算补运算差运算&#xff1a;A \ B 环和运算&#xff1a;环积运算&#xff1a; 集合的其他表示方法 文图表示法 …...

安徽省消防设施操作员题库

1.()是做人的基本准则&#xff0c;也是社会道德和职业道德的一项基本规范。 A.诚实守信(正确答案) B.爱岗敬业 C.以人为本 D.钻研业务 2.()是指为了追求完美&#xff0c;坚持工匠精神&#xff0c;在工作中不放松对自己的要求。 A.爱岗敬业 B.精益求精(正确答案) C.勤奋刻苦 D.专…...

Singularity容器安装与使用

Singularity容器技术 docker的缺点: 资源限制问题:Slurm利用cgroups实现资源分配&#xff0c;Docker通过ocker daemon无法实现。 权限问题:Docker daemon使用 root用户启动&#xff0c;HPC场录期望使用普通用户运行容器。 singuiarily主要是适合HPC中的普通用户&#xff0c;…...

Linux 文件、重定向、缓冲区

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、文件 1、文件的理解&#xff08;浅层&#xff09; 1.文件是什么&#xff1f; 2.文件操作的前提 3.文件的存储 4.一个进程可以打开多个文件吗&#xff1f;如果可以怎么管理的&#xf…...

WEB漏洞-SQL注入之MYSQL注入

跨库注入的原理&#xff1a;针对同一IP下的不同域名 同一服务器下 网站A对应数据库A 网站B对应数据库B 网站C对应数据库C 如果某网站的存在注入点&#xff0c;注入点的权限恰好是root权限&#xff0c;也就是最高权限&#xff0c;那么可以通过跨库注入获取其他网站的数据库…...

mysql 查询 from a, b 和 a left join b 有什么区别

在MySQL中&#xff0c;from a, b 和 a left join b 有显著的区别&#xff0c;主要体现在查询结果和使用场景上。 基本语法与返回结果&#xff1a; from a, b&#xff1a;这种写法实际上是将两个表作为一个整体来处理&#xff0c;即假设这两个表是同一个表。因此&#xff0c;它…...

禁用ssh 22端口

在Linux系统中&#xff0c;要关闭SSH端口&#xff0c;可以通过修改SSH配置文件或防火墙规则来实现。 方法一&#xff1a;修改SSH配置文件 1. 使用root用户登录Linux系统。 2. 打开SSH配置文件&#xff0c;可以使用任何文本编辑器&#xff0c;如vi或nano。在大多数Linux发行版上…...

C++基础编程的学习3

nullptr关键字 在C11之前&#xff0c;空指针通常用NULL或0表示。然而&#xff0c;这些表示方法存在类型安全问题。C11引入了nullptr关键字&#xff0c;它提供了一个明确的、类型安全的空指针值。 Lambda表达式 Lambda表达式是C11引入的一种便捷的匿名函数定义方式。当Lambda…...

Java中的Optional类:解锁优雅编程的秘密

引言 在Java开发的世界里&#xff0c;空指针异常&#xff08;NullPointerException&#xff09;一直是让无数程序员头疼的问题之一。它不仅打断了程序的正常执行流程&#xff0c;还可能隐藏在复杂的业务逻辑之中&#xff0c;难以定位。自Java 8起&#xff0c;一个新的类——Op…...

聆思CSK6大模型开发板语音控制风扇(上)

前言 本文介绍如何实现大模型语音交互对风扇实现开关控制&#xff0c;示例使用的硬件是聆思CSK6大模型开发板&#xff0c;大模型接的是星火大模型。本文将先详细介绍大模型云端从获取交互语音到下发控制指令的全过程&#xff0c;包括整合上下文、配置提示词、语义意图分类、提取…...

代码随想录算法训练营第四十一天 | 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机II、123. 买卖股票的最佳时机III

一、121. 买卖股票的最佳时机 题目链接&#xff1a;121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 (programmercarl.com)——121. 买卖股票的最佳时机 视频讲解&#xff1a;动态规划之 LeetCode&#xff1a;121.买卖股票的最…...

延时队列与redis and rabbitmq

延时队列是什么 延时队列&#xff08;Delay Queue&#xff09;是一种特殊的消息队列&#xff0c;它允许你在添加消息时设置一个延时时间&#xff0c;消息只有在延时时间到达后才能被消费。这种机制在分布式系统中非常有用&#xff0c;常用于处理需要在指定时间后执行的任务&am…...

数据结构--单链

#include "link.h" plink get_head() { plink pmalloc(sizeof(Link)); if(pNULL) { printf("申情节点失败\n"); return NULL; } p->len0; p->nextNULL; return p; } void head_insert(plink L,int a) {…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解

在我的上一篇博客&#xff1a;基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目&#xff0c;该项目展示了一个强大的框架&#xff0c;旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人&#xff0c;更是一个集…...