首页 > 其他分享 >16.在 Vue 3 中使用 OpenLayers 实现自定义地图缩放控件

16.在 Vue 3 中使用 OpenLayers 实现自定义地图缩放控件

时间:2024-12-08 22:57:29浏览次数:11  
标签:控件 自定义 map 缩放 openlayers OpenLayers

前言

在前端开发中,地图交互是一个常见且重要的需求。默认情况下,OpenLayers 提供了丰富的控件(如缩放、旋转、属性标注等),但有时我们需要根据项目需求自定义交互逻辑,比如禁用默认缩放控件并实现自己的按钮式缩放功能。

本文将带大家实现一个自定义地图缩放的功能,通过 Vue 3 的 Composition API 和 OpenLayers 来构建。


技术栈

  • Vue 3:前端主流框架,使用 Composition API 实现响应式开发。
  • OpenLayers:开源地图库,支持自定义控件和丰富的交互功能。
  • CSS:实现控件的样式设计。

效果展示

我们将实现以下功能:

  1. 显示一张 OpenStreetMap 地图。
  2. 禁用 OpenLayers 的默认缩放控件。
  3. 在地图上添加两个按钮,实现自定义的放大和缩小功能。

最终效果如下:


项目初始化

首先,创建一个 Vue 3 项目,并安装必要的依赖:

创建 Vue 项目

# 使用 Vue CLI 创建项目
 npm init vue@latest openlayers-custom-zoom 
cd openlayers-custom-zoom 
npm install

安装 OpenLayers

npm install ol

实现自定义地图缩放功能

接下来,我们通过以下步骤实现所需功能。

完整代码

以下是最终的 Vue 组件代码:

<!--
 * @Author: 彭麒
 * @Date: 2024/12/8
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
    <button class="back-button" @click="goBack">返回</button>
    <div class="container">
        <div class="w-full flex justify-center flex-wrap">
            <div class="font-bold text-[24px]">在Vue3中使用OpenLayers自定义zoom控件,实现地图放大缩小</div></div>
        <div id="vue-openlayers">
            <div class="zoomin" @click="zoomin">+</div>
            <div class="zoomout" @click="zoomout">-</div>
        </div>
    </div>
</template>

<script setup>
import {ref, onMounted} from 'vue';
import 'ol/ol.css';
import Map from 'ol/Map';
import View from 'ol/View';
import OSM from 'ol/source/OSM';
import TileLayer from 'ol/layer/Tile';
import {fromLonLat} from 'ol/proj';
import * as control from 'ol/control';
import router from "@/router";
const goBack = () => {
    router.push('/OpenLayers');
};
const map = ref(null);

const initMap = () => {
    map.value = new Map({
        layers: [
            new TileLayer({
                source: new OSM(),
            }),
        ],
        target: 'vue-openlayers',
        view: new View({
            center: fromLonLat([116, 39]),
            projection: 'EPSG:3857',
            zoom: 2,
        }),
        controls: control.defaults({
            zoom: false,
            rotate: false,
            attribution: false,
        }).extend([]),
    });
};

const zoomin = () => {
    const currentZoom = map.value.getView().getZoom();
    map.value.getView().setZoom(currentZoom + 1);
};

const zoomout = () => {
    const currentZoom = map.value.getView().getZoom();
    map.value.getView().setZoom(currentZoom - 1);
};

onMounted(() => {
    initMap();
});
</script>

<style scoped>
.container {
    width: 840px;
    height: 520px;
    margin: 50px auto;
    border: 1px solid #42B983;
}

#vue-openlayers {
    width: 800px;
    height: 400px;
    margin: 0 auto;
    border: 1px solid #42B983;
    position: relative;
}

#vue-openlayers .zoomin,
#vue-openlayers .zoomout {
    width: 30px;
    height: 30px;
    line-height: 30px;
    text-align: center;
    background: rgba(0, 0, 0, 0.6);
    font-size: 20px;
    position: absolute;
    z-index: 2;
    border: 1px solid #000088;
    color: #fff;
    cursor: pointer;
}

#vue-openlayers .zoomout {
    bottom: 50px;
    right: 10px;
}

#vue-openlayers .zoomin {
    bottom: 80px;
    right: 10px;
}
</style>

代码解析

1. 初始化地图

initMap 方法中初始化了 OpenLayers 的 Map 实例,配置了:

  • 目标节点target: 'vue-openlayers'
  • 图层:使用 TileLayer 加载 OSM 瓦片地图。
  • 视图:设置地图的中心点、缩放级别及投影坐标系。
  • 控件:通过 control.defaults 禁用了默认缩放、旋转和属性标注控件。
2. 自定义缩放按钮

通过两个自定义按钮实现缩放功能:

  • 放大按钮 zoomin:获取当前缩放级别后加 1。
  • 缩小按钮 zoomout:获取当前缩放级别后减 1。
const currentZoom = map.value.getView().getZoom(); 
map.value.getView().setZoom(currentZoom + 1); // 放大 
map.value.getView().setZoom(currentZoom - 1); // 缩小
3. 自定义样式

通过 CSS 设置按钮的位置和样式,确保按钮美观并固定在地图右下角。


总结

本篇文章展示了如何使用 Vue 3 和 OpenLayers 实现禁用默认缩放控件,并添加自定义缩放按钮的功能。通过 OpenLayers 提供的接口,我们可以轻松地扩展更多的地图交互功能,例如自定义旋转按钮、测距工具等。

如果你觉得本文对你有所帮助,请点赞、收藏,并在评论区交流你的想法!

标签:控件,自定义,map,缩放,openlayers,OpenLayers
From: https://blog.csdn.net/Miller777_/article/details/144334092

相关文章

  • ## Redis密码加密;springboot自定义加密
    1.1Redis密码springboot自定义加密给redis设置密码windows系统:在redis安装目录中找到配置文件redis.windows.conf;在配置文件中找到#requirepassfoobared,将前面的注释去掉,同时将foobared替换为自己的密码后保存配置文件;eg.:requirepass123456重启redis服务......
  • 提现生成器【APP】自定义生成小游戏提现截图
    今天发个避坑帖!首先看看下面这种收益图,你们肯定见过不少!‘割割’们让你上车,必须得有一些吸引你的东东啊,不然怎么割你吗?其实这种截图都是软件生成的,我网站上分享过非常多的类似软件,什么聊天记录生成的啊,什么ZFB,微信零钱转账记录,余额多少啊。。。。。都可以生成。像这种......
  • 提现生成器【APP】自定义生成小游戏提现截图
    今天发个避坑帖!首先看看下面这种收益图,你们肯定见过不少!‘割割’们让你上车,必须得有一些吸引你的东东啊,不然怎么割你吗?其实这种截图都是软件生成的,我网站上分享过非常多的类似软件,什么聊天记录生成的啊,什么ZFB,微信零钱转账记录,余额多少啊。。。。。都可以生成。像这种......
  • python 自定义进度条
    defprintProgressBar(iteration,total,prefix='',suffix='',decimals=1,length=100,fill='█',printEnd="\r"):"""Callinalooptocreateterminalprogressbar@params:iteratio......
  • 14.在 Vue 3 中使用 OpenLayers 自定义地图版权信息
    在WebGIS开发中,默认的地图服务通常会带有版权信息,但有时候我们需要根据项目需求自定义版权信息或添加额外的版权声明。在本文中,我们将基于Vue3的CompositionAPI和OpenLayers,完成自定义地图版权信息的实现。最终效果通过本文教程,您将实现以下功能:在地图中自定义版......
  • 构建 Home Assistant 自定义组件(第一部分):项目结构与基础
    构建HomeAssistant自定义组件(第一部分):项目结构与基础项目结构引言本系列博客文章将是一个创建HomeAssistant自定义组件的教程。我们将从一个基础组件开始,并在每篇文章中对其进行扩展。在教程结束时,你将拥有一个功能完备的组件,在集成质量量表上至少应获得银牌分数。......
  • 主函数中要求输入一个一元二次方程的三个系数,调用函数判断该方程是否有实数解,如果有实
    #include<iostream>#include<cmath>//用于计算平方根//判断一元二次方程是否有实数解的函数boolhasRealSolutions(floata,floatb,floatc){floatdiscriminant=b*b-4*a*c;returndiscriminant>=0;}//求一元二次方程的解的函数voids......
  • CSDN自定义皮肤-酷炫博客名称+默认显示详细资料+头像旋转+流光效果+半透明
    CSDN自定义皮肤-酷炫博客名称+默认显示详细资料+头像旋转+流光效果+半透明效果预览前言头像旋转博客名称流光效果Banner文字+流光效果Toolbar流光效果模块半透明默认显示详细资料隐藏查看详细资料按钮完整自定义模块代码(持续更新)效果预览效果预览:https://microi.blo......
  • 产品经理提需求我不慌了,Doris自定义函数三剑客一把梭!
    产品经理提需求我不慌了,Doris自定义函数三剑客一把梭!打开数据分析的无限可能Doris自定义函数三剑客性能优化与最佳实践数据工程师小K盯着屏幕发愁。一个看似简单的数据分析需求,却因为复杂的业务规则让他焦头烂额。“标准SQL函数写不出来,难道要改需求?”就在这时,他......
  • 在响应式布局中,如何使用纯css使得块元素等比缩放?
    在响应式布局中,使用纯CSS使块元素等比缩放,主要依靠padding的百分比值特性,以及aspect-ratio属性(现代浏览器支持)。以下几种方法可以实现:1.使用padding-top或padding-bottom:这是最常用的方法,利用了padding百分比值是相对于父元素宽度计算的特性。.container{......