antV L7 控制不同图层的显隐

在项目中,地图上使用的图层过多,也许会导致看起来很杂乱,有时候会要求做一个组件出来,控制各个图层的显隐。下方为一个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>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
AntV L7是一个基于WebGL的地理信息可视化开发库,可以在Vue项目中使用。要在Vue项目中使用AntV L7,首先需要在HTML文件中引入L7的脚本文件。可以使用CDN方式引入,例如: ```html <head> <!-- 引入最新版的L7 --> <script src='https://unpkg.com/@antv/l7'></script> <!-- 指定版本号引入L7 --> <script src='https://unpkg.com/@antv/l7@2.0.11'></script> </head> ``` 接下来,在Vue组件中安装AntV L7以及相关的组件引用。可以使用npm或yarn安装AntV L7,然后在Vue组件中引入所需的组件。例如,在data中创建一个变量来接收地图实例和组件: ```javascript import { Scene } from '@antv/l7'; export default { data() { return { scene: null, // 其他变量 } }, // 其他生命周期钩子函数 } ``` 在mounted钩子函数中生成地图实例,并加载数据生成地图。可以根据需求进行异步操作数据。例如: ```javascript mounted() { this.scene = new Scene({ // 地图配置 }); // 加载数据生成地图 this.loadDataAndCreateMap(); }, methods: { async loadDataAndCreateMap() { const data = await this.loadData(); // 异步加载数据 // 根据数据生成地图 // this.scene.addLayer(...) // 其他操作 }, // 其他方法 } ``` 最后,可以在Vue组件中渲染地图的DOM元素。例如,在HTML模板中添加一个div元素来渲染地图: ```html <template> <div id="mapContainer"></div> </template> ``` 这样就可以在Vue项目中使用AntV L7进行地图可视化开发了。请注意,具体的代码实现可能会根据项目需求有所不同,以上只是一个简单的示例。 #### 引用[.reference_title] - *1* [【Antv/Vue3】vue项目中使用antv/L7制作地图](https://blog.csdn.net/weixin_52378152/article/details/125429250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [在vue项目中使用AntV L7地图下钻,异步调用不重复生成](https://blog.csdn.net/Grupass/article/details/127103298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [antvl7绘制地图以及vue项目中使用多线程worker](https://blog.csdn.net/Mr__proto__/article/details/128975829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值