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.mzph.cn/news/73268.shtml

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

相关文章

【科研论文配图绘制】task8 总结与回顾

task8 总结与回顾&#xff0c;这次组队学习大致掌握了常见python绘图工具包的使用&#xff0c;整体上和matlab的语法类似&#xff0c;也是用画布形式控制元素的绘制。印象深刻的是seaborn的使用&#xff0c;在之前做波士顿房价预测时候先接触了seaborn绘制的散点图、直方图和核…

【C++从0到王者】第二十八站:二叉搜索树的应用

文章目录 前言一、Key模型二、Key/Value模型总结 前言 二叉搜索树的在现实世界的应用很广泛&#xff0c;比如Key模型&#xff0c;Key-Value模型就是常见的两种的模型 一、Key模型 K模型&#xff1a;K模型即只有key作为关键码&#xff0c;结构中只需要存储Key即可&#xff0c…

Java是如何扩展加载Jar包?

java -jar参数运行应用时classpath的设置方法 当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候&#xff0c;你会发现如何设置-classpath参数应用程序都找不到相应的第三方类&#xff0c;报ClassNotFound错误。实际上这是由于当使用-jar参数运行的时候&#xf…

适用于Linux的Windows子系统(系统安装步骤)

目录 前言 一、WSL2安装 1.Microsoft参考文档&#xff08;推荐选择旧版 WSL 的手动安装步骤&#xff09; 2.开启子系统 二、Ubuntu安装 1.在Microsoft Store中获取ubuntu 2.运行ubuntu配置管理信息 3.ubuntu换源 三、WSL 与 Ubuntu的一些基础使用命令 四、Windows Terminal终端…

C++新特性:智能指针

一 、为什么需要智能指针 智能指针主要解决以下问题&#xff1a; 1&#xff09;内存泄漏&#xff1a;内存手动释放&#xff0c;使用智能指针可以自动释放 2&#xff09;共享所有权指针的传播和释放&#xff0c;比如多线程使用同一个对象时析构问题&#xff0c;例如同样的数据…

C#,《小白学程序》第十八课:随机数(Random)第五,方差及标准方差(标准差)的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十八课&#xff1a;随机数&#xff08;Random&#xff09;第五&#xff0c;方差及标准方差&#xff08;标准差&#xff09;的计算方法与代码 /// 方差 SUM(&#xff08;Xi - X)^2 ) / n i0...n-1 X Average of X[i] ///…

《DevOps实践指南》- 读书笔记(二)

DevOps实践指南 Part 2 从何处开始5. 选择合适的价值流作为切入点5.1 绿地项目与棕地项目5.2 兼顾记录型系统和交互型系统5.3 从最乐于创新的团队开始5.4 扩大 DevOps 的范围5.5 小结 6. 理解、可视化和运用价值流6.1 确定创造客户价值所需的团队6.2 针对团队工作绘制价值流图6…

【广州华锐互动】电厂三维数字孪生大屏的功能和优势

在工业互联网的背景下&#xff0c;电厂三维数字孪生大屏系统正在逐渐成为电力行业的重要技术。通过创建电厂的虚拟模型&#xff0c;这个数字孪生系统可以实现对实际电厂的实时监控&#xff0c;预测维护需求&#xff0c;优化运营效率&#xff0c;甚至在某些情况下&#xff0c;能…

内存溢出和内存泄漏的区别

文章目录 一、什么是内存二、定义不同三、产生原因不同四、处理方式不同五、影响程度不同六、检测工具不同 一、什么是内存 内存&#xff08;Memory&#xff09;是计算机用于存储和访问数据和指令的设备。它是计算机系统中的一个重要组成部分&#xff0c;用于临时存储和处理数…

jmeter 线程组 Open Model Thread Group 阶梯式压测、高峰流量压测

简介 Open Model Thread Group 是5.4.1 版本中引入的一个实验性线程组&#xff0c;可以弹性模拟负载测试。例如设置多个线程模式&#xff0c;再根据这些线程模式调整不同的并发数、暂停时间。由于Open Model Thread Group 是一个实验性线程组&#xff0c;可能会存在一些限制和不…

2.9 PE结构:重建导入表结构

脱壳修复是指在进行加壳保护后的二进制程序脱壳操作后&#xff0c;由于加壳操作的不同&#xff0c;有些程序的导入表可能会受到影响&#xff0c;导致脱壳后程序无法正常运行。因此&#xff0c;需要进行修复操作&#xff0c;将脱壳前的导入表覆盖到脱壳后的程序中&#xff0c;以…

【群智能算法改进】一种改进的鹈鹕优化算法 IPOA算法[2]【Matlab代码#58】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始POA算法2. 改进后的IPOA算法2.1 随机对立学习种群初始化2.2 动态权重系数2.3 透镜成像折射方向学习 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始POA算法…

【JavaScript】在指定dom元素前面创建标签元素

一、基础操作过程 要在指定的DOM元素前面创建标签元素&#xff0c;有以下步骤&#xff1a; 获取指定的DOM元素&#xff1a;使用document.querySelector()或document.getElementById()等方法来获取指定的DOM元素。 const targetElement document.querySelector(#targetElement…

数字展厅有什么优势,一文了解数字展厅建设方案

引言&#xff1a; 在当今数字化风潮的席卷下&#xff0c;企业们正积极寻求创新的方式来吸引和互动他们的客户。数字展厅作为一种新型的虚拟宣传工具&#xff0c;已经开始引起广泛的关注。 一&#xff0e;什么是数字展厅&#xff1f; 数字展厅是一种基于虚拟现实&#xff08;V…

【前端】在Vue页面中引入其它vue页面 数据传输 相互调用方法等

主页面 home 从页面 headView 需求 在 home.vue 中引用 headView.Vue 方案: home.vue 代码: 只需要在home.vue 想要的地方添加 <headView></headView> <script>//聊天页面 import headView /view/headView.vueexport default {components: {headView},…

淘宝商品销量接口API更新(总销+精准月销API)

不少客户有获取淘宝商品销量的需求&#xff0c;淘宝商品销量接口主要用于以下业务场景。有不齐全的欢迎大家补充。 库存管理&#xff1a;商家可以通过接口获取到实时的销量信息&#xff0c;更好地进行库存管理。供应链计划&#xff1a;商家可以通过接口了解到商品的销售趋势&a…

Unity的UI面板基类

使用这个组件实现淡入淡出 public abstract class BasePanel : MonoBehaviour {//控制面板透明度 用于淡入淡出private CanvasGroup canvasGroup;//淡入淡出速度private float alphaSpeed 10;//隐藏还是显示public bool isShow false;//隐藏完毕后做的事private UnityAction …

rosdep init 错误解决终极方法(药到病除)

参考文章 rosdep init 错误解决终极方法&#xff08;药到病除&#xff09;

图像分割--点、线和边缘检测

图像分割 图像分割是指将图像细分为构成它的子区域或物体本章算法基于灰度值的两个基本性质之一&#xff1a;不连续性和相似性 点、线和边缘检测 就像局部平均平滑一幅图像那样&#xff0c;假设平均处理类似于积分&#xff0c;对于灰度的突变&#xff0c;局部变化可以用微分…

thinkphp6 入门教程合集(更新中)

thinkphp6 入门&#xff08;1&#xff09;--安装、路由规则、多应用模式 thinkphp6 入门&#xff08;1&#xff09;--安装、路由规则、多应用模式_软件工程小施同学的博客-CSDN博客 thinkphp6 入门&#xff08;2&#xff09;--视图、渲染html页面、赋值 thinkphp6 入门&#…