Vue + Openlayers入门教程(三):图层管理功能

该文介绍了一种基于Vue3、Typescript和Openlayers7的图层管理系统,利用Elementplus组件库构建用户界面。文章展示了如何获取和管理地图图层,包括图层列表展示、编辑功能以及与复选框的交互,实现了图层可视性的动态调整。
摘要由CSDN通过智能技术生成

图层管理功能实现

一、技术栈

Vue 3 + Typescript +Openlayers 7 + Element plus
在这里插入图片描述

二、组件代码

<template>
  <div class="layerManageDiv">
    <el-button @click="getLayerList"> 图层管理 </el-button>
    <el-dialog
      v-model="dialogTableVisible"
      title="图层列表"
      width="30%"
      destroy-on-close
      draggable
    >
      <el-table
        ref="multipleTableRef"
        :data="layerAttList"
        @cell-mouse-enter="handleCellEnter"
        @cell-mouse-leave="handleCellLeave"
        @selection-change="checkboxChange"
      >
        <el-table-column label="名称">
          <template #default="scope">
            <el-input
              v-if="scope.row.show"
              v-model="scope.row.layerName"
            ></el-input>
            <span v-if="!scope.row.show">{{ scope.row.layerName }}</span>
          </template>
        </el-table-column>
        <el-table-column property="layerType" label="类型" />
        <el-table-column label="显示" type="selection"></el-table-column>
      </el-table>
    </el-dialog>
  </div>
</template>
<script setup lang="ts">
import { Map } from "ol";
import bus from "@/utils/bus.ts";
import { nextTick, ref } from "vue";
import { ElTable } from "element-plus";

let mapCopy: Map;
let layerAttList: LayerAtt[] = [];
let checkedArr = ref<String[]>([]); //接收复选框的值
const multipleTableRef = ref<InstanceType<typeof ElTable>>(); //获取el-table元素
const dialogTableVisible = ref<boolean>(false); //弹窗的可视性
//监听map数据
bus.on("mapToChecked", (res: Map) => {
  // 传参由回调函数中的形参接受
  mapCopy = res;
});
//定义一个类,接收图层属性
class LayerAtt {
  layerName: String = "name";
  layerType: String = "type";
  layerTitle: String = "title";
  layerVisible: Boolean = false;
  show: Boolean = false;

  //构造函数
  constructor(name: String, type: String, title: String, visible: Boolean) {
    this.layerName = name;
    this.layerType = type;
    this.layerTitle = title;
    this.layerVisible = visible;
    this.show = false;
  }
}
//获取当前所有图层列表
const getLayerList = () => {
  if (layerAttList.length != 0) {
    layerAttList.length = 0;
  }
  mapCopy.getAllLayers().forEach((item) => {
    layerAttList.push(
      new LayerAtt(
        item.get("name"),
        item.get("type"),
        item.get("title"),
        item.getVisible()
      )
    );
  });
  dialogTableVisible.value = true;
  // 同步更新了,还没有刷新出来组件
  nextTick(() => {
    checkboxToLayer(layerAttList);
  });
};
//鼠标移入
const handleCellEnter = (row: LayerAtt) => {
  row.show = true;
};
//鼠标移出
const handleCellLeave = (row: LayerAtt) => {
  row.show = false;
};
//复选框发生改变
const checkboxChange = (val: LayerAtt[]) => {
  if (checkedArr.value.length != 0) {
    checkedArr.value.length = 0; //清空复选框内容
  }
  //从复选框获取选中图层的属性:layerTitle
  for (let i = 0; i < val.length; i++) {
    checkedArr.value.push(val[i].layerTitle);
  }
  let length = mapCopy.getAllLayers().length; //获取map图层数组长度
  for (let i = 0; i < length; i++) {  //遍历mapCopy图层
     //通过getAllLayers方法获取图层title
    let mapCopyLayerName = mapCopy.getAllLayers()[i].get("title"); 
    if (checkedArr.value.length == 0) {
      //复选框都未选中状态不进入循环
      mapCopy.getAllLayers()[i].setVisible(false);
    }
    for (let checkedLayerName of checkedArr.value) {
      //遍历复选框状态
      if (checkedLayerName == mapCopyLayerName) {
        //如果选中的复选框的值与地图图层title相同,就将图层可视性设为true
        mapCopy.getAllLayers()[i].setVisible(true);
        break; //if判断成功则跳出for of循环
      } else {
        mapCopy.getAllLayers()[i].setVisible(false);
      }
    }
  }
};
//复选框状态与图层可视性关联
const checkboxToLayer = (rows: LayerAtt[]) => {
  // 如果图层一开始的可视性为真,就将复选框勾选上
  if (rows) {
    rows.forEach((row) => {
      if (row.layerVisible) {
        multipleTableRef.value.toggleRowSelection(row, undefined);
      }
    });
  } else {
    multipleTableRef.value!.clearSelection();
  }
};
</script>
<style></style>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Vue 中使用 OpenLayers 实现图层控制控件,可以按照以下步骤进行操作: 1. 安装 OpenLayersVue: ``` npm install ol vue ``` 2. 在 Vue 中引入 OpenLayers: ```javascript import ol from 'ol' import 'ol/ol.css' ``` 3. 创建地图容器: ```html <template> <div ref="map" class="map"></div> </template> ``` 4. 在 Vue 的 mounted 钩子函数中创建地图: ```javascript mounted() { // 创建地图容器 const map = new ol.Map({ target: this.$refs.map, layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([116.3975, 39.9085]), zoom: 12 }) }); this.map = map; } ``` 5. 创建图层控制控件: ```html <template> <div ref="map" class="map"> <div class="ol-control ol-custom-control"> <div class="ol-custom-control-header">图层控制</div> <div class="ol-custom-control-body"> <div v-for="(layer, index) in layers" :key="index"> <input type="checkbox" :id="layer.name" v-model="layer.visible"> <label :for="layer.name">{{ layer.name }}</label> </div> </div> </div> </div> </template> ``` 6. 在 Vue 的 data 中定义图层数据和控件的状态: ```javascript data() { return { map: null, layers: [ { name: 'OSM', visible: true, layer: new ol.layer.Tile({ source: new ol.source.OSM() }) }, { name: 'Bing Maps', visible: false, layer: new ol.layer.Tile({ source: new ol.source.BingMaps({ key: 'your-bingmaps-api-key', imagerySet: 'Road' }) }) } ] } } ``` 7. 在 Vue 的 watch 中监听图层状态的变化并更新地图: ```javascript watch: { layers: { deep: true, handler(layers) { const map = this.map; map.getLayers().clear(); layers.forEach(layer => { if (layer.visible) { map.addLayer(layer.layer); } }); } } } ``` 通过以上步骤就可以在 Vue 中实现图层控制控件了。需要注意的是,在实际应用中,可以根据需要自定义控件的样式和布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值