在项目中,地图上使用的图层过多,也许会导致看起来很杂乱,有时候会要求做一个组件出来,控制各个图层的显隐。下方为一个demo例子
主要是通过图层的show方法和hide方法,也可以使用setOptions的方法来处理
本demo控制的图层为3个PointLayer(可根据自己项目选择不同类型),地图实例使用的是高德地图
一、搭建项目构造
<div class="antBox">
<div class="top">
<el-button type="warning" @click="toHome()">返回首屏</el-button>
</div>
<div class="main">
<div class="layers">
<el-checkbox-group v-model="checkData" @change="checkDataChange">
<el-checkbox v-for="item in checkList" :key="item.value" :label="item.value" style="color: #fff;">{{
item.label }}</el-checkbox>
</el-checkbox-group>
</div>
<div id="mapBox"></div>
</div>
</div>
二、引用自己需要的各项数据
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { PointLayer, PolygonLayer, Scene } from '@antv/l7'
import { GaodeMap } from '@antv/l7-maps'
import { load } from "@amap/amap-jsapi-loader";
import sichuanMap from '@/assets/json/sichuan.json' //四川地图json数据
import node1 from '@/assets/imgs/points/node.png' //节点图片1
import node2 from '@/assets/imgs/points/nodeActive.png' //节点图片2
三、创建地图实例和地图对象
//初始化地图
async function initMap() {
//先获取高德的地图
let AMap = await load({
key: "自己注册的key",
version: "2.0",
plugins: [
"AMap.DistrictSearch",
"AMap.DistrictLayer",
"AMap.TileLayer",
"AMap.Polygon",
"AMap.GeoJSON",
"AMap.Weather",
],
})
let gaodeMap = new AMap.Map('mapBox', {
center: [103.82112953, 30.12207207],
zoom: 6,
pitch: "30",
viewMode: "2D",
layers: [
new AMap.TileLayer.Satellite() // 卫星图层
]
})
scene.value = new Scene({
id: 'mapBox',
logoVisible: false,
map: new GaodeMap({
mapInstance: gaodeMap, //地图实例使用高德地图(如使用官方地图可忽略115-136行的代码)
})
})
//避免异步出现问题
setTimeout(() => {
let sichuanLayer = new PolygonLayer()
.source(sichuanMap)
scene.value.addLayer(sichuanLayer)
}, 200)
scene.value.on('loaded', () => {
addLayers() //注册各种图层节点
})
四、创建要控制显隐的图层
let entPointsLayer: any; //企业节点
let camerasLayer: any; //监控节点
let atmospheresLayer: any //大气节点
//注册图片
function addLayers() {
//图片注册
scene.value.addImage('node1', node1)
scene.value.addImage('node2', node2)
//创建企业标记点
entPointsLayer = new PointLayer({
name: 'entPoints',
visible: false,
zIndex: 2
})
.source(nodesData.value.enterprise, {
parser: {
type: 'json',
x: 'lng',
y: 'lat'
}
})
.shape('url', ['node1', 'node2'])
.size(22)
//创建监控标记点
camerasLayer = new PointLayer({
name: 'camPoints',
visible: false,
zIndex: 2
})
.source(nodesData.value.camera, {
parser: {
type: 'json',
x: 'lng',
y: 'lat'
}
})
.shape('url', ['node1', 'node2'])
.size(22)
//创建大气监测标记点
atmospheresLayer = new PointLayer({
name: 'atmPoints',
visible: false,
zIndex: 2
})
.source(nodesData.value.atmosphere, {
parser: {
type: 'json',
x: 'lng',
y: 'lat'
}
})
.shape('url', ['node1', 'node2'])
.size(22)
scene.value.addLayer(entPointsLayer)
scene.value.addLayer(camerasLayer)
scene.value.addLayer(atmospheresLayer)
}
五、多选框控制事件
//多选框选择事件
function checkDataChange(val: any) {
//初始化时将所有节点隐藏
entPointsLayer.hide()
camerasLayer.hide()
atmospheresLayer.hide()
//判断多选框内选中的值
if (val && val.length > 0) {
val.forEach((item: any) => {
if (item === 1) {
entPointsLayer.show()
} else if (item === 2) {
camerasLayer.show()
} else {
atmospheresLayer.show()
}
})
} else { //如果一个值都没选,则将所有节点隐藏
entPointsLayer.hide()
camerasLayer.hide()
atmospheresLayer.hide()
}
}
六、完整代码展示(含demo数据)
<template>
<div class="antBox">
<div class="top">
<el-button type="warning" @click="toHome()">返回首屏</el-button>
</div>
<div class="main">
<div class="layers">
<el-checkbox-group v-model="checkData" @change="checkDataChange">
<el-checkbox v-for="item in checkList" :key="item.value" :label="item.value" style="color: #fff;">{{
item.label }}</el-checkbox>
</el-checkbox-group>
</div>
<div id="mapBox"></div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { PointLayer, PolygonLayer, Scene } from '@antv/l7'
import { GaodeMap } from '@antv/l7-maps'
import { load } from "@amap/amap-jsapi-loader";
import sichuanMap from '@/assets/json/sichuan.json' //四川地图json数据
import node1 from '@/assets/imgs/points/node.png' //节点图片1
import node2 from '@/assets/imgs/points/nodeActive.png' //节点图片2
let router = useRouter()
let scene: any = ref(null)
let checkData = ref([])
//多选框里的值
let checkList = ref([
{
value: 1,
label: '企业'
},
{
value: 2,
label: '监控设备'
},
{
value: 3,
label: '气象设备'
},
])
//模拟各项点位数据
let nodesData = ref({
//企业数据
enterprise: [
{
id: 1,
lat: 30.524388,
lng: 103.914649,
name: '一号企业',
url: 'node1'
},
{
id: 2,
lat: 30.320546,
lng: 103.110594,
name: '二号企业',
url: 'node1'
},
{
id: 3,
lat: 30.928156,
lng: 103.517203,
name: '三号企业',
url: 'node1'
},
],
//摄像头数据
camera: [
{
id: 11,
lat: 31.120119,
lng: 102.316602,
name: '水位摄像头1',
url: 'node1'
},
{
id: 12,
lat: 31.153349,
lng: 104.22128,
name: '水位摄像头2',
url: 'node1'
},
],
//大气监测数据
atmosphere: [
{
id: 111,
lat: 29.524518,
lng: 102.326236,
name: '大气监测站1',
url: 'node2'
},
{
id: 112,
lat: 31.917632,
lng: 104.322739,
name: '大气监测站2',
url: 'node2'
}
]
})
let entPointsLayer: any; //企业节点
let camerasLayer: any; //监控节点
let atmospheresLayer: any //大气节点
//初始化地图
async function initMap() {
//先获取高德的地图
let AMap = await load({
key: "自己注册的key",
version: "2.0",
plugins: [
"AMap.DistrictSearch",
"AMap.DistrictLayer",
"AMap.TileLayer",
"AMap.Polygon",
"AMap.GeoJSON",
"AMap.Weather",
],
})
let gaodeMap = new AMap.Map('mapBox', {
center: [103.82112953, 30.12207207],
zoom: 6,
pitch: "30",
viewMode: "2D",
layers: [
new AMap.TileLayer.Satellite() // 卫星图层
]
})
scene.value = new Scene({
id: 'mapBox',
logoVisible: false,
map: new GaodeMap({
mapInstance: gaodeMap, //地图实例使用高德地图(如使用官方地图可忽略115-136行的代码)
})
})
//避免异步出现问题
setTimeout(() => {
let sichuanLayer = new PolygonLayer()
.source(sichuanMap)
scene.value.addLayer(sichuanLayer)
}, 200)
scene.value.on('loaded', () => {
addLayers() //注册各种图层节点
})
}
//注册图片
function addLayers() {
//图片注册
scene.value.addImage('node1', node1)
scene.value.addImage('node2', node2)
//创建企业标记点
entPointsLayer = new PointLayer({
name: 'entPoints',
visible: false,
zIndex: 2
})
.source(nodesData.value.enterprise, {
parser: {
type: 'json',
x: 'lng',
y: 'lat'
}
})
.shape('url', ['node1', 'node2'])
.size(22)
//创建监控标记点
camerasLayer = new PointLayer({
name: 'camPoints',
visible: false,
zIndex: 2
})
.source(nodesData.value.camera, {
parser: {
type: 'json',
x: 'lng',
y: 'lat'
}
})
.shape('url', ['node1', 'node2'])
.size(22)
//创建大气监测标记点
atmospheresLayer = new PointLayer({
name: 'atmPoints',
visible: false,
zIndex: 2
})
.source(nodesData.value.atmosphere, {
parser: {
type: 'json',
x: 'lng',
y: 'lat'
}
})
.shape('url', ['node1', 'node2'])
.size(22)
scene.value.addLayer(entPointsLayer)
scene.value.addLayer(camerasLayer)
scene.value.addLayer(atmospheresLayer)
}
//多选框选择事件
function checkDataChange(val: any) {
//初始化时将所有节点隐藏
entPointsLayer.hide()
camerasLayer.hide()
atmospheresLayer.hide()
//判断多选框内选中的值
if (val && val.length > 0) {
val.forEach((item: any) => {
if (item === 1) {
entPointsLayer.show()
} else if (item === 2) {
camerasLayer.show()
} else {
atmospheresLayer.show()
}
})
} else { //如果一个值都没选,则将所有节点隐藏
entPointsLayer.hide()
camerasLayer.hide()
atmospheresLayer.hide()
}
}
//返回首屏
function toHome() {
router.go(-1)
}
onMounted(() => {
initMap()
})
</script>
<style lang="scss" scoped>
.antBox {
width: 100%;
height: 100%;
.top {
height: 10%;
}
.main {
height: 90%;
position: relative;
.layers {
position: absolute;
right: 20px;
top: 20px;
width: 120px;
background: url('../../../assets/imgs/background/production-left-bg-2.png') no-repeat;
background-size: 100% 100%;
z-index: 3;
padding: 10px;
.el-checkbox-group {
display: flex;
flex-direction: column;
}
}
#mapBox {
width: 100%;
height: 100%;
position: relative;
}
}
}
</style>