vue2+OpenLayers 天地图上打点并且显示相关的信息(2)

news2024/9/24 5:24:45

上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息
首先有两个事件 鼠标移入 和 鼠标移出事件
pointermove pointerout

鼠标放上去之前
在这里插入图片描述
放上去后
在这里插入图片描述
代码如下

<template>
  <div class="container">
    <div id="vue-openlayers" class="map-x"></div>
    <div
      id="info-box"
      class="info-box"
      style="width: 100px; height: 100px"
    ></div>
    <div id="canv" style="width: 100px; height: 100px"></div>
  </div>
</template>
<script>
import "ol/ol.css";
import { Map, View, style, Feature, geom, Overlay } from "ol";
import TileLayer from "ol/layer/Tile";
import XYZ from "ol/source/XYZ";
import { Vector as VectorSource } from "ol/source";
import VectorLayer from "ol/layer/Vector";
import { Point, LineString } from "ol/geom";
import { Style, Icon, Stroke, Text, Fill } from "ol/style";
import logo from "@/assets/logo.png";
import s40s from "@/assets/img/404.png";
import * as ol from "ol";
import "ol-ext/dist/ol-ext.css";

export default {
  name: "FirstMap",
  data() {
    return {
      map: null,
      draw: null,
      maskLayer: null,
      logo,s40s,
      layers: [],
    };
  },
  methods: {
    initMap() {
      let that = this;
      // 将图标样式应用到点要素
      const features = [];
      const point = new Point([108.56, 34.15]); // 修改坐标格式
      const feature = new Feature({
        geometry: point,
        custom: { data: "123", type: "icon" },
        type: "icon",
      });
      feature.setStyle([
        new Style({
          image: new Icon({
            crossOrigin: "anonymous",
            src: this.logo,
            // size: [40, 40],
            scale: 0.2, // 图标缩放比例
          }),
        }),
      ]);
      features.push(feature);
      //设置地图的数据源
      const source = new VectorSource({
        features,
      });
      let markLayerPoints = new VectorLayer({
        source: source,
      });

      let map = new Map({
        target: "vue-openlayers",
        layers: [
          new TileLayer({
            source: new XYZ({
              url: "https://gdtc.shipxy.com/tile.g?l=en&m=d&z={z}&x={x}&y={y}",
            }),
          }),
          markLayerPoints, // 确保图层顺序正确
          // vectorLayers,
        ],
        view: new View({
          projection: "EPSG:4326",
          center: [108.56, 34.15], // 修改中心坐标格式
          zoom: 6,
        }),
      });

      this.map = map;

      // 定义变量来跟踪是否鼠标悬停在图标上
      var infoBox = document.getElementById("info-box");
      let pointFeatures;
      var iconStyleDefault = new Style({
        image: new Icon({
          src: this.logo, // 图标图片的路径
          crossOrigin: "anonymous",
          scale: 0.2, // 图标缩放比例
        }),
      });
      map.on("pointermove", function (event) {
        if (pointFeatures) {
          infoBox.style.display = "none"; // 隐藏信息盒子
          pointFeatures.setStyle(iconStyleDefault);
        }
      map.forEachFeatureAtPixel(event.pixel, function (feature) {
          console.log("进入11111111111111111111");
          // 这里 feature 就是当前悬停的要素
          if (feature.values_.type == "icon") {
            var coord = feature.getGeometry().getCoordinates(); //地理坐标,也就是经纬度
            var pixel = map.getPixelFromCoordinate(coord); //像素是屏幕上的位置   像素坐标
            pointFeatures = feature; // 当前的图层
            // 设置文本样式,显示在图标旁边
            var textStyle = new Text({
              text: "文本", // 要显示的文本
              font: "14px sans-serif", // 字体样式
              fill: new Fill({
                color: "black", // 文本颜色
              }),
              stroke: new Stroke({
                color: "white", // 文本轮廓颜色,使文本更突出
                width: 2,
              }),
              // 将文本底部对齐到点的坐标位置
              textBaseline: "bottom",
              // 根据需要调整文本的水平对齐方式,'center' 表示文本居中对齐
              textAlign: "center",
            });
            var iconStyleHover1 = new Style({
              image: new Icon({
                src: that.s40s, // 图标图片的路径
                crossOrigin: "anonymous",
                // anchor: [0.5, 46], // 图标锚点,相对于图标大小的百分比
                scale: 0.2, // 图标缩放比例
                textBaseline: "top",
              }),
              text: textStyle,
            });
            pointFeatures.setStyle(iconStyleHover1);

            console.log(infoBox, "infoBoxinfoBox");
            infoBox.style.display = "block"; // 显示信息盒子
            infoBox.style.left = pixel[0] + 10 + "px"; // 设置信息盒子位置
            infoBox.style.top = pixel[1] - 5 - infoBox.offsetHeight + "px"; // 防止信息盒子被图标遮挡
            infoBox.innerHTML = "这里是信息+" + feature.values_.custom.data; // 设置信息盒子内容'; // 设置信息盒子内容
          }
        });
      });
      // 添加鼠标离开图层监听器
      markLayerPoints.on("pointerout", function (event) {
        if (pointFeatures) {
          pointFeatures.setStyle(iconStyleDefault);
          pointFeatures = null;
          infoBox.style.display = "none"; // 隐藏信息盒子
        }
      });
      
    },
},
  mounted() {
    this.initMap();
  },
};
</script>
<style scoped lang="scss">
.input {
  position: fixed;
  top: 10px;
  right: 10px;
  border-radius: 10px;
  background: #fff;
  display: flex;
  flex-direction: column;
  padding: 5px;
  padding-bottom: 10px;

  > * {
    margin-top: 10px;
    display: flex;
    align-items: center;
  }
}
</style>

<style scoped lang="scss">
.container {
  position: relative;

  .btn {
    position: absolute;
    left: 4%;
    top: 1%;
  }
}

#vue-openlayers {
  width: 100vw;
  height: 100vh;
}

h3 {
  line-height: 40px;
}

/* 隐藏信息盒子的初始样式 */
#info-box {
  display: none;
  position: absolute;
  background: white;
  border: 1px solid black;
  padding: 10px;
  border-radius: 5px;
  font-size: 14px;
  pointer-events: none; /* 防止信息盒子影响鼠标事件 */
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多模态大语言模型(MMLLM)的现状、发展和潜力

1、大模型 随着ChatGPT流行&#xff0c;大模型技术正逐渐成为AI领域的热点。许多行业大佬纷纷投身于这一赛道&#xff0c;展示了大模型的独特魅力和广阔前景。 王慧文&#xff0c;前美团联合创始人&#xff0c;发起“AI英雄帖”。 李志飞&#xff0c;出门问问创始人&#xff0…

7个Agent组成的公司,7分钟完成了一个游戏的开发

来源丨投资实习所&#xff08;ID&#xff1a;startupboy&#xff09; 作者丨StartupBoy 市场对 AI Agent 的期望一直很高&#xff0c;除了各种单向任务的 Agent 外&#xff0c;之前斯坦福大学和 Google 的一项实验已经展示了由 25 个 AI Agent 自行协同运行的虚拟城镇&#x…

如何使用Zoom API创建一个会议?

一、注册一个免费的Zoom账号&#xff08;zoom.us) 二、在Zoom 应用市场&#xff08;App Marketplace)创建一个server to server 的app&#xff0c;授予创建会议的权限。 三、创建一个Zoom API的服务端程序(node.js) 1、git clone https://github.com/zoom/server-to-server-o…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

Python-调用pymysql库,执行插入语句

今天写了一个mysql的插入方法&#xff0c;传多条数据时报错: TypeError: not enough arguments for format string 解决:后来排查是因为调用方法是&#xff0c;用的cursor.excute()&#xff0c;导致的报错&#xff0c;改为cursor.excutemany()就插入成功了 方法调用: test.ins…

【ARM CoreLink 系列 5.5 -- CI-700 Debug trace and PMU 】

文章目录 Debug trace and PMUCI-700 Debug trace 系统概述DTC DomainDTC Domain 约束条件DTM device portsDTM FIFO BufferDTM FIFO 缓冲区特点Debug trace and PMU 本篇文章主要是介绍 CI-700中实现的 Debug Trace (DT) and Performance Monitoring Unit (PMU). CI-700 Deb…

漏洞复现-Viessmann Vitogate 远程命令执行漏洞(CVE-2023-45852)

1.漏洞描述 Viessmann Vitogate是Viessmann公司的一个智能化控制系统。 Vitogate 300 2.1.3.0版本的/cgi-bin/vitogate.cgi存在一个未经身份验证的攻击者可利用的漏洞&#xff0c;通过put方法中的ipaddr params JSON数据中的shell元字符实现绕过身份验证并执行任意命令。 2.…

c++_1

C 定义头文件 #ifndef __COMPLEX__ // 这样定义头文件&#xff0c;可以解决有些cpp在包含头文件需要的次序要求&#xff1b;也不会有重复的定义头文件 #define __COMPLEX__#endif#pragma once 是 C 预处理器指令&#xff0c;用于防止头文件被多次包含&#xff0c;从而避免头文…

C++解析和构建json(cjson使用手册)

C解析和构建json【cjson使用手册】 一、cjson下载二、cjson工程使用2.1 静态库使用2.1 源码使用&#xff08;推荐&#xff09; 三、cjson详解3.1 解析json字符串3.1.1 解析对象3.1.2 解析数组&#xff1a;方法一&#xff08;获取列表数量然后按照位置获取&#xff09;3.1.2 解析…

从专家角度看:2024年值得关注的项目文档工具

国内外主流的10款项目文档管理软件对比&#xff1a;PingCode、Worktile、禅道、Tower、飞书、Smartsheet、Jira、Notion、Wrike、Basecamp。 在项目管理的世界里&#xff0c;选择一个合适的文档管理工具可能就是成功与否的关键。众多的系统和功能看似琳琅满目&#xff0c;但这也…

无字母数字绕过正则表达式

目录 1、题目代码 1.异或 php部分&#xff1a; python代码&#xff1a; 2.或 php代码 python代码 测试结果&#xff1a; 3、取反 php脚本&#xff1a; 测试结果&#xff1a; 1、题目代码 <?php error_reporting(0); highlight_file(__FILE__); $code$_GET[code…

速度曲线轨迹规划程序优化(封装FC)

1、S型速度曲线点动控制功能块 S型速度曲线点动控制功能块(博途SCL代码)-CSDN博客文章浏览阅读16次。点动功能块只有4个约束条件。https://rxxw-control.blog.csdn.net/article/details/139657487 2、梯形速度曲线绝对值定位功能块 梯形速度曲线绝对值定位功能块(博途SCL代码…

设计模式六大原则之:单一职责原则

1. 单一职责简介 设计模式中的单一职责原则&#xff08;‌Single Responsibility Principle, SRP&#xff09;‌是面向对象设计中的一个基本原则&#xff0c;‌它强调一个类应该仅有一个引起它变化的原因。‌换句话说&#xff0c;‌一个类应该负责一组相对独立且紧密相关的职责…

VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互

该程序演示了如何使用CogToolBlock进行图像交互. 从vpp文件中加载一个ToolBlock。 用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。 用户还可以从coins.idb或采集FIFO中选择图像。 “运行一次”按钮执行以下操作&#xff1a; 获取下一个图像或读取下一…

数学建模学习笔记

数学建模学习笔记 现学现卖&#xff0c;随缘更新QwQ 主要根据b站大师兄的视频整理而成&#xff0c;有不懂的可以去看原视频 List 数学建模学习笔记一、 层次分析法1.1 矩阵的一致性及其检验1.2 权重计算1.3 具体流程 二、模糊综合评测2.1 隶属函数2.2 隶属函数的确定方法2.3 模…

项目管理中的关键节点——里程碑

里程碑作为项目管理过程中的关键节点&#xff0c;它不仅为项目团队提供了清晰的方向和阶段性目标&#xff0c;还确保了项目能够按照既定的路线稳步前进。 里程碑是项目进程中&#xff0c;那些标志着项目阶段完成或关键决策点的重大事件或时间点。与日常任务或活动不同&#x…

图论(强联通分量)

在图论中&#xff0c;特别是在讨论有向图&#xff08;Directed Graph&#xff09;时&#xff0c;我们常常需要了解图的结构特性&#xff0c;比如强联通分量&#xff08;Strongly Connected Components, SCC&#xff09;。了解强联通分量中的各种边对于理解图的整体结构以及某些…

iPhone官方商店软件下载---免费看各种剧第④弹【iOS版包括iPad】

①点击iPhone自带软件App Store ②点击搜索&#xff0c;输入“模数转换器” &#xff0c;点击下载到手机 ③进入软件页面后&#xff0c;我们需要激活页面&#xff0c;点击“setting”&#xff0c;再点击“feedback” ④在反馈界面输入“小饼干”&#xff0c;点击“Summit”&a…

springboot,mysql多数据源-mybaits

为啥要多数据源&#xff0c;因为我现在有个需求&#xff0c;需要将A库的查询结果&#xff0c;写入到B库。 但是原来的springboot里面就只有A库&#xff0c;所以现在要加上B库。 1.修改application.yaml的数据库连接 这个是原来的 现在改成 其实就是将datasource:xxx&#xff…

微型家庭中控STM32+C#上位机_(STM32部分)

今日尝试开发一款简单好学的 C8T6C#_Winform上位机 的微型家庭中控设备的 小试验品&#xff1a; 这个设备将成为我毕设系统的一个小部分...... 主要开发环境与工具介绍&#xff1a; 单片机 STM32F103C8T6 使用标准库函数编程 Visual Studio 2022软件 C# Winform 开发 上位机…