Vue中如何实现城市3D分布图

178775c61d0b1e487633f49f70c844b4.png

cityfenbu.vue

<template><div ><el-card class="seriesmap-box-card"><div slot="header" class="clearfix"><span>城市分布图 (点击可下钻到县)</span></div><div><div class="series-map" :style="{height:height,width:width}" ref="seriesMap"></div></div></el-card></div></template><script>import resize from './resize.js';import echarts from 'echarts';import { getGeoJson } from './getGeoJson.js';import { getMapChartData } from './getMapChartData.js';export default {name: 'cityfenbu',mixins: [resize],props: {width: {type: String,default: '100%'},height: {type: String,default: '608px'}},data() {return {geoJson: {},parentInfo: [{cityName: '全国',code: 100000}]};},mounted() {this.$nextTick(() => {this.getMapJson();});},methods: {//获取geoJson 地图 已封装好直接传citycode就行getMapJson() {getGeoJson(this.parentInfo[this.parentInfo.length - 1].code).then(data => {this.geoJson = data;this.getMapData();});},//获取地图数据 模拟数据 数据格式:[{name:'武汉市',value:96},{name:'长沙市',value:75}]// 必须要写成这种,而且name名字要和地图的geoJson名字一样,不然渲染不出来getMapData() {getMapChartData(this.parentInfo[this.parentInfo.length - 1].code).then(res => {const data = res.data;this.initEchart(data);});},initEchart(data) {this.myChart = echarts.init(this.$refs.seriesMap);//设置为 china 则显示南海诸岛 ,不需要可以去掉echarts.registerMap(this.parentInfo.length === 1 ? 'china' : 'map', this.geoJson); //注册const mapData = data.sort((a, b) => {return b.value - a.value;});let max = mapData[0].value;let min = mapData[mapData.length - 1].value;if (mapData.length === 1) {min = 0;}this.myChart.setOption({tooltip: {},visualMap: {min: min,max: max,left: '3%',bottom: '1%',calculable: true,inRange: {color: ['#24CFF4', '#2E98CA', '#1E62AC']},textStyle: {color: '#24CFF4'}},series: [{name: '地图',type: 'map',map: this.parentInfo.length === 1 ? 'china' : 'map',roam: true, //是否可缩放zoom: 1.22, //缩放比例// left: '',// top: '15%', //可移动地图的位置data: mapData,label: {normal: {show: true,color: 'rgb(249, 249, 249)', //省份标签字体颜色formatter: p => {switch (p.name) {case '内蒙古自治区':p.name = '内蒙古';break;case '西藏自治区':p.name = '西藏';break;case '新疆维吾尔自治区':p.name = '新疆';break;case '宁夏回族自治区':p.name = '宁夏';break;case '广西壮族自治区':p.name = '广西';break;case '香港特别行政区':p.name = '香港';break;case '澳门特别行政区':p.name = '澳门';break;default:break;}return p.name;}},emphasis: {show: true,color: '#f75a00'}},itemStyle: {normal: {areaColor: '#24CFF4',borderColor: '#53D9FF',borderWidth: 1.3,shadowBlur: 15,shadowColor: 'rgb(58,115,192)',shadowOffsetX: 7,shadowOffsetY: 6},emphasis: {areaColor: '#8dd7fc',borderWidth: 1.6,shadowBlur: 25}}}]},true);this.myChart.getZr().off('click');this.myChart.getZr().on('click', params => {if (params.target) {// 点的是地图const index = params.target.dataIndex;if (index && data[index]) {//如果当前是最后一级了,就直接returnif (this.parentInfo[this.parentInfo.length - 1].code == data[index].adcode) {return;}//根据这个level判断是否下钻到县// if (data[index].level == 'city') {// return// }this.parentInfo.push({cityName: data[index].name,code: data[index].adcode});this.getMapJson();this.$notify.info({title: '温馨提示',message: '点击地图空白处即可返回上一级'});}} else {//点的空白部分if (this.parentInfo.length === 1) {return;}this.parentInfo.pop();this.getMapJson();}});}}};</script><style lang="scss" scoped>.seriesmap-box-card {color:rgb(191, 203, 217);background:#2d3a4b;width: 100%;height: 100%;font-size: 14px;.clearfix:before,.clearfix:after {display: table;content: "";}.clearfix:after {clear: both}.series-map {cursor:move;}}</style>

resize.js

import { debounce } from "./debounce.js";
export default {data() {return {myChart: null,resizeHandler: null};},computed: {},mounted() {this.resizeHandler = debounce(() => {if (this.myChart) {this.myChart.resize();}}, 100);this.initResizeEvent();},methods: {//监听resizeinitResizeEvent() {window.addEventListener("resize", this.resizeHandler);},//移除resizedestroyResizeEvent() {window.removeEventListener("resize", this.resizeHandler);}},beforeDestroy() {this.destroyResizeEvent();if (!this.myChart) {return;}this.myChart.dispose();this.myChart.off("click");this.myChart = null;},activated() {this.initResizeEvent();if (this.myChart) {this.myChart.resize();}},deactivated() {this.destroyResizeEvent();},watch: {}
};

getGeoJson.js

/*** 获取geoJson数据 通过高德获取 递归获取区县geoJson* @param {string} adcode 行政区code* @param {string} childAdcode 区县级行政区code* @return {Array}*/import remoteLoad from "./remoteLoad.js";
const  {AMapCDN, AMapUiCDN} = require("./cdn.js");export function getGeoJson(adcode, childAdcode = "") {return new Promise((resolve, reject) => {if (window.AMap && window.AMapUI) {insideFun(adcode, childAdcode);} else {remoteLoad(AMapCDN).then(() => {if (window.AMap) {remoteLoad(AMapUiCDN).then(() => {if (window.AMapUI) {insideFun(adcode, childAdcode);} else {console.error("AMapUI获取失败");}});} else {console.error("AMap获取失败");}});}function insideFun(adcode, childAdcode) {// eslint-disable-next-lineAMapUI.loadUI(["geo/DistrictExplorer"], DistrictExplorer => {var districtExplorer = new DistrictExplorer();districtExplorer.loadAreaNode(adcode, function(error, areaNode) {if (error) {console.error(error);reject(error);return;}let Json = areaNode.getSubFeatures();if (Json.length === 0) {let parent = areaNode._data.geoData.parent.properties.acroutes;insideFun(parent[parent.length - 1], adcode);return;}if (childAdcode) {Json = Json.filter(item => {return item.properties.adcode == childAdcode;});}let mapJson = {features: Json};resolve(mapJson);});});}});}

getMapChartData.js

import { getGeoJson } from "./getGeoJson.js";/** 地图数据* @param {string} adcode 城市code* @returns {Array}*/
export function getMapChartData(adcode) {return new Promise((resolve, reject) => {getGeoJson(adcode).then(res => {const data = res.features;const mapData = data.map(item => {return {name: item.properties.name,value: parseFloat((Math.random() * 3000).toFixed(2)),adcode: item.properties.adcode,level: item.properties.level};});resolve({code: 200,data: mapData});}).catch(error => {reject(error);});});
}/** 地图数据 散点* @param {string} adcode 城市code* @returns {Array}*/
export function getPointChartData(adcode) {return new Promise((resolve, reject) => {getGeoJson(adcode).then(res => {const data = res.features;const mapData = data.map(item => {return {name: item.properties.name,value: [item.properties.center[0],item.properties.center[1],parseFloat((Math.random(0.1, 1) * 1000).toFixed(2))],adcode: item.properties.adcode,level: item.properties.level};});resolve({code: 200,data: mapData});}).catch(error => {reject(error);});});
}/** 地图数据 热力图* @param {string} adcode 城市code* @returns {Array}*/
export function getHotMapChartData(adcode) {const data = [{name: "地点1",value: [114.412021, 30.481201, 1000]},{name: "地点2",value: [114.411266, 30.480921, 1000]},{name: "地点3",value: [114.411985, 30.481387, 1000]},{name: "地点4",value: [114.411159, 30.481917, 1000]},{name: "地点5",value: [114.412488, 30.481917, 1000]},{name: "地点6",value: [114.413638, 30.482726, 1000]},{name: "地点7",value: [114.412344, 30.48341, 1000]},{name: "地点8",value: [114.413494, 30.483939, parseInt(Math.random(0.6, 1) * 1000)]},{name: "地点9",value: [114.411877, 30.484469, parseInt(Math.random(0.6, 1) * 1000)]},{name: "地点10",value: [114.412308, 30.484531, parseInt(Math.random(0.6, 1) * 1000)]},{name: "地点11",value: [114.407853, 30.4845, parseInt(Math.random(0.6, 1) * 1000)]},{name: "地点12",value: [114.407242, 30.48285, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点13",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点14",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点15",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点16",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点17",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点18",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点19",value: [114.412021, 30.481201, parseInt(Math.random(0.1, 0.5) * 1000)]},{name: "地点20",value: [114.447306, 30.560407, parseInt(Math.random(0.1, 0.9) * 1000)]},{name: "地点21",value: [114.296104, 30.600017, parseInt(Math.random(0.1, 0.9) * 1000)]},{name: "地点22",value: [114.29402, 30.597406, parseInt(Math.random(0.1, 0.9) * 1000)]},{name: "地点23",value: [114.300487, 30.595106, parseInt(Math.random(0.1, 0.9) * 1000)]},{name: "地点24",value: [114.295026, 30.592805, parseInt(Math.random(0.1, 0.9) * 1000)]},{name: "地点25",value: [114.291648, 30.597282, 1000]},{name: "地点26",value: [114.287408, 30.599147, 1000]},{name: "地点27",value: [114.282378, 30.598649, 1000]},{name: "地点28",value: [114.286689, 30.600514, 1000]}];return new Promise((resolve, reject) => {resolve({code: 200,data: data});});
}

remoteLoad.js

const remoteLoad = url => {return new Promise((resolve, reject) => {const existingScript = document.getElementById(url);//如果script不存在if (!existingScript) {const script = document.createElement("script");script.id = url;script.src = url;script.async = true;document.body.appendChild(script);script.onload = function() {setTimeout(() => {this.onerror = this.onload = null;resolve();}, 500);};script.onerror = function() {this.onerror = this.onload = null;reject("加载失败" + url);};} else {setTimeout(() => {resolve();}, 500);}});};export default remoteLoad;

cdn.js

const AMapCDN ="https://webapi.amap.com/maps?v=1.3&key=73cddabc2173e0166a622f4483d3592a&plugin=AMap.DistrictSearch";
const AMapUiCDN = "https://webapi.amap.com/ui/1.0/main.js";
const VueCDN = "https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js";
const AxiosCDN = "https://cdn.bootcdn.net/ajax/libs/axios/0.21.0/axios.min.js";
const VueRouterCDN ="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js";
const VuexCDN = "https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js";
const TinymceCDN ="https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js";
const html2canvasCDN ="https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.7/dist/html2canvas.min.js";module.exports = {AMapCDN,AMapUiCDN,VueCDN,AxiosCDN,VueRouterCDN,VuexCDN,TinymceCDN,html2canvasCDN
};

视频号如何做视频任务进行变现

2023-09-05

380aa791f41ecbf439667a54d080e02a.jpeg

视频号如何插入带货商品链接进行变现

2023-09-04

18d58b43f50326bf75f5ddf723f04b24.jpeg

36岁男子自称被裁,曾是前500强公司市场总监,最后接受做外买

2023-09-03

2944e1dee434498ac35ac381d15e1185.jpeg

聊一下互联网红利并牢牢抓住

2023-09-02

b0b405f1be0254fb3c3ed981e3f1f698.jpeg

关于大学考研与不考研自己一点看法

2023-09-01

1d31375fc500862aefaaa7729b46ed15.jpeg

css中文本阴影特效

2023-08-30

f937bf70bf5017f39012ba075716e048.jpeg

8d5b7ba2bc51eef1736bdce50d22f2f7.png

(能绘画,能问答)

f43e85a14eb42c562714935bde373b41.jpeg

(拓展人脉,圈子)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言练习45:模拟实现内存函数memcpy

模拟实现内存函数memcpy 针对内存块&#xff0c;不在乎内存中的数据。 拷贝内容有重叠的话应用memmove 模拟实现&#xff1a; 代码&#xff1a; 模拟实现memcpy #include<stdio.h> #include<assert.h> void* my_memcpy(void* dest, const void* src, size_t num…

【Linux】网络编程网络基础(C++)

目录 一、计算机网络背景 二、认识 "协议" 三、网络协议初识 【3.1】协议分层 【3.2】OSI七层模型 【3.3】TCP/IP五层(或四层)模型 四、网络传输基本流程 【4.1】网络传输流程图 【4.2】数据包封装和分用 五、网络中的地址管理 一、计算机网络背景 【独立…

谷粒商城----缓存与分布式锁

1、缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而 db 承担数据落盘工作。 哪些数据适合放入缓存&#xff1f;  即时性、数据一致性要求不高的  访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&…

The WebSocket session [x] has been closed and no method (apart from close())

在向客户端发送消息时&#xff0c;session关闭了。 不管是单客户端发送消息还是多客户端发送消息&#xff0c;在发送消息之前判断session 是否关闭 使用 isOpen() 方法

Nginx 学习(九)集群概述与LVS工作模式的配置

一 集群 1 概述 通过高速网络将很多服务器集中起来一起提供同一种服务&#xff0c;在客户端看来就像是只有一个服务器可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益任务调度是集群系统中的核心技术 2 目的 提高性能。如计算密集型应用&…

【C++进阶】:AVL树(平衡因子)

AVL树 一.概念二.插入1.搜索二叉树2.平衡因子 三.旋转1.更新平衡因子2.旋转1.左单旋2.右单旋3.先右旋再左旋4.先左旋再右旋 四.完整代码 一.概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元…

2023区块链应用操作员认证(4级)报名来弘博创新

区块链应用操作员&#xff0c;是指运用区块链技术及工具&#xff0c;从事政务、金融、医疗、教育、养老等场景系统应用操作的人员。 腾讯作为广东省第一批公布的社会培训评价组织&#xff0c;可开展职业技能等级认定职业(工种)区块链应用操作员(4-3-2-1级)。 证书含金量 证书是…

Redis 删除策略

文章目录 Redis 删除策略一、过期数据二、数据删除策略1、定时删除2、惰性删除3、定期删除4、删除策略对比 三、逐出算法 Redis 删除策略 一、过期数据 Redis是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态 XX &a…

100万级连接,爱奇艺WebSocket网关如何架构

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/微…

BPPISE数据科学案例框架

本专题共10篇内容&#xff0c;包含淘宝APP基础链路过去一年在用户体验数据科学领域&#xff08;包括商详、物流、性能、消息、客服、旅程等&#xff09;一些探索和实践经验。 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升&#xff1b;在物流侧洞察用户求助时间与…

Kafka3.0.0版本——增加副本因子

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、增加副本因子3.1、增加副本因子的概述3.2、增加副本因子的示例3.2.1、创建topic(主题)3.2.2、手动增加副本存储 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节点…

被问到: http 协议和 https 协议的区别怎么办?别慌,这篇文章给你答案

前言 作为软件测试师&#xff0c;大家都知道一些常用的网络协议是我们必须要了解和掌握的&#xff0c;比如 HTTP 协议&#xff0c;HTTPS 协议就是两个使用非常广泛的协议&#xff0c;所以也是面试官问的面试的时候问的比较多的两个协议&#xff1b;因为这两个协议有相似和关联的…

为什么说网络安全是风口行业?是it行业最后的红利?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万&…

移除链表元素_每日一题

“路虽远&#xff0c;行则将至” ❤️主页&#xff1a;小赛毛 ☕今日份刷题&#xff1a;移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例1&…

初步了解android如何锁键

百年三万六千日&#xff0c;光阴只有瞬息间。 手机下面的三个图形&#xff0c;正方形&#xff0c;园形&#xff0c;三角形分别的什么建&#xff1f;都起到什么功能&#xff1f; 三角形的那个叫返回键&#xff0c;就是可以返回你的上一个操作; 圆形是HOME键&#xff0c;按一下可…

使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决

记录&#xff1a;471 场景&#xff1a;使用IntelliJ IDEA本地启动调试Flink流计算时&#xff0c;报错一&#xff1a;加载DataStream报错java.lang.ClassNotFoundException。报错二&#xff1a;No ExecutorFactory found to execute the application。 版本&#xff1a;JDK 1.…

实现在一张图片中寻找另一张图片的目标

OpenCV库中的SIFT特征检测算法和FLANN&#xff08;快速最近邻搜索库&#xff09;匹配算法来找到一个图片中的元素在另一个图片中的位置&#xff0c;并在源图片中标出它们的位置。 以下是一个简单的例子&#xff0c;使用OpenCV库&#xff0c;利用SIFT特征检测算法&#xff0c;在…

无涯教程-JavaScript - IMABS函数

描述 IMABS函数以x yi或x yj文本格式返回复数的绝对值(模)。 Excel中的复数 复数简单地以文本形式存储在Excel中。 当将格式为" a bi"或" a bj"的文本字符串提供给Excel的内置复数函数之一时,这被解释为复数。 复数函数可以接受简单数值,因为它等效…

PostgreSQL 数据库使用 psql 导入 SQL

最近我们有一个 SQL 需要导入到 PostgreSQL &#xff0c;但数据格式使用的是用&#xff1a; -- -- TOC entry 7877 (class 0 OID 21961) -- Dependencies: 904 -- Data for Name: upload_references; Type: TABLE DATA; Schema: public; Owner: - --COPY public.upload_refere…

持续集成/技术交付全流程流水线工具的设计与落地

文章目录 持续集成/技术交付全流程流水线工具的设计与落地概述工具架构设计主要功能模块代码库Jenkins 流水线代码构建自动化测试产品部署监控报警 使用方法步骤一&#xff1a;安装 Jenkins步骤二&#xff1a;创建 Jenkins 流水线步骤三&#xff1a;配置监控报警步骤四&#xf…