Vue2+OpenLayers给2个标点Feature分别添加独立的点击事件(提供Gitee源码)

前言:之前开发都是将所有的点位存放在一个图层上面,并统一赋予它们相同的点击事件,如果其中某些点的点击事件不一样呢,这种问题如何解决呢,本篇博客就是解决这个通点。 

目录

一、案例截图

二、安装OpenLayers库

三、代码实现

3.1、实现思路

3.2、添加两个点

3.3、初始化点击事件

3.4、完整代码

四、Gitee源码 


一、案例截图

点击2个点,可以看到控制台,它们点击事件打印出来的信息是不一样的,这就是我们需要实现的效果。

二、安装OpenLayers库

npm install ol

三、代码实现

3.1、实现思路

其实就是为这两个点分别新建两个图层,先初始化变量。

关键代码:

data() {
  return {
    map:null,
    overLay:null,
    //图层1
    firstLayer: new VectorLayer({
      source: new VectorSource(),
    }),
    //图层2
    secLayer: new VectorLayer({
      source: new VectorSource(),
    }),
  }
},

3.2、添加两个点

先封装好生成点位的方法,传入经纬度信息就可以生成点位了,传入的格式例如[116.222222,38.222222]。

关键代码:

/**
 * 根据经纬度坐标添加自定义图标 支持base64
 */
addPoints(coordinate) {
  // 创建feature要素,一个feature就是一个点坐标信息
  let feature = new Feature({
    geometry: new Point(coordinate),
  });
  // 设置要素的图标
  feature.setStyle(
      new Style({
        // 设置图片效果
        image: new Icon({
          src: 'http://api.tianditu.gov.cn/img/map/markerA.png',
          // anchor: [0.5, 0.5],
          scale: 1,
        }),
      }),
  );
  return feature;
},

在地图初始化以后,调用上面封装好的方法新增两个点,并分别添加到之前创建好的两个图层上。

关键代码:

//分别添加2个图层
this.map.addLayer(this.firstLayer);
this.map.addLayer(this.secLayer);
//添加第一个点
let firstFeature = this.addPoints([118.958412, 32.119130]);
this.firstLayer.getSource().addFeature(firstFeature);
//添加第二个点
let secFeature = this.addPoints([118.948627, 32.120428]);
this.secLayer.getSource().addFeature(secFeature);

3.3、初始化点击事件

实现思路:在地图上监听用户的单击事件,获取用户点击的坐标后,检查这一区域是否存在于第一个或第二个图层(VectorLayer)的特征(Feature)中。如果找到特征,则输出其几何体的坐标;如果没有找到特征,则输出提示信息,表明用户点击了地图的空白处。

关键代码:

initPointEvent(){
  let _that = this;
  // 添加点击事件
  this.map.on('singleclick', (event) => {
    // 获取点击的坐标
    const pixel = this.map.getEventPixel(event.originalEvent);
    const firstFeature = this.map.forEachFeatureAtPixel(pixel, (o) => {
      let features = _that.firstLayer.getSource().getFeatures();
      let find;
      features.forEach(feature => {
        if(feature === o){
          find = feature;
        }
      });
      return find;
    });
    const secFeature = this.map.forEachFeatureAtPixel(pixel, (o) => {

      let features = _that.secLayer.getSource().getFeatures();

      let find;
      features.forEach(feature => {
        if(feature === o){
          find = feature;
        }
      });
      return find;
    });
    if (firstFeature) {
      // 获取 Feature 的几何体
      const geometry = firstFeature.getGeometry();
      // 获取坐标
      const coordinates = geometry.getCoordinates();
      console.log("第一个图层中点位的点击事件被触发了,当前经纬度:"+coordinates)
    }else if(secFeature){
      // 获取 Feature 的几何体
      const geometry = secFeature.getGeometry();
      // 获取坐标
      const coordinates = geometry.getCoordinates();
      console.log("第二个图层中点位的点击事件被触发了,当前经纬度:"+coordinates)
    }else {
      console.log("地图的空白处被点击了")
    }
  });

3.4、完整代码

<template>
  <div>
    <div id="map-container"></div>
  </div>
</template>
<script>
import {Feature, Map, View} from 'ol'
import { Tile as TileLayer } from 'ol/layer'
import { get } from 'ol/proj';
import { getWidth, getTopLeft } from 'ol/extent'
import { WMTS } from 'ol/source'
import WMTSTileGrid from 'ol/tilegrid/WMTS'
import { defaults as defaultControls} from 'ol/control';
import {Point} from "ol/geom";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import {Icon, Style} from "ol/style";

export const projection = get("EPSG:4326");
const projectionExtent = projection.getExtent();
const size = getWidth(projectionExtent) / 256;
const resolutions = [];
for (let z = 0; z < 19; ++z) {
  resolutions[z] = size / Math.pow(2, z);
}

export default {
  data() {
    return {
      map:null,
      overLay:null,
      //图层1
      firstLayer: new VectorLayer({
        source: new VectorSource(),
      }),
      //图层2
      secLayer: new VectorLayer({
        source: new VectorSource(),
      }),
    }
  },
  mounted(){
    this.initMap() // 加载矢量底图
  },
  methods:{
    initMap() {
      const KEY = '你申请的KEY'
      this.map = new Map({
        target: 'map-container',
        layers: [
          // 底图
          new TileLayer({
            source: new WMTS({
              url: `http://t{0-6}.tianditu.com/vec_c/wmts?tk=${KEY}`,
              layer: 'vec', // 矢量底图
              matrixSet: 'c', // c: 经纬度投影 w: 球面墨卡托投影
              style: "default",
              crossOrigin: 'anonymous', // 解决跨域问题 如无该需求可不添加
              format: "tiles", //请求的图层格式,这里指定为瓦片格式
              wrapX: true, // 允许地图在 X 方向重复(环绕)
              tileGrid: new WMTSTileGrid({
                origin: getTopLeft(projectionExtent),
                resolutions: resolutions,
                matrixIds: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15','16','17','18']
              })
            })
          }),
          // 标注
          new TileLayer({
            source: new WMTS({
              url: `http://t{0-6}.tianditu.com/cva_c/wmts?tk=${KEY}`,
              layer: 'cva', //矢量注记
              matrixSet: 'c',
              style: "default",
              crossOrigin: 'anonymous',
              format: "tiles",
              wrapX: true,
              tileGrid: new WMTSTileGrid({
                origin: getTopLeft(projectionExtent),
                resolutions: resolutions,
                matrixIds: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15','16','17','18']
              })
            })
          })
        ],
        view: new View({
          center: [118.958366,32.119577],
          projection: projection,
          zoom: 12,
          maxZoom: 17,
          minZoom: 1
        }),
        //加载控件到地图容器中
        controls: defaultControls({
          zoom: false,
          rotate: false,
          attribution: false
        })
      });

      //分别添加2个图层
      this.map.addLayer(this.firstLayer);
      this.map.addLayer(this.secLayer);

      //添加第一个点
      let firstFeature = this.addPoints([118.958412, 32.119130]);
      this.firstLayer.getSource().addFeature(firstFeature);
      //添加第二个点
      let secFeature = this.addPoints([118.948627, 32.120428]);
      this.secLayer.getSource().addFeature(secFeature);

      this.initPointEvent();
    },
    /**
     * 根据经纬度坐标添加自定义图标 支持base64
     */
    addPoints(coordinate) {
      // 创建feature要素,一个feature就是一个点坐标信息
      let feature = new Feature({
        geometry: new Point(coordinate),
      });
      // 设置要素的图标
      feature.setStyle(
          new Style({
            // 设置图片效果
            image: new Icon({
              src: 'http://api.tianditu.gov.cn/img/map/markerA.png',
              // anchor: [0.5, 0.5],
              scale: 1,
            }),
          }),
      );
      return feature;
    },

    initPointEvent(){
      let _that = this;
      // 添加点击事件
      this.map.on('singleclick', (event) => {
        // 获取点击的坐标
        const pixel = this.map.getEventPixel(event.originalEvent);
        const firstFeature = this.map.forEachFeatureAtPixel(pixel, (o) => {
          let features = _that.firstLayer.getSource().getFeatures();
          let find;
          features.forEach(feature => {
            if(feature === o){
              find = feature;
            }
          });
          return find;
        });
        const secFeature = this.map.forEachFeatureAtPixel(pixel, (o) => {

          let features = _that.secLayer.getSource().getFeatures();

          let find;
          features.forEach(feature => {
            if(feature === o){
              find = feature;
            }
          });
          return find;
        });
        if (firstFeature) {
          // 获取 Feature 的几何体
          const geometry = firstFeature.getGeometry();
          // 获取坐标
          const coordinates = geometry.getCoordinates();
          console.log("第一个图层中点位的点击事件被触发了,当前经纬度:"+coordinates)
        }else if(secFeature){
          // 获取 Feature 的几何体
          const geometry = secFeature.getGeometry();
          // 获取坐标
          const coordinates = geometry.getCoordinates();
          console.log("第二个图层中点位的点击事件被触发了,当前经纬度:"+coordinates)
        }else {
          console.log("地图的空白处被点击了")
        }
      });
    }
  }
}
</script>
<style scoped>

#map-container {
  width: 100%;
  height: 100vh;
}

</style>

四、Gitee源码 

地址:Vue2+OpenLayers给2个标点Feature分别添加独立的点击事件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】unity3D 调用LoadSceneAsync 场景切换后比较暗 部门材质丢失

解决方法&#xff1a;两个场景使用同样灯光 现象 直接进入第二个场景是可以正常显示 调用LoadSceneAsync来切换后&#xff0c;第二个场景出现比较暗的情况 解决方法&#xff1a;两个场景使用同样灯光&#xff0c;在loading 的场景中加入灯光。 Light—Directional Light 如果…

【大模型系列篇】数字人音唇同步模型——腾讯开源MuseTalk

之前有一期我们体验了阿里开源的半身数字人项目EchoMimicV2&#xff0c;感兴趣的小伙伴可跳转至《AI半身数字人开箱体验——开源项目EchoMimicV2》&#xff0c;今天带大家来体验腾讯开源的数字人音唇同步模型MuseTalk。 MuseTalk 是一个实时高品质音频驱动的唇形同步模型&#…

海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”

2024年12月27日&#xff0c;粤港澳大湾区AI领袖峰会在深圳成功举办&#xff0c;大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人&#xff0c;深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时&#xff0c;公…

Go基础之环境搭建

文章目录 1 Go 1.1 简介 1.1.1 定义1.1.2 特点用途 1.2 环境配置 1.2.1 下载安装1.2.2 环境配置 1.2.2.1 添加环境变量1.2.2.2 各个环境变量理解 1.2.3 验证环境变量 1.3 包管理工具 Go Modules 1.3.1 开启使用1.3.2 添加依赖包1.3.3 配置国内包源 1.3.3.1 通过 go env 配置1.…

基于 STM32 的多功能时间管理器项目

引言 在快节奏的生活中&#xff0c;时间管理显得尤为重要。本项目旨在通过 STM32 开发一个多功能时间管理器&#xff0c;功能包括计时器、闹钟和日历。用户可以方便地设置不同的提醒和计时任务&#xff0c;以更好地管理日常生活和工作。 项目名称 多功能时间管理器 环境准备 …

Windows上安装和配置Tabby终端工具并实现远程ssh连接内网服务器

文章目录 前言1. Tabby下载安装2. Tabby相关配置3. Tabby简单操作4. ssh连接Linux4.1 ubuntu系统安装ssh4.2 Tabby远程ssh连接ubuntu 5. 安装内网穿透工具5.1 创建公网地址5.2 使用公网地址远程ssh连接 6. 配置固定公网地址 前言 今天我要给大家分享一个非常实用且强大的开源跨…

国产Docker可视化面板Dpanel的安装与功能解析

国产Docker可视化面板Dpanel的安装及功能介绍 Docker 可视化面板系统&#xff0c;提供完善的 docker 管理功能。 支持查看基本信息、运行状态统计、网络统计、磁盘统计、用量统计等功能 ​​ ​​ 容器管理&#xff1a; ​​ 创建/修改容器 ​​ 支持基本配置、环境变量、…

平滑算法 效果比较

目录 高斯平滑 效果对比 移动平均效果比较: 高斯平滑 效果对比 右边两个参数是1.5 2 代码: smooth_demo.py import numpy as np import cv2 from scipy.ndimage import gaussian_filter1ddef gaussian_smooth_array(arr, sigma):smoothed_arr = gaussian_filter1d(arr, s…

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…

Leetcode 2140. 解决智力问题 动态规划

原题链接&#xff1a;Leetcode 2140. 解决智力问题 class Solution { public:long long mostPoints(vector<vector<int>>& questions) {int n questions.size();vector<long long> dp(n, 0);for (int i n - 1; i > 0; i--) {int a questions[i][0]…

JavaScript-正则表达式方法(RegExp)

RegExp 对象用于将文本与一个模式匹配。 有两种方法可以创建一个 RegExp 对象&#xff1a;一种是字面量&#xff0c;另一种是构造函数。 字面量由斜杠 (/) 包围而不是引号包围。 构造函数的字符串参数由引号而不是斜杠包围。 new RegExp(pattern[, flags])一.符集合 1.选择…

网安——计算机网络基础

一、计算机网络概述 1、Internet网相关概念及发展 网络&#xff08;Network&#xff09;有若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;link&#xff09;所组成&#xff0c;在网络中的结点可以是计算机、集线器、交换机或路由器等多个网络还可以通…

React第二十二章(useDebugValue)

useDebugValue useDebugValue 是一个专为开发者调试自定义 Hook 而设计的 React Hook。它允许你在 React 开发者工具中为自定义 Hook 添加自定义的调试值。 用法 const debugValue useDebugValue(value)参数说明 入参 value: 要在 React DevTools 中显示的值formatter?:…

Facebook 隐私风波:互联网时代数据安全警钟

在社交媒体飞速发展的今天&#xff0c;个人数据的隐私保护已成为全球关注的焦点。作为全球最大的社交平台之一&#xff0c;Facebook面临的隐私问题&#xff0c;尤其是数据泄露事件&#xff0c;频繁引发公众的广泛讨论。从用户信息被滥用到数据泄漏&#xff0c;Facebook的隐私挑…

HTML5 网站模板

HTML5 网站模板 参考 HTML5 Website Templates

Web前端对于登陆注册界面的实现

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>请注册登陆</title> </head> <body&…

Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类&#xff08;人&#xff09; 2.2.2文件类型和访问权限&#xff08;事物属性&#xff09; 2.2.3文件权限值的表示方法 字符…

UML系列之Rational Rose笔记七:状态图

一、新建状态图 依旧是新建statechart diagram&#xff1b; 二、工作台介绍 接着就是一个状态的开始&#xff1a;开始黑点依旧可以从左边进行拖动放置&#xff1a; 这就是状态的开始&#xff0c;和活动图泳道图是一样的&#xff1b;只能有一个开始&#xff0c;但是可以有多个…

Java内存与缓存

Java内存管理和缓存机制是构建高性能应用程序的关键要素。它们之间既有联系又有区别&#xff0c;理解这两者对于优化Java应用至关重要。 Java 内存模型 Java内存模型&#xff08;JMM&#xff09;定义了线程如何以及何时可以看到其他线程修改过的共享变量的值&#xff0c;并且规…

带头双向循环链表(数据结构初阶)

文章目录 双向链表链表的分类概念与结构实现双向链表定义链表结构链表打印判空申请结点初始化头插尾插头删尾删查找指定位置插入和删除销毁链表 顺序表和链表的分析结语 欢迎大家来到我的博客&#xff0c;给生活来点impetus&#xff01;&#xff01; 这一节我们学习双向链表&a…