vue-cli3使用Echarts 3D地图省市区下钻和坐标定位
Echarts 平面地图省市区下钻 网上有很多例子 我们就不在赘述了。现在网上关于3D下钻的例子很少,或者有些作者根本就没有尝试过,只是拿平面的代码改一改说是可以下钻,其实事件都不生效的。
实现的主要原理就是在emphasis属性里获取到当前鼠标所在的区域名称然后配合myChart.getZr()事件来配合下钻,当时也是借鉴了别人的想法和创意做了修改,当然最终还是会有小bug,比方说点击图标的时候会触发myChart.getZr()事件,当然每个人的需求不同,我这里是跳转,所以加了router,我这里包含了一下无用的代码,有需要的同学自行删除,下面我们看代码,
<template><div>
<!-- <el-row :gutter="20"> -->
<!-- <el-col :sm="10" :md="10" :lg="10" :xl="10"> -->
<!-- <el-card class="box-card"> -->
<div>
<p v-if="false">
<span @click="getChina">返回</span>
<!-- <el-button>中国</el-button> -->
<span @click="getProvince">{{ province }}</span>
<span>{{ city }}</span>
<!-- <el-button class="backBtn" @click="back()">返回上级</el-button> -->
</p>
<div id="mapChart" class="map"></div>
<!-- <div id="map" class="map"></div>
<div id="map2" class="map"></div>-->
</div>
<!-- </el-card> -->
<!-- </el-row> -->
</div>
</template>
<script>
import echarts from "echarts";
import { getCrmCustomer, getDeviceCount } from "@/api/overview";
require("echarts/lib/chart/map");
import cityMap from "@/js/china-main-city-map.js";
let img05 =
\'path://d="M10,1A10,10,0,0,0,0,11C0,15.92,8.06,25.35,9.69,27.2a.37.37,0,0,0,.57,0c1.62-1.85,9.68-11.28,9.68-16.23A10,10,0,0,0,10,1Zm0,14.9a4,4,0,1,1,4-4A4,4,0,0,1,10,15.9Z"\';
var chinaId = 320000;
var chinaName = "江苏";
// var chinaId = 320100;
// var chinaName = "南京";
var chinaJson = null;
//记录父级ID、Name
var mapStack = [];
var parentId = null;
var parentName = null;
//Echarts地图全局变量,主要是在返回上级地图的方法中会用到
var myChart = null;
export default {
props: {
cityName: {},
},
data() {
return {
userS: "",
pieShow: false,
map: "江苏",
province: "江苏",
city: "",
pList: [
"安徽",
"福建",
"甘肃",
"广东",
"广西",
"贵州",
"海南",
"河北",
"黑龙江",
"湖北",
"湖南",
"江苏",
"江西",
"吉林",
"辽宁",
"内蒙古",
"宁夏",
"青海",
"山东",
"山西",
"四川",
"台湾",
"西藏",
"新疆",
"云南",
"浙江",
],
guanwang: [
{
//江阴
name: "江阴-供水管道1",
value: [120.388168, 31.813939, 250],
type: "guanwang",
maintainOrg: "江阴供水总公司",
checker: "供水管道检查员1",
lastCheckTime: "2020-01-21 10:30",
},
{
//江阴
name: "江阴-供水管道2",
value: [120.15185, 31.9118, 250],
type: "guanwang",
maintainOrg: "江阴供水总公司2",
checker: "供水管道检查员2",
lastCheckTime: "2020-01-21 15:30",
},
],
mapId: "",
area: "",
};
},
watch: {
cityName(val) {
if (val.type == "city") {
this.area = val.name + "市";
} else {
this.area = val.name;
}
this.cityNameToLoad();
},
},
mounted() {
// this.getCrm();
this.mapChart("mapChart");
},
methods: {
// 用户定位
getCrm() {
let data = {
systemCode: "", //TODO
name: this.cityName,
};
getCrmCustomer(data).then((res) => {
if (res.data.code == 0) {
let data = res.data.data;
this.userS = data.length;
this.guanwang = [];
for (let i = 0; i < data.length; i++) {
if (data[i].latBd && data[i].lagBd) {
this.guanwang.push({
value: [data[i].lagBd, data[i].latBd, 250],
code: data[i].code,
name: data[i].name,
});
}
}
this.mapChart("mapChart");
} else {
// this.all();
}
});
},
getChina() {
// console.log(mapStack, "r");
this.registerAndsetOption(myChart, chinaId, chinaName, chinaJson, false);
},
getProvince() {
var cityId = cityMap[this.province];
const mapJson = require("./../../../config/json/map/" + cityId + ".json");
this.registerAndsetOption(myChart, cityId, this.province, mapJson, true);
},
/**
* 返回上一级地图
*/
back() {
if (mapStack.length != 0) {
//如果有上级目录则执行
var map = mapStack.pop();
// this.$http
// .get("./../../config2/json/map/" + map.mapId + ".json", {})
// .then(response => {
const mapJson = require("./../../../config/json/map/" +
map.mapId +
".json");
this.registerAndsetOption(
myChart,
map.mapId,
map.mapName,
mapJson,
false
);
//返回上一级后,父级的ID、Name随之改变
parentId = map.mapId;
parentName = map.mapName;
// });
}
},
/**
* Echarts地图
*/
mapChart(divid) {
const mapJson = require("./../../../config/json/map/" +
chinaId +
".json"); //response.data;
chinaJson = mapJson;
myChart = echarts.init(document.getElementById("mapChart"));
this.registerAndsetOption(myChart, chinaId, chinaName, mapJson, true);
let that = this;
parentId = chinaId;
parentName = "china";
this.listenerCharts(myChart);
},
registerAndsetOption(myChart, id, name, mapJson, flag) {
let that = this;
myChart.clear();
echarts.registerMap(name, mapJson);
myChart.setOption(
{
// backgroundColor: "#0f375f",
tooltip: {
trigger: "item",
position: "inside",
formatter: function (params) {},
backgroundColor: "default: \'rgba(50,50,50,0.7)\'",
textStyle: {
color: "#FFFFFF",
textalign: "center",
fontSize: "12px",
},
},
grid: {
top: "5%",
left: "12%",
right: "5%",
bottom: "20%",
},
legend: {
orient: "vertical",
id: 1,
y: "center",
x: "left",
itemWidth: 15,
data: [
{
name: "签约公司",
icon: img05,
},
],
textStyle: {
color: "#fff",
},
},
geo3D: {
show: true,
map: name,
// opacity: 0,
label: {
show: true, //是否显示市
textStyle: {
color: "#E1FFFF", //文字颜色
fontSize: 12, //文字大小
backgroundColor: "rgba(0,0,0,.5)", //透明度0清空文字背景
// backgroundColor: "blue",
},
},
emphasis: {
//当鼠标放上去 地区区域是否显示名称
label: {
show: true,
formatter: (params) => {
this.area = params.name;
// console.log(this.area, "this.area");
return params.name;
},
textStyle: {
// color: "#fff",
// fontSize: 16,
// backgroundColor: "rgba(0,23,11,0)",
},
},
},
viewControl: {
distance: 90, //地图视角 控制初始大小
rotateSensitivity: 1, //禁止旋转
zoomSensitivity: 1, //禁止缩放
},
zoom: 1.2,
roam: true,
// environment: new echarts.graphic.LinearGradient(
// 0,
// 0,
// 0,
// 1,
// [
// {
// // 配置为垂直渐变的背景
// offset: 0,
// color: "#00aaff", // 天空颜色
// },
// {
// offset: 0.7,
// color: "#998866", // 地面颜色
// },
// {
// offset: 1,
// color: "#998866", // 地面颜色
// },
// ],
// false
// ),
itemStyle: {
color: "rgba(100,149,237,.3)", //地图颜色
borderWidth: 5, //设置外层边框
borderColor: "rgba( 0,255,255,1)",
shadowColor: "rgba(0,54,255, 1)",
shadowBlur: 150,
borderWidth: 1, //分界线wdith
// borderColor: "#459bca" //分界线颜色
// shadowColor: "red",
// shadowBlur: 10
},
},
series: [
{
name: "签约公司",
type: "scatter3D",
aspectScale: 0.75,
coordinateSystem: "geo3D",
data: this.guanwang,
symbol: img05,
symbolSize: function (val) {
return val[2] / 8;
},
boxDepth: 90,
regionHeight: 8,
label: {
normal: {
show: false,
formatter: function (params) {
// console.log(params);
//return params.name;
return params.name;
},
position: "right",
color: "#fff",
fontSize: "8",
},
emphasis: {
show: true,
},
},
itemStyle: {
normal: {
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
// {
// offset: 0,
// color: "#24ebd7",
// },
// {
// offset: 1,
// color: "#DAC929",
// },
// ]),
color: "#24ebd7",
borderWidth: 0,
// borderColor: "#f4b391",
},
},
},
],
},
true
);
if (flag) {
//往mapStack里添加parentId,parentName,返回上一级使用
mapStack.push({
mapId: parentId,
mapName: parentName,
});
parentId = id;
parentName = name;
}
window.addEventListener("resize", () => {
myChart.resize();
});
},
initMapData(mapJson) {
var mapData = [];
for (var i = 0; i < mapJson.features.length; i++) {
mapData.push({
name: mapJson.features[i].properties.name,
//id:mapJson.features[i].id
});
}
console.log(mapData, "mapData");
return mapData;
},
cityNameToLoad() {
echarts.init(document.getElementById("mapChart")).dispose();
let that = this;
var cityId = cityMap[that.area];
myChart = echarts.init(document.getElementById("mapChart"));
this.listenerCharts(myChart);
if (this.area) {
if (cityId) {
//代表有下级地图
// this.$http
// .get("./../../config2/json/map/" + cityId + ".json", {})
// .then(response => {
const mapJson = require("./../../../config/json/map/" +
cityId +
".json");
that.$nextTick(() => {
that.registerAndsetOption(
myChart,
cityId,
this.area,
mapJson,
true
);
});
// });
}
}
},
listenerCharts(myChart) {
var that = this;
myChart.on("click", function (e) {
console.log(e, "eee");
// that.$router.push({
// path: "/electricityconsumptionanalysis",
// });
});
myChart.getZr().on("click", function (e) {
console.log(e,\'dsfds\')
myChart.containPixel("series");
let mouseStyle = document.getElementById("mapChart").children[0].style
.cursor;
if (that.pList.indexOf(that.area) > 0) {
that.province = that.area;
} else {
that.city = that.area;
}
var cityId = cityMap[that.area];
if (that.area && mouseStyle == "pointer" && !e.target) {
if (cityId) {
//代表有下级地图
const mapJson = require("./../../../config/json/map/" +
cityId +
".json");
that.$nextTick(() => {
that.registerAndsetOption(
myChart,
cityId,
that.area,
mapJson,
true
);
});
}
}
});
},
},
};
</script>
<style lang="scss" scoped>
.container {
padding: 20px 30px;
}
.map {
// height: 600px;
height: 80vh;
width: 100%;
}
.conbox {
border: 1px solid #ccc;
padding: 5px 20px;
}
.content {
display: flex;
justify-content: space-between;
height: 40px;
line-height: 40px;
}
.piebox {
// min-width: 500px;
width: 500px;
height: 220px;
}
.monitoringObjects {
width: 100%;
height: 358px;
// height: 40vh;
margin-top: 20px;
margin-bottom: 20px;
}
.coulometricChart {
width: 100%;
height: 358px;
}
.chattitle {
display: flex;
justify-content: space-between;
}
</style>
上两张效果图
项目结构
最后分享一下省市区json文件下载的地址https://hxkj.vip/demo/echartsMap/
缺少json文件的同学可以根据自己的需要下载,
以上是 vue-cli3使用Echarts 3D地图省市区下钻和坐标定位 的全部内容, 来源链接: utcz.com/z/378114.html