vue+openlayers6实现图层管理

242 阅读1分钟

1.效果图

image.png

2.思路

思路很简单,就是在panel中加一个树控件,选择时控制该图层的显影

3.实现

我自己随便封装了一下,代码如下:

<template>
    <div class="layerManage">
        <div class="header">图层管理</div>
        <div class="layer_body">
            <el-tree
                    class="tree"
                    :data="tree_data"
                    :props="defaultProps"
                    show-checkbox
                    node-key="id"
                    :default-checked-keys="[1,100]"
                    :check-strictly="true"
                    @check-change="handleCheckChange">
            </el-tree>

        </div>
    </div>
</template>

<script>
    import TileLayer from "ol/layer/Tile";
    import XYZ from "ol/source/XYZ";
    import TileWMS from 'ol/source/TileWMS';
    import config from './../../../config/config'
    export default {
        name: "layerManage",
        data(){
            return{

            }
        },
        mounted(){

        },
        methods:{
            //初始化地图
            handleCheckChange(data, checked, indeterminate) {
                if(checked){
                    //加载基础底图
                    if(data.children==undefined){
                        if(data.id!=null){
                            //如果已经加了,打开该图层,并移动到指定的index否则,添加
                            if(this.isAddedByName(data.layerName)){
                                this.openLayerByName(data.layerName)
                            }else{
                                this.addBaseMap(data.url,data.layerName,data.id)
                            }
                        }else{

                            //加载业务图层
                            this.addWMSLayer(data)
                        }
                    }else{
                        //清除所有图层

                    }
                }else{
                    this.closeLayerByName(data.layerName)
                }
            },
            /**
             * 添加基础图层
             */
            addBaseMap(url,name,id){
                let layer=new TileLayer({
                    source:new XYZ({
                        // url:'http://www.google.cn/maps/vt/pb=!1m4!1m3!1i{z}!2i{x}!3i{y}!2m3!1e0!2sm!3i380072576!3m8!2szh-CN!3scn!5e1105!12m4!1e68!2m2!1sset!2sRoadmap!4e0!5m1!1e0'
                        url:url

                    }),
                    name:name
                })
                layer.setZIndex(id)
                this.map.addLayer(layer)
            },

            /**
             * 添加wms图层
             * */
            addWMSLayer(data){
                let workSpaceName=data.styleName+'Map'
                let layerName=data.tableName
                let layers=`${workSpaceName}:${layerName}`;
                let url=`${config.GeoserverIP}/geoserver/${workSpaceName}/wms`;
                let layer=new TileLayer({
                    source: new TileWMS({
                        url: url,
                        params: {'LAYERS': layers, 'TILED': true},
                        serverType: 'geoserver',
                        // Countries have transparency, so do not fade tiles:
                        transition: 0
                    }),
                    name: data.layerName
                })
                // let params=
                layer.setZIndex(100)
                this.map.addLayer(layer)
            },
            /**
             * 根据名称判断是否有该图层
             */
            isAddedByName(name){
                let visible=false
                if(this.map!=null){
                    let layers=this.map.getLayers();
                    for(let i=0;i<layers.getLength();i++){
                        if(layers.item(i).get('name')==name){
                            visible=true
                        }
                    }
                }
                return visible
            },
            /**
             * 根据名称清除图层
             * @param name
             */
            removeLayerByName(name){
                let layers=this.map.getLayers();
                for(let i=0;i<layers.getLength();i++){
                    if(layers.item(i).get('name')==name){
                        this.map.removeLayer(layers.item(i))
                    }
                }
            },
            /**
             * 关闭图层
             * @param name
             */
            closeLayerByName(name){
                let layers=this.map.getLayers();
                for(let i=0;i<layers.getLength();i++){
                    if(layers.item(i).get('name')==name){
                        layers.item(i).setVisible(false)
                    }
                }
            },
            /**
             * 根据名称打开图层
             * @param name
             */
            openLayerByName(name){
                let layers=this.map.getLayers();
                for(let i=0;i<layers.getLength();i++){
                    if(layers.item(i).get('name')==name){
                        layers.item(i).setVisible(true)
                        //设置到最上层
                        // layers.item(i).setZIndex(layers.getLength())
                    }
                }
            },
        },
        props:{
            defaultProps:{
                type: Object,
            },
            tree_data:{
                type: Array
            },
            map:{

            }
        }
    }
</script>

<style lang="scss">
    .layerManage{
        position: absolute;
        right:1%;
        top:10%;
        width:250px;
        border-radius: 5px;
        .header{
            color: white;
            background-color: #13E3E2;
            font-size: 20px;
            padding: 10px 30px;
            border-radius: 5px 5px 0 0;
        }
        .layer_body{
            background-color:rgba(72,103,87,0.5);
            /*min-height: 300px;*/
            /*max-height: 800px;*/
            height: 100%;
            max-height: 750px;
            overflow:auto;/*内容超出后隐藏*/
            border: solid 2px #13E2E3;
            padding: 20px;
            .tree{
                background-color:rgba(72,103,87,0.5);
                color: white;
                .el-tree-node__content:hover {
                    background-color: rgba(145, 255, 245, 0.53);
                }
                .el-tree-node:focus > .el-tree-node__content {
                    background-color: rgba(145, 255, 245, 0.53);
                }
            }

        }
    }
</style>