记录一下大屏开发中使用到的echarts-gl
大屏的页面根据需求前前后后改了几个版本了,地图的样式也改了又改
这里记录一下,因为echarts属性用到的比较多也比较杂,防止以后需要用到忘记了
目录
初始效果
效果图:
适应大屏风格的发光地图效果,用了两个图层实现叠加背景图片实现:编辑
安装命令
创建一个div用来挂载地图
完整代码:
总结
初始效果
效果图:
适应大屏风格的发光地图效果,用了两个图层实现叠加背景图片实现:
安装命令
首先在项目中安装echarts与echarts gl(echers gl用于3d)
安装命令
npm install echarts --save //echarts安装命令
npm install echarts-gl //echarts-gl安装命令
安装完成后在package.json中查看有没有安装成功
安装成功后在main.js中引入
import echartsGL from 'echarts-gl' // 引入echarts
Vue.prototype.$echartsGL = echartsGL // 引入组件(将echarts注册为全局)
使用 http://datav.aliyun.com/portal/school/atlas/area_selector这个工具获取要显示的地图数据
存放在放静态资源的地方,创建一个json文件
这些没问题后,就可以在组件中进行操作了
<template>
<div id="hello">
</div>
</template>
创建一个div用来挂载地图
在script中引入存放地图数据的json文件
import * as echarts from 'echarts';
import geoJson from "../assets/mapJSon/rkz.json"
import coordtransform from 'coordtransform'
export default {
name: 'MapDemo',
data() {
return {
dataIndex: 0,
mTime:null
}
},
props: {
msg: String
},
methods: {
convertCoord(coord) {
const gcj02 = coordtransform.wgs84togcj02(coord[0], coord[1])
const bd09 = coordtransform.gcj02tobd09(gcj02[0], gcj02[1])
return bd09
},
},
mounted() {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('hello'));
var scatterData = [
{ name: "亚东县", value: "2945米" },
{ name: "仁布县", value: "3950米" },
{ name: "谢通门县", value: "4008米" },
{ name: "萨迦县", value: "4330米" },
{ name: "拉孜县", value: "4012米" },
{ name: "昂仁县", value: "4320米" },
{ name: "江孜县", value: "约4000米" },
{ name: "白朗县", value: "平均4200米" },
{ name: "聂拉木县", value: "4300米" },
{ name: "昂仁县", value: "4320米" },
{ name: "岗巴县", value: "4700米以上" },
{ name: "定结县", value: "2500-4700米" },
{ name: "定日县", value: "平均5000米。" },
{ name: "吉隆县", value: "4200米" },
{ name: "萨嘎县", value: "4487米" },
{ name: "仲巴县", value: "4772米" },
{ name: "南木林县", value: "3790米到4952米" },
{ name: "桑珠孜区", value: "3840米" },
{ name: "康马县", value: "4200-4600米" }
];
// 绘制图表
let option = {
// backgroundColor: "#fff",
tooltip: {
// 鼠标是否可以进入悬浮框
show: true,
confine: true,
enterable: true,
// 触发方式 mousemove, click, none, mousemove|click
triggerOn: 'mousemove',
// item 图形触发, axis 坐标轴触发, none 不触发
trigger: 'item',
// 浮层隐藏的延迟
hideDelay: 100,
// 背景色
backgroundColor: 'rgba(110, 110, 110,.5)',
formatter: function (params) {
const altitudeMap = {
'亚东县': '2945米',
'仁布县': '3950米',
'谢通门县': '4008米',
'萨迦县': '4330米',
'拉孜县': '4012米',
'昂仁县': '4320米',
'江孜县': '约4000米',
'白朗县': '平均4200米',
'聂拉木县': '4300米',
'岗巴县': '4700米以上',
'定结县': '2500-4700米',
'定日县': '平均5000米',
'吉隆县': '4200米',
'萨嘎县': '4487米',
'仲巴县': '4772米',
'南木林县': '3790米到4952米',
'桑珠孜区': '3840米',
'康马县': '4200-4600米',
};
return `
<div style="background-color: #ffffff;box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);padding: 20px;border-radius: 5px;font-size: 36px;color: #333;z-index: 1000;border-color:#333">
<div style="font-weight: bold;margin-bottom: 30px;">${params.name}</div>
<div>海拔:${altitudeMap[params.name] ? altitudeMap[params.name] : '未知'}</div>
</div>
`
}
},
geo3D: {
show: true,
map: "centerMap",
left: "4%", //偏移量调整
top: "5%", //偏移量调整
roam: true,
zoom: 10,
regionHeight: 5,
label: {
show: true,
distance: 200,
borderRadius: 0,
distanca: 0,
fontSize: 30,
color: "#ffffff", // 地图初始化区域字体颜色
borderWidth: 0,
borderColor: '#ffffff'
},
itemStyle: {
// 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
color: "#271f71", // 地图板块的颜色
fontSize: 30,
opacity: 1, // 图形的不透明度 [ default: 1 ]
borderWidth: 10, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
borderColor: "#6a63f4", // 图形描边的颜色。[ default: #333 ]
},
emphasis: {
label: {
show: true,
color: "#000000", //悬浮字体颜色
fontSize: 38,
},
itemStyle: {
color: "#e2e1e1",
opacity: 1,
},
},
// shading: "color",
light: {
// 光照阴影
main: {
color: "#FFFFFF", // 光照颜色
intensity: 2, // 光照强度
shadowQuality: "light", // 阴影亮度
shadow: true, // 是否显示阴影
alpha: 50,
beta: 10,
},
},
regions: [],
viewControl: {
"projection": "perspective",
"autoRotate": false,
"autoRotateAfterStill": 3,
"distance": 100.1931248935421, //默认比例
"alpha": 83.592048936336816,
"beta": 0.48683006219769,
"minAlpha": 5,
"maxAlpha": 40,
"minBeta": -1036800,
"maxBeta": 1036800,
"animation": true,
"animationDurationUpdate": 1000,
"animationEasingUpdate": "cubicInOut",
"orthographicSize": 60,
"autoRotateDirection": "cw",
"autoRotateSpeed": 10,
"damping": 0.8,
"rotateSensitivity": 1,
"zoomSensitivity": 1,
"panSensitivity": 1,
"panMouseButton": "middle",
"rotateMouseButton": "left",
"minDistance": 40,
"maxDistance": 400,
"maxOrthographicSize": 400,
"minOrthographicSize": 20,
"center": [
0,
0,
0, 0
]
},
},
series: [
{
type: "map3D", // 加载series数据
seriesIndex: 0, // 第一个系列
map: "centerMap",
regionHeight: 0,
boxHeight: 500,
// left: 0,
left: "4%", //偏移量调整
top: "5%", //偏移量调整
itemStyle: {
// 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
color: "rgba(37, 37, 38,1)", // 地图板块的颜色
opacity: 0, // 图形的不透明度 [ default: 1 ]
borderWidth: 0, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
borderColor: "#69E8F5", // 图形描边的颜色。[ default: #333 ]
},
label: {
show: true,
color: "#FFFFFF",
},
regions: [],
zlevel: 5,
viewControl: {
"projection": "perspective",
"autoRotate": false,
"autoRotateAfterStill": 3,
"distance": 100.1931248935421, //默认比例
"alpha": 83.592048936336816,
"beta": 0.48683006219769,
"minAlpha": 5,
"maxAlpha": 40,
"minBeta": -1036800,
"maxBeta": 1036800,
"animation": true,
"animationDurationUpdate": 1000,
"animationEasingUpdate": "cubicInOut",
"orthographicSize": 60,
"autoRotateDirection": "cw",
"autoRotateSpeed": 10,
"damping": 0.8,
"rotateSensitivity": 1,
"zoomSensitivity": 1,
"panSensitivity": 1,
"panMouseButton": "middle",
"rotateMouseButton": "left",
"minDistance": 40,
"maxDistance": 400,
"maxOrthographicSize": 400,
"minOrthographicSize": 20,
"center": [
0,
-5,
0,
]
},
},
{
type: "scatter3D",
coordinateSystem: "geo3D",
data: [],
symbol: "pin",
symbolSize: 20,
animation: true,
animationDurationUpdate: 500,
geo3DIndex: 0,
silent: false,
itemStyle: {
opacity: 1,
width: 1,
},
shading: "lambert",
label: {
show: false,
position: "right",
distance: 200, // 距离图形元素的距离
color: "#ff0000",
backgroundColor: "rgba(255, 255, 255, 0)",
rich: {
get: {
color: "#00E3FF",
lineHeight: 12,
},
set: {
color: "#FFF100",
lineHeight: 12,
},
date11: {
color: "#FFFFFF",
lineHeight: 12,
},
},
zlevel: 6,
},
emphasis: {
itemStyle: {
color: "#FFF200",
},
label: {
show: false,
},
},
zlevel: 6,
},
],
};
// myChart.showLoading();
echarts.registerMap('centerMap', geoJson);
// myChart.hideLoading();
var mapFeatures = echarts.getMap("centerMap").geoJson.features;
var geoCoordMap = {};
mapFeatures.forEach(function (v) {
// v.properties.center = _this.convertCoord(v.properties.center)
// 地区名称
var name = v.properties.name;
// 地区经纬度
geoCoordMap[name] = v.properties.center;
});
let currentIdx = -1;
function highlightNext() {
if (currentIdx++ >= 0) {
// 防止下标增加到超过区域数组长度
currentIdx %= mapFeatures.length;
}
highlightRegion(currentIdx) // 此处的currentIdx经过if判断,已经+1了
setTimeout(highlightNext, 5000);
}
function highlightRegion(index) { // 高亮地图区域,改变对应的散点样式
let regionName = mapFeatures[index].properties.name; // 高亮的区名
option.geo3D.regions = [ // 高亮3D地图对应的区块
{
name: regionName,
label: {
show: true,
color: "##000000",
},
itemStyle: {
color: "#ffffff",
opacity: 1,
}
}
];
// 当前高亮区域有散点,需删除stroke动效中的该条数据并在fill动效中增加该条数据
option.series[0].data = scatterData.filter(item => item.name !== regionName); // stroke散点数据
option.series[1].data = scatterData.filter(item => item.name === regionName); // fill散点数据
myChart.setOption(option);
myChart.dispatchAction({ // 触发散点高亮事件,改变标签样式
type: 'showTip',
seriesIndex: 1, // series中的第二个图层(fill散点图层)
dataIndex: 0 // 高亮第一条数据,由于fill散点图层只有一条数据,这里可以不指定
});
myChart.dispatchAction({
type: 'highlight',
seriesIndex: 0,
dataIndex: 0
});
// 显示弹框
myChart.dispatchAction({
type: 'showTip',
seriesIndex: 0,
dataIndex: 0
});
// myChart.on('mouseover', () => {
// console.log('mouseover')
// // 停止定时器,清除之前的高亮
// clearInterval(this.mTime)
// this.mTime = ''
// myChart.dispatchAction({
// type: 'downplay',
// seriesIndex: 0,
// dataIndex: this.dataIndex
// })
// })
}
myChart.setOption(option);
highlightNext()
// this.mapActive(myChart)
}
}
这样就生成了一个3d地图,地图轮播效果
完整代码:
<template>
<div id="hello">
</div>
</template>
<script>
import * as echarts from 'echarts';
import geoJson from "../assets/mapJSon/rkz.json"
import coordtransform from 'coordtransform'
export default {
name: 'MapDemo',
data() {
return {
dataIndex: 0,
mTime:null
}
},
props: {
msg: String
},
methods: {
convertCoord(coord) {
const gcj02 = coordtransform.wgs84togcj02(coord[0], coord[1])
const bd09 = coordtransform.gcj02tobd09(gcj02[0], gcj02[1])
return bd09
},
},
mounted() {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('hello'));
var scatterData = [
{ name: "亚东县", value: "2945米" },
{ name: "仁布县", value: "3950米" },
{ name: "谢通门县", value: "4008米" },
{ name: "萨迦县", value: "4330米" },
{ name: "拉孜县", value: "4012米" },
{ name: "昂仁县", value: "4320米" },
{ name: "江孜县", value: "约4000米" },
{ name: "白朗县", value: "平均4200米" },
{ name: "聂拉木县", value: "4300米" },
{ name: "昂仁县", value: "4320米" },
{ name: "岗巴县", value: "4700米以上" },
{ name: "定结县", value: "2500-4700米" },
{ name: "定日县", value: "平均5000米。" },
{ name: "吉隆县", value: "4200米" },
{ name: "萨嘎县", value: "4487米" },
{ name: "仲巴县", value: "4772米" },
{ name: "南木林县", value: "3790米到4952米" },
{ name: "桑珠孜区", value: "3840米" },
{ name: "康马县", value: "4200-4600米" }
];
// 绘制图表
let option = {
// backgroundColor: "#fff",
tooltip: {
// 鼠标是否可以进入悬浮框
show: true,
confine: true,
enterable: true,
// 触发方式 mousemove, click, none, mousemove|click
triggerOn: 'mousemove',
// item 图形触发, axis 坐标轴触发, none 不触发
trigger: 'item',
// 浮层隐藏的延迟
hideDelay: 100,
// 背景色
backgroundColor: 'rgba(110, 110, 110,.5)',
formatter: function (params) {
const altitudeMap = {
'亚东县': '2945米',
'仁布县': '3950米',
'谢通门县': '4008米',
'萨迦县': '4330米',
'拉孜县': '4012米',
'昂仁县': '4320米',
'江孜县': '约4000米',
'白朗县': '平均4200米',
'聂拉木县': '4300米',
'岗巴县': '4700米以上',
'定结县': '2500-4700米',
'定日县': '平均5000米',
'吉隆县': '4200米',
'萨嘎县': '4487米',
'仲巴县': '4772米',
'南木林县': '3790米到4952米',
'桑珠孜区': '3840米',
'康马县': '4200-4600米',
};
return `
<div style="background-color: #ffffff;box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);padding: 20px;border-radius: 5px;font-size: 36px;color: #333;z-index: 1000;border-color:#333">
<div style="font-weight: bold;margin-bottom: 30px;">${params.name}</div>
<div>海拔:${altitudeMap[params.name] ? altitudeMap[params.name] : '未知'}</div>
</div>
`
}
},
geo3D: {
show: true,
map: "centerMap",
left: "4%", //偏移量调整
top: "5%", //偏移量调整
roam: true,
zoom: 10,
regionHeight: 5,
label: {
show: true,
distance: 200,
borderRadius: 0,
distanca: 0,
fontSize: 30,
color: "#ffffff", // 地图初始化区域字体颜色
borderWidth: 0,
borderColor: '#ffffff'
},
itemStyle: {
// 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
color: "#271f71", // 地图板块的颜色
fontSize: 30,
opacity: 1, // 图形的不透明度 [ default: 1 ]
borderWidth: 10, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
borderColor: "#6a63f4", // 图形描边的颜色。[ default: #333 ]
},
emphasis: {
label: {
show: true,
color: "#000000", //悬浮字体颜色
fontSize: 38,
},
itemStyle: {
color: "#e2e1e1",
opacity: 1,
},
},
// shading: "color",
light: {
// 光照阴影
main: {
color: "#FFFFFF", // 光照颜色
intensity: 2, // 光照强度
shadowQuality: "light", // 阴影亮度
shadow: true, // 是否显示阴影
alpha: 50,
beta: 10,
},
},
regions: [],
viewControl: {
"projection": "perspective",
"autoRotate": false,
"autoRotateAfterStill": 3,
"distance": 100.1931248935421, //默认比例
"alpha": 83.592048936336816,
"beta": 0.48683006219769,
"minAlpha": 5,
"maxAlpha": 40,
"minBeta": -1036800,
"maxBeta": 1036800,
"animation": true,
"animationDurationUpdate": 1000,
"animationEasingUpdate": "cubicInOut",
"orthographicSize": 60,
"autoRotateDirection": "cw",
"autoRotateSpeed": 10,
"damping": 0.8,
"rotateSensitivity": 1,
"zoomSensitivity": 1,
"panSensitivity": 1,
"panMouseButton": "middle",
"rotateMouseButton": "left",
"minDistance": 40,
"maxDistance": 400,
"maxOrthographicSize": 400,
"minOrthographicSize": 20,
"center": [
0,
0,
0, 0
]
},
},
series: [
{
type: "map3D", // 加载series数据
seriesIndex: 0, // 第一个系列
map: "centerMap",
regionHeight: 0,
boxHeight: 500,
// left: 0,
left: "4%", //偏移量调整
top: "5%", //偏移量调整
itemStyle: {
// 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
color: "rgba(37, 37, 38,1)", // 地图板块的颜色
opacity: 0, // 图形的不透明度 [ default: 1 ]
borderWidth: 0, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
borderColor: "#69E8F5", // 图形描边的颜色。[ default: #333 ]
},
label: {
show: true,
color: "#FFFFFF",
},
regions: [],
zlevel: 5,
viewControl: {
"projection": "perspective",
"autoRotate": false,
"autoRotateAfterStill": 3,
"distance": 100.1931248935421, //默认比例
"alpha": 83.592048936336816,
"beta": 0.48683006219769,
"minAlpha": 5,
"maxAlpha": 40,
"minBeta": -1036800,
"maxBeta": 1036800,
"animation": true,
"animationDurationUpdate": 1000,
"animationEasingUpdate": "cubicInOut",
"orthographicSize": 60,
"autoRotateDirection": "cw",
"autoRotateSpeed": 10,
"damping": 0.8,
"rotateSensitivity": 1,
"zoomSensitivity": 1,
"panSensitivity": 1,
"panMouseButton": "middle",
"rotateMouseButton": "left",
"minDistance": 40,
"maxDistance": 400,
"maxOrthographicSize": 400,
"minOrthographicSize": 20,
"center": [
0,
-5,
0,
]
},
},
{
type: "scatter3D",
coordinateSystem: "geo3D",
data: [],
symbol: "pin",
symbolSize: 20,
animation: true,
animationDurationUpdate: 500,
geo3DIndex: 0,
silent: false,
itemStyle: {
opacity: 1,
width: 1,
},
shading: "lambert",
label: {
show: false,
position: "right",
distance: 200, // 距离图形元素的距离
color: "#ff0000",
backgroundColor: "rgba(255, 255, 255, 0)",
rich: {
get: {
color: "#00E3FF",
lineHeight: 12,
},
set: {
color: "#FFF100",
lineHeight: 12,
},
date11: {
color: "#FFFFFF",
lineHeight: 12,
},
},
zlevel: 6,
},
emphasis: {
itemStyle: {
color: "#FFF200",
},
label: {
show: false,
},
},
zlevel: 6,
},
],
};
// myChart.showLoading();
echarts.registerMap('centerMap', geoJson);
// myChart.hideLoading();
var mapFeatures = echarts.getMap("centerMap").geoJson.features;
var geoCoordMap = {};
mapFeatures.forEach(function (v) {
// v.properties.center = _this.convertCoord(v.properties.center)
// 地区名称
var name = v.properties.name;
// 地区经纬度
geoCoordMap[name] = v.properties.center;
});
let currentIdx = -1;
function highlightNext() {
if (currentIdx++ >= 0) {
// 防止下标增加到超过区域数组长度
currentIdx %= mapFeatures.length;
}
highlightRegion(currentIdx) // 此处的currentIdx经过if判断,已经+1了
setTimeout(highlightNext, 5000);
}
function highlightRegion(index) { // 高亮地图区域,改变对应的散点样式
let regionName = mapFeatures[index].properties.name; // 高亮的区名
option.geo3D.regions = [ // 高亮3D地图对应的区块
{
name: regionName,
label: {
show: true,
color: "##000000",
},
itemStyle: {
color: "#ffffff",
opacity: 1,
}
}
];
// 当前高亮区域有散点,需删除stroke动效中的该条数据并在fill动效中增加该条数据
option.series[0].data = scatterData.filter(item => item.name !== regionName); // stroke散点数据
option.series[1].data = scatterData.filter(item => item.name === regionName); // fill散点数据
myChart.setOption(option);
myChart.dispatchAction({ // 触发散点高亮事件,改变标签样式
type: 'showTip',
seriesIndex: 1, // series中的第二个图层(fill散点图层)
dataIndex: 0 // 高亮第一条数据,由于fill散点图层只有一条数据,这里可以不指定
});
myChart.dispatchAction({
type: 'highlight',
seriesIndex: 0,
dataIndex: 0
});
// 显示弹框
myChart.dispatchAction({
type: 'showTip',
seriesIndex: 0,
dataIndex: 0
});
// myChart.on('mouseover', () => {
// console.log('mouseover')
// // 停止定时器,清除之前的高亮
// clearInterval(this.mTime)
// this.mTime = ''
// myChart.dispatchAction({
// type: 'downplay',
// seriesIndex: 0,
// dataIndex: this.dataIndex
// })
// })
}
myChart.setOption(option);
highlightNext()
// this.mapActive(myChart)
}
}
</script>
<style scoped>
#hello {
position: absolute;
top: 50%;
left: 48%;
width: 2604px;
height: 1700px;
z-index: 9999;
/* border: 20px solid red;s */
/* border-color: rgba(0, 0, 0, 0) !important; */
transform: translate(-50%, -50%);
}
</style>
总结
在网上寻找适合自己的方案总是非常耗费精力和时间的。但是,我克服了这些困难,经过自己的研究和实践,最终终于做出来了自己想要的结果。
作为一名程序员,我觉得最重要的是保持不断探索、学习和尝试的精神。当我遇到问题时,我会尝试各种可能的解决方案,来找到最适合我自己的答案。这样不仅可以提升自己的技能水平,也可以增强自己的解决问题的能力。
通过自己的努力和研究,我创建了自己想要的效果,这让我非常自豪和满足。我希望我能够将这个过程记录下来,与其他人分享,让更多的人从中受益。