echarts地图的简单使用

news2024/11/15 21:27:19

echarts地图的简单使用

    • 文章说明
    • 核心源码
    • 效果展示
    • 源码下载

文章说明

主要介绍echarts地图组件的简单使用,记录为文章,供后续查阅使用

目前只是简单的示例,然后还存在着一些小bug,主要是首个Legend的点击会导致颜色全部不展示的问题,以及世界地图的区域展示有一些小问题,等待后续完善

核心源码

地图绘制组件

<script setup>
import * as echarts from "echarts";
import china from "@/assets/china.json";
import world from "@/assets/world.json";
import {onBeforeMount, onMounted, reactive} from "vue";
import {getAreaList} from "@/assets/getAreaList";
import {calculateColor} from "@/util";

const data = reactive({
  mapName: "china",
  chinaAreaList: [],
  selectedChinaAreaList: [],
  worldAreaList: [],
  selectedWorldAreaList: [],
});

onBeforeMount(() => {
  const {chinaAreaList, worldAreaList} = getAreaList();
  data.chinaAreaList = chinaAreaList;
  data.worldAreaList = worldAreaList;
});

const mapList = [
  {
    name: "china",
    data: china,
  },
  {
    name: "world",
    data: world,
  }
];

let myChart;

onMounted(() => {
  for (let i = 0; i < mapList.length; i++) {
    echarts.registerMap(mapList[i].name, mapList[i].data);
  }

  const chartDom = document.getElementById("basic-chart");
  myChart = echarts.init(chartDom);
  setOption();

  window.onresize = () => {
    myChart.resize();
  };
});

const mapNameMap = {
  china: "中国地图",
  world: "世界地图",
}

let min = 0;
let max = 10000;
let selectedAreaDataList = [];

function setOption() {
  let selectedAreaList = [];
  if (data.mapName === "china") {
    selectedAreaList = data.selectedChinaAreaList;
  } else if (data.mapName === "world") {
    selectedAreaList = data.selectedWorldAreaList;
  }

  const series = [];
  const colors = [];

  const notSortArray = [];
  for (let i = 0; i < selectedAreaList.length; i++) {
    let selectedAreaData;
    for (let j = 0; j < selectedAreaDataList.length; j++) {
      if (selectedAreaDataList[j].name === selectedAreaList[i]) {
        selectedAreaData = selectedAreaDataList[j];
        break;
      }
    }
    let value;
    if (selectedAreaData) {
      value = selectedAreaData.value;
    } else {
      value = Math.ceil(Math.random() * max);
      selectedAreaDataList.push({
        value: value,
        name: selectedAreaList[i],
      });
    }
    notSortArray.push({
      value: value,
      name: selectedAreaList[i],
    });
  }
  notSortArray.sort(function (o1, o2) {
    return o1.value - o2.value;
  });
  if (!notSortArray.length) {
    colors.push("#ffffff", "#000000");
  }

  const legendNames = [];
  for (let i = 0; i < notSortArray.length; i++) {
    const color = calculateColor(notSortArray[i].value, min, max);
    colors.push(color);
    const seriesItem = {
      name: notSortArray[i].name,
      type: 'map',
      geoIndex: 0,
      data: [
        {
          name: notSortArray[i].name,
          value: notSortArray[i].value
        }
      ],
      color: color,
    };
    series.push(seriesItem);
    legendNames.push(notSortArray[i].name);
  }

  myChart.setOption({
    title: {
      text: mapNameMap[data.mapName],
      left: "center",
    },
    geo: {
      map: data.mapName,
      label: {
        show: false,
      },
    },
    legend: {
      orient: 'vertical',
      bottom: "50px",
      left: '50px',
      itemHeight: 10,
      itemWidth: 30,
      textStyle: {
        fontSize: 12,
        rich: {
          a: {
            verticalAlign: 'middle',
          },
        },
        padding: [2, 0, 0, 0],
      },
      data: legendNames
    },
    series: series,
    visualMap: {
      left: 'right',
      min: min,
      max: max,
      inRange: {
        color: colors
      },
      text: ['High', 'Low'],
      calculable: true
    },
    toolbox: {
      show: true,
      feature: {
        saveAsImage: {
          show: true
        }
      }
    },
  }, true);
}
</script>

<template>
  <div class="container">
    <div style="height: 6rem; display: flex; align-items: center; justify-content: center">
      <el-select v-model="data.mapName" style="width: 10rem; margin-right: 2rem" @change="setOption">
        <el-option label="中国地图" value="china"/>
        <el-option label="世界地图" value="world"/>
      </el-select>
      <el-select v-show="data.mapName === 'china'" v-model="data.selectedChinaAreaList" collapse-tags
                 collapse-tags-tooltip filterable multiple placeholder="请选择地区" style="width: 30rem"
                 @change="setOption">
        <template v-for="item in data.chinaAreaList" :key="item.id">
          <el-option :label="item.name" :value="item.name"/>
        </template>
      </el-select>
      <el-select v-show="data.mapName === 'world'" v-model="data.selectedWorldAreaList" collapse-tags
                 collapse-tags-tooltip filterable multiple placeholder="请选择地区" style="width: 30rem"
                 @change="setOption">
        <template v-for="item in data.worldAreaList" :key="item.id">
          <el-option :label="item.name" :value="item.name"/>
        </template>
      </el-select>
    </div>
    <div style="flex: 1">
      <div id="basic-chart" class="chart"></div>
    </div>
  </div>
</template>

<style lang="scss">
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.container {
  width: 100vw;
  height: 100vh;
  display: flex;
  flex-direction: column;
}

.chart {
  width: 100%;
  height: 100%;
}
</style>

根据值生成颜色的工具函数

function hsvToRgb(h, s, v) {
    const f = n => {
        const k = (n + h / 60) % 6;
        return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);
    };
    return [
        Math.round(f(5) * 255),
        Math.round(f(3) * 255),
        Math.round(f(1) * 255)
    ];
}

export function calculateColor(value, minValue, maxValue) {
    value = Math.max(minValue, Math.min(maxValue, value));

    const factor = (value - minValue) / (maxValue - minValue);
    const hue = (factor * 360) % 360;
    const saturation = 1 - factor;
    const valueV = 1;

    const [r, g, b] = hsvToRgb(hue, saturation, valueV);
    return `rgb(${r}, ${g}, ${b})`;
}

地图数据的下载,可以在该网站下载较为全面的中国地图的数据:DataV.GeoAtlas地理小工具系列

效果展示

中国地图
在这里插入图片描述

世界地图
在这里插入图片描述

源码下载

echarts地图组件的基本使用

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

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

相关文章

笔试编程-百战成神——Day02

1.简写单词 题目来源&#xff1a; 简写单词——牛客网 测试用例 算法原理 本题的主要难点就是如何识别每一个单词并且返回其首字母大写&#xff0c;最终组成一个新的字符串后输出&#xff0c;这里我们使用while(cin>>str)就可以解决&#xff0c;直接忽略每一个空格直接…

深入理解及如何使用main函数参数

目录 前言&#xff1a;一、main函数参数二、main函数参数的意义及如何使用三、从操作系统层面&#xff08;指令&#xff09;理解main函数参数 前言&#xff1a; 在平时编写代码的过程中&#xff0c;我们会经常写main函数&#xff0c;这是一个程序必不可少的&#xff0c;main 函…

信息汇总(避坑)系统

本系统前期设定为公司避坑系统&#xff0c;在此基础上衍生出公司信息汇总功能 主要功能点&#xff1a;避坑分类、标签、随笔记录、阅读人数、评论&#xff08;用户评论、匿名评论&#xff0c;评论回复等&#xff09;、系统留言&#xff08;支持表情留言&#xff09;、避坑信息…

JavaScript中的无穷大

JavaScript中的无穷大 溢出&#xff1a;overflow,数字结果超过JS表示的数字上限&#xff0c;结果为一个特殊的无穷大Infinity或负无穷大-Infinity. 下溢&#xff1a;underflow是当前结果无限接近于0比JS能表示的最小值还要小&#xff0c;将会返回0&#xff0c;负数下溢就是-0…

剑指offer JZ7 重建二叉树

描述&#xff1a; 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 思路&#xff1a; 这道题考察的是二叉树根据先序…

蓝桥杯备赛---引言

我是来自成都锦城学院的2021级学生&#xff0c;第一次参加第十五届蓝桥杯嵌入式赛道获得了国二的名次&#xff0c;接下来将为大家分享各个模块的代码&#xff0c;可以速成省一&#xff0c;但想要取得国一的成绩则需要补偿数据结构、基本c语言函数等相关知识&#xff0c;很遗憾没…

C++ 创建型设计模式

何为设计模式 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环 境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b; 设计原则 依赖倒置 开放封闭 一个类应该对扩展&#xff08;组合和继承&#xff09;开放&#xff0c;对…

犀牛检测系统源码分享

犀牛检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

N诺计算机考研-错题

B A.LLC,逻辑链路控制子层。一个主机中可能有多个进程在运行,它们可能同时与其他的一些进程(在同一主机或多个主机中)进行通信。因此在一个主机的 LLC子层的一个服务访问点,以便向多个进程提供服务。B.MAC地址,称为物理地址、硬件地址,也称为局域网地址,用来定义网络设…

python与html链接测试

做这个测试我使用了两个资源 1.csdn上收集的参考资料&#xff0c;特此感谢 链接如下&#xff1a;Pycharm社区版创建Flask项目(配置项目文件)_pycharm community flask-CSDN博客 2.kimi 网址如下&#xff1a;Kimi.ai - 帮你看更大的世界 (moonshot.cn) 这是试出来的操作步骤…

python如何查看文件的目录

1、sys.arg[0]: import sys print(sys.argv[0])#当前脚本的位置 输出结果&#xff1a; G:/Pythonxx/test.py 2、os模块 import os print("1111") print (os.getcwd())#获得当前目录 print (os.path.abspath(.))#获得当前工作目录 print (os.path.abspath(..))#获得当…

基于丹摩智算部署可图(Kolors)

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 丹摩智算平台简介一、Kolors 简介介绍技术背景部署与使用前提条件 二、DAMODEL 平台创建适配机器1.1、实例创建 三、服务部署安装 An…

性能测试利器 - Locust框架解析

01 认识Locust 说起性能测试工具&#xff0c;大家肯定想到的都是Jmeter&#xff0c;是的&#xff0c;由于其简单易用、功能强大&#xff0c;已经变成主流的压测工具之一。当需要实现一些高级功能的时候&#xff0c;可以使用Java语言对Jmeter进行扩展。 但是很多小伙伴只会Pyt…

10种数据库技术的发展历程与现状

数据库是互联网的基石&#xff0c;存储着海量信息&#xff0c;使信息可被高效地组织、检索和分享。没有数据库&#xff0c;网站无法记忆用户数据&#xff0c;应用无法提供个性化服务&#xff0c;信息交流将失去智能与连贯性。因此&#xff0c;数据库技术极大地推动了互联网的发…

如何使用 Windows 自带的虚拟机 Hyper-V

当前环境: Windows 10 Pro 开启 Hyper-V 功能 开启 Hyper-V 功能 开始菜单, 搜索 “control” 打开控制面板点击 “程序” > “启用或关闭 Windows 功能”开启所有的 Hyper-V 选项 安装虚拟机 准备系统镜像 .iso 文件 进入 itellyou.cn 进行下载所需镜像我选择的是: Wind…

nginx部署手册

1、在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel yum -y install gcc pcre-devel zlib-devel openssl openssl-devel2、 新建nginx用户 &#xff08;1&#xff09;groupadd 命令用于创建一个新的用户组 groupadd nginx&#xff08;2&#…

鸿蒙开发(NEXT/API 12)【基础功能(EnterpriseAdminExtensionAbility开发指南)】企业设备管理服务

概述 企业设备管理扩展能力&#xff0c;是设备管理应用必备组件。当开发者为企业开发设备管理应用时&#xff0c;需继承EnterpriseAdminExtensionAbility&#xff0c;在EnterpriseAdminExtensionAbility实例中实现MDM业务逻辑&#xff0c;EnterpriseAdminExtensionAbility实现…

Xcode 16 上传AppStore遇到第三方库 bitcode 的问题

Xcode 16 上传AppStore遇到第三方库 bitcode 的问题 最近两天更新了Xcode 16&#xff0c;然后正好要发布新版本的App&#xff0c;打包Adhoc没问题&#xff0c;但是上传AppStoreConnect或者TestFlight就不行解决方案参考资料 最近两天更新了Xcode 16&#xff0c;然后正好要发布新…

【裸机装机系列】15.kali(ubuntu)-重装linux步骤

推荐阅读&#xff1a; 1.kali(ubuntu)-为什么弃用ubuntu&#xff0c;而选择基于debian的kali操作系统 如果你想重装linux系统&#xff0c;因为装机时采用了LVM分区的方式&#xff0c;那就可以按照下面步骤来操作&#xff1a; 保留 /home分区&#xff0c;“/swap”可以不动&am…