(五)openlayers加圆形以及引入element-ui组件

本文介绍了如何在Vue3项目中使用OpenLayers和Element-UI组件,包括创建地图、引入Element-UI组件(如按钮)、添加圆形功能以及管理地图视图。作者详细展示了如何安装Element-UI、引入组件并实现地图操作的代码示例。
摘要由CSDN通过智能技术生成

(1)第一节我写了基于vue3的openlayers项目创建,其实还可以进行如下操作,进入一个文件夹,输入cmd,如图所示:
在这里插入图片描述
创建完成后,用vscode打开项目文件夹,新建终端输入:npm run serve,进行运行。
(2)本节主要引入element-ui组件以及基于openlayers加圆形。Element UI是一个基于Vue.js的开源UI组件库,专为开发者提供了一套优雅而灵活的UI组件。它包含了各种常用的Web组件,如按钮、表单、导航等,以及高级组件,如日期选择器、对话框等。Element UI的设计风格简洁美观,易于定制,使其成为许多Vue.js项目的首选UI框架。对于初学者来说很适合。
首先引入Element UI,进入官网找到基于Vue3版本的安装命令,在vscode终端里面输入这个命令:npm install element-plus --save
在这里插入图片描述
安装成功,package.json会显示这样:
在这里插入图片描述
然后在main.js中引入element -ui,如图所示:
在这里插入图片描述
以上我们就可以引入element-ui的组件,本次我们引入element-ui中的按钮组件。直接在官网中复制代码:
在这里插入图片描述
一定要注意对应是Vue3版本的,不要复制错了,我这直接复制链接:element-ui按钮
然后根据自己所需对代码进行改写,我这还是延续之前章节的代码,所以进行如下改写:
在这里插入图片描述
运行显示:
在这里插入图片描述
(3)基于openlayers加圆形。引入需要的依赖:
在这里插入图片描述
编写加圆形的函数:
在这里插入图片描述
整体运行显示如下:
在这里插入图片描述(4)整个代码如下:

<template>
    <!-- 模板部分,包含一个 id 为 "map" 的地图容器和按钮 -->
    <!-- <div>
        <button @click="zoomIn" class="Bigbutton">放大</button>
        <button @click="zoomOut" class="Smallbutton">缩小</button>
        <button @click="toggleLayer" class="toggle">显示/隐藏图层</button>
        <button @click="addCircle">加圆</button>
        <button @click="removeCircle">移除</button>
    </div> -->
    <div>
        <el-button @click="zoomIn" class="Bigbutton">放大</el-button>
        <el-button @click="zoomOut" class="Smallbutton">缩小</el-button>
        <el-button @click="toggleLayer" class="toggle">显示/隐藏图层</el-button>
        <el-button @click="addCircle">加圆</el-button>
        <el-button @click="removeCircle">移除</el-button>
        <div id="map" class="map"></div>
    </div>
</template>
<script>
// 导入 Vue 相关库
import { onMounted, ref } from "vue";
// 导入 OpenLayers 样式文件
import "ol/ol.css";
// 导入 OpenLayers 相关模块
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import Zoom from 'ol/control/Zoom';
import wuhan from "@/assets/武汉市.json";
import GeoJSON from "ol/format/GeoJSON";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import { Circle } from "ol/geom";
import Feature from "ol/Feature";
import Style from "ol/style/Style";
import Fill from "ol/style/Fill";
import Stroke from "ol/style/Stroke";
export default {
    name: "BaseMap",
    setup() {
        // 使用 ref 创建响应式对象存放地图实例
        const map = ref(null); // 存放地图实例
        let circleLayer = null;
        // 初始化地图函数
        function initMap() {
            // 创建地图实例
            map.value = new Map({
                target: 'map', // 地图容器的 id
                layers: [ // 图层
                    new TileLayer({ // 使用瓦片渲染方法
                        source: new XYZ({
                            url:'http://webst0{1-4}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
                            crossOrigin:"anonymous"
                        }) // 图层数据源
                    }),
                    // 加载矢量图层
                    new VectorLayer({
                        source:new VectorSource({
                            features:new GeoJSON().readFeatures(wuhan, {featureProjection:"EPSG:4326"}),
                            wrapX:true
                        })
                    })
                ],
                view: new View({
                    projection: "EPSG:4326", // 地图视图
                    center: [114.4, 30.5], // 地图中心点坐标为武汉的经纬度
                    zoom: 12,
                    // extent: [114, 30, 116, 30.6] // 地图初始缩放级别
                }),
                controls: [
                    new Zoom() // 添加缩放控件
                ]
            });
        }
        // 放大地图函数
        function zoomIn() {
            let view = map.value.getView();
            let zoom = view.getZoom();
            view.setZoom(zoom + 1);
        }
        // 缩小地图函数
        function zoomOut() {
            let view = map.value.getView();
            let zoom = view.getZoom();
            view.setZoom(zoom - 1);
        }
        // 显示/隐藏图层函数
        function toggleLayer() {
            let layers = map.value.getLayers(); // 获取图层组
            let layer = layers.getArray()[0]; // 获取第一个图层
            let visible = layer.getVisible(); // 获取图层当前显示状态
            layer.setVisible(!visible); // 设置图层显示状态
        }
        function addCircle() {
            const circleFeature = new Feature({
                geometry: new Circle([114.4, 30.6],0.1)
            });
            const source = new VectorSource({
                features:[circleFeature]
            });
            circleLayer = new VectorLayer({
                source:source,
                style:new Style({
                    fill:new Fill({
                        color:'rgba(0,0,255,0.1)'
                    }),
                    stroke:new Stroke({
                        color:"#ce602c",
                        width:1
                    })
                })
            });
            map.value.addLayer(circleLayer)
        }
        function removeCircle() {
  	            // 移除圆形图层
             if (circleLayer) {
                map.value.removeLayer(circleLayer);
                circleLayer = null; // 将 circleLayer 置为 null,以便下次添加圆形图层时重新创建
    } 
        }
        // 在组件挂载完成后执行初始化地图函数
        onMounted(() => { 
            initMap();
        });
        // 返回响应式数据和方法
        return {
            map,
            toggleLayer,
            zoomIn,
            zoomOut,
            addCircle,
            removeCircle
        };
    }
};
</script>
<style>
/* 可选的样式 */
.map {
    width: 2000px;
    height: 2000px;
    border: 1px solid #eee;
}
.Bigbutton {
    background-color: red;
}
.Smallbutton {
    background-color: greenyellow;
}
.toggle {
    background-color:skyblue;
}
</style>


  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值