vue3+ts 使用amCharts展示地图,1.点击左侧国家,可以高亮并放大右侧地图对应的国家。 2.展示数据球。
效果图展示:
1.点击左侧国家,可以高亮并放大右侧地图对应的国家。
2.展示数据球。


下载依赖
yarn add @amcharts/amcharts5
其中,props.countryData的数据格式为
[{
“country”: “加拿大”,
“code”: “CA”,
“deviceCount”: 1
},{
“country”: “瑞士”,
“code”: “CH”,
“deviceCount”: 29
},{
“country”: “中国”,
“code”: “CN”,
“deviceCount”: 10774
},{
“country”: “德国”,
“code”: “DE”,
“deviceCount”: 42
}]
<template><div class="device-distribution-box"><div class="header-title">{{ $t('countryDistributionDevice') }}</div><section class="flex-box"><div class="country-box"><div class="country-list" v-for="country in mapData"><div:class="activeCountry == country.code ? 'active-country' : ''"@click="clickCountry(country.code)"class="sf-ellipsis":title="country.country + '(' + country.deviceCount + ')'">{{ country.country }}({{ country.deviceCount }})</div></div></div><div id="chartdiv"></div> // 地图展示容器</section></div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref, watch } from 'vue';
import useLocale from '@/utils/i18n/store';
import { storeToRefs } from 'pinia';
import am5geodata_lang_EN from '@amcharts/amcharts5-geodata/lang/EN';// 地图语言包
import am5geodata_lang_cn_ZH from '@amcharts/amcharts5-geodata/lang/cn_ZH';//地图语言包
import am5geodata_lang_PT from '@amcharts/amcharts5-geodata/lang/PT'; // 地图语言包
import * as am5map from '@amcharts/amcharts5/map';
import am5geodata_worldLow from '@amcharts/amcharts5-geodata/worldLow';
import * as am5 from '@amcharts/amcharts5';
import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const localeStore = useLocale(); //获取本地语言
const { locale } = storeToRefs(localeStore); //获取本地语言interface Props {countryData: Array<any>;
}
const props = withDefaults(defineProps<Props>(), {countryData: () => {return [];},
});// 数据接口
interface MapData {code: string;deviceCount: number;name: string;country: string;id?: string;
}
const mapData = ref<Array<MapData>>([]);
const activeCountry = ref<string>('');
let polygonSeries = reactive({}); // 地图数据
let root = reactive({}); // 地图根// 数据更新,更新地图
watch(() => props.countryData,(newValue, oldValue) => {mapData.value = props.countryData.map((item) => {item.id = item.code;return item;});refreshAmchartsMap();},
);// 左侧国家点击事件-点击高亮国家
const clickCountry = (countryCode: string) => {activeCountry.value = countryCode;// 根据点击的国家,添加该国家的颜色数据,去除无关国家的颜色数据let tempData = mapData.value.map((item) => {if (item.id == countryCode) item.polygonSettings = { fill: am5.color(0x3a70d3) };else item.polygonSettings = {};return item;});// 绑定数据 高亮该国家颜色polygonSeries.data.setAll(tempData);// 地图放大到该国家polygonSeries.events.on('datavalidated', function () {const zoomTargets = [countryCode];const zoomDataItems = [];zoomTargets.forEach(function (id) {zoomDataItems.push(polygonSeries.getDataItemById(id));});polygonSeries.zoomToDataItems(zoomDataItems);});
};
// 更新相关数据
const refreshAmchartsMap = () => {root.setThemes([am5themes_Animated.new(root)]);// Create the map chart 地图的样式不一样let chart = root.container.children.push(am5map.MapChart.new(root, {projection: am5map.geoNaturalEarth1(),}),);polygonSeries = chart.series.push(am5map.MapPolygonSeries.new(root, {geoJSON: am5geodata_worldLow, // 地图展示的国家区域exclude: ['AQ'], //该操作将会从地图上删除南极洲。fill: am5.color(0xbbbbbb),geodataNames: // 根据本地语言配置地图语言locale.value == 'zh'? am5geodata_lang_cn_ZH: locale.value == 'en'? am5geodata_lang_EN: locale.value == 'pt'? am5geodata_lang_PT: '',}),);// ====================================// Create pins// ====================================// 点符号let pointSeries = chart.series.push(am5map.MapPointSeries.new(root, {// ...// autoScale: true,polygonIdField: 'code', // 根据code值来映射点的位置,code的值就是地图中类似“CN“的国家代码}),);let colorSet = am5.ColorSet.new(root, { step: 2 });// 点符号样式设置pointSeries.bullets.push(function (root, series, dataItem) {let value = dataItem.dataContext.value;let container = am5.Container.new(root, {});let color = colorSet.next();let radius = value / 5 < 15 ? 15 : value / 5 > 50 ? 50 : value / 5; //球的大小!!!!!!!!!!!!需求动态修改let circle = container.children.push(am5.Circle.new(root, {radius: radius,fill: color,dy: -radius * 2,}),);let pole = container.children.push(am5.Line.new(root, {stroke: color,height: -radius * 2,strokeGradient: am5.LinearGradient.new(root, {stops: [{ opacity: 1 }, { opacity: 1 }, { opacity: 0 }],}),}),);let label = container.children.push(am5.Label.new(root, {text: value,fill: am5.color(0xffffff),fontWeight: '400',centerX: am5.p50,centerY: am5.p50,dy: -radius * 2,}),);let titleLabel = container.children.push(am5.Label.new(root, {text: dataItem.dataContext.title,fill: color,fontWeight: '500',fontSize: '1em',centerY: am5.p50,dy: -radius * 2,dx: radius,}),);return am5.Bullet.new(root, {sprite: container,});});// 映射点数据for (var i = 0; i < mapData.value.length; i++) {let d = mapData.value[i];pointSeries.data.push({code: d.code,value: d.deviceCount,});}// 鼠标移入和点击的效果polygonSeries.mapPolygons.template.setAll({tooltipText: '{name}',toggleKey: 'active',interactive: true,templateField: 'polygonSettings', //多边形也可以使用模板字段从数据中获取其设置的值。模板字段允许将系列数据中的对象属性绑定到多边形模板的设置。});// 绑定数据polygonSeries.data.setAll(mapData.value);// hover及active高亮颜色polygonSeries.mapPolygons.template.states.create('hover', {fill: root.interfaceColors.get('primaryButtonHover'),});polygonSeries.mapPolygons.template.states.create('active', {fill: root.interfaceColors.get('primaryButtonHover'),});// Set clicking on "water" to zoom out// 点击背景空白处,恢复到初始大小chart.chartContainer.get('background').events.on('click', function () {chart.goHome();});// Make stuff animate on loadchart.appear(1000, 100);
};//新建国家地图 Create root element
const newAmchartsMap = () => {root = am5.Root.new('chartdiv');
};
onMounted(() => {newAmchartsMap();
});
</script>
<style lang="scss" scoped>
.device-distribution-box {.header-title {font-family:PingFang SC,PingFang SC;font-weight: 500;font-size: 16px;color: #191919;line-height: 24px;margin-bottom: 16px;}.flex-box {display: flex;height: calc(100% - 40px);.country-box {// height: 328px;overflow-y: auto;overflow-x: hidden;.country-list {min-width: 160px;max-width: 200px;div {cursor: pointer;margin-bottom: 16px;font-family:PingFang SC,PingFang SC;font-weight: 500;font-size: 14px;color: #7f7f7f;line-height: 22px;}.active-country {font-weight: bold;font-size: 14px;color: #3a70d3 !important;line-height: 22px;}}}}#chartdiv {width: 100%;// height: 328px;background-color: #fbfbfb;}
}
</style>相关文章:
vue3+ts 使用amCharts展示地图,1.点击左侧国家,可以高亮并放大右侧地图对应的国家。 2.展示数据球。
效果图展示: 1.点击左侧国家,可以高亮并放大右侧地图对应的国家。 2.展示数据球。 下载依赖 yarn add amcharts/amcharts5其中,props.countryData的数据格式为 [{ “country”: “加拿大”, “code”: “CA”, “deviceCount”: 1 },{ “c…...
汽车无钥匙启动功能工作原理
移动管家无钥匙启动是一种科技化的汽车启动方式,它允许车主在不使用传统钥匙的情况下启动车辆。这种技术通过智能感应系统实现,车主只需携带智能钥匙,当靠近车辆时,车辆能够自动解锁并准备启动。启动车辆时,车主无…...
C++标准的一些特性记录:C++11的auto和decltype
文章目录 auto容器遍历配合lambda表达式decltype两者对引用类型的处理是相同的decltype保留const,而auto不会保留const在C++11中,引入了两个新的关键字,auto和decltype两个关键字,都是用于做类型推断。但是使用的场景有些区别。 auto 容器遍历 auto这个关键字,我个人在编…...
【Elasticsearch系列四】ELK Stack
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【新手上路】衡石分析平台使用手册-认证方式
认证方式 用户登录衡石系统时,系统需要对输入的用户名和密码进行验证,保证系统的安全。衡石提供 CAS、SAML2、OAUTH2等多种单点登录认证方式。在 SSO 单点登录中,衡石是服务提供者 SP(Service Provider)为用户提供所…...
数字电路与逻辑设计-触发器功能测试及其应用
一、实验目的 1.验证基本RS、JK、D、T和T’触发器的逻辑功能及使用方法; 2.能进行触发器之间的相互转换; 3.学习触发器的一些应用。 二、实验原理 触发器具有两个能够自行保持的稳定状态,用以表示逻辑状…...
【网站架构部署与优化】web服务与http协议
文章目录 HTMLHTML 概述HTML 语法规则HTML 文件结构头标签中常用标签静态网页与动态网页1. 静态网页2. 动态网页3. 动态网页语言 HTTP协议概述主要的HTTP版本包括:HTTP方法GET与POST方法的比较 HTTP状态码分类及常见状态码HTTP常见状态码 HTTP 请求流程分析1. 请求报…...
【字符函数】strcpy函数(字符串复制函数)+strcat函数(字符串追加)+strcmp函数(字符串比较)【笔记】
1.复制函数--------------strcpy函数 函数使用 char*strcpy(char* destination, const char* source) strcpy函数用于拷贝字符串,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指…...
codetop字符串刷题,刷穿地心!!不再畏惧!!暴打面试官!!
主要供自己回顾与复习,题源codetop标签字符串近半年,会不断更新 1.有效的括号字符串2.括号生成3.最长单词4.字符串转换整数(atoi)5.整数转罗马数字6.罗马数字转整数7.比较版本号8.最长公共前缀9.面试题17.15.最长单词10.验证IP地址11.面试题01.06.字符串…...
快速体验Linux发行版:DistroSea详解与操作指南
DistroSea 是一个功能强大的在线平台,允许用户在无需下载或安装的情况下,通过浏览器直接测试多种Linux和BSD发行版。该平台非常适合Linux爱好者、系统管理员和开发者,提供一个简便的方式来体验各种操作系统而无需影响本地设备。 为什么选择D…...
Java设计模式—面向对象设计原则(二) --------> 里氏代换原则 LSP (完整详解,附有代码+案列)
文章目录 里氏代换原则3.2.1 概述3.2.2 改进上述代码 里氏代换原则 里氏代换原则:Liskov Substitution Principle,LSP 3.2.1 概述 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则:任何基类可以出现的地方,子类一定…...
使用ShardingSphere实现MySql的分库分表
目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候…...
为什么 Feign 要用 HTTP 而不是 RPC?
一、引言 在现代微服务架构中,服务之间的通信是至关重要的环节。Feign 是一种常用的声明式 HTTP 客户端工具,它简化了服务间的调用过程。然而,在服务通信的领域中,除了基于 HTTP 的方式,还有 RPC(Remote Pr…...
OJ在线评测系统 前端开发设计优化通用菜单组件二 调试用户自动登录
通用的菜单组件开发二 接下来要完善 权限功能 就是只有登录后才能进入题目查看界面 用户只能看到我们有权限的菜单 我们要在路由文件里面去操作 原理是控制路由设置隐藏 只要用户没有权限 就过滤掉隐藏 全局权限管理 实现想清楚有那些权限 /*** 权限定义*/ const ACCES…...
mongodb 安装教程
mongodb 安装教程: https://blog.51cto.com/u_13646338/5449015 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.9.tgz tar -zxvf mongodb-linux-x86_64-rhel70-5.0.9.tgz -C /opt/module/ [roothadoop102 module]# mv mongodb-linux-…...
切换淘宝最新镜像源npm
要切换淘宝的npm镜像源,可以按照以下步骤进行: 1. 打开命令行工具(如Terminal、CMD等)。 2. 输入以下命令来查看当前的npm镜像源: npm config get registry 3. 如果当前的镜像源不是淘宝镜像源ÿ…...
SpringAI-基于java大模型的胡言乱语
最近看了一点相关的springAI知识,做个小总结 胡言乱语开始 1.不同的ai调用api一般单独汇总成一个依赖,比如说调用openai的api的依赖是spring-ai-openai-spring-boot-starter。 2.最常用的展示方式是流式对话,AI的数据是一个字一个字生成的…...
python提问及解析
在看答案之前,可以先试试自己做哦! 1.图书馆借书还书系统 问题描述 问题:设计一个Python程序,该程序模拟一个大型图书馆的图书管理系统。图书馆拥有成千上万的书籍,每本书都有一个唯一的ISBN号、书名、作者、出版年份…...
从Apple Intelligence到IoT Intelligence,端侧生成式AI时代加速到来
9月10日凌晨1点,苹果新品发布会如期举行,全新iPhone16系列成为苹果生态中真正意义上的第一款原生AI手机,在第二代3nm工艺A18和A18 Pro芯片的加持下,iPhone16系列能够容纳并快速运行以Apple Intelligence为中心的生成式AI功能在手机…...
智能AC管理系统HTTPD-AC 1.0服务存在未授权访问漏洞
@[toc] 智能AC管理系统HTTPD-AC 1.0服务存在未授权访问漏洞 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
