vue openlayer创建地图弹框overlay

背景:

地图上展示一个overlay,使用的技术框架是vue+openlayer

效果展示:

主要是这个地图弹框:

核心代码:

html 复制代码
<template>
<!-- overlay -->
  <div id="overlay" class="ol-popup" @click="closePop_prediction">
    <div class="pop_titleBox">
      <img alt="" src="../assets/img/port.png">
      <h1>{{ routeState.endPoint }}</h1>
    </div>
    <div class="content_prediction">
      <p>
        <span class="label">船舶名称:</span>
        <span v-if="checkboxState.shipName" class="text">
          {{ checkboxState.shipName.cnName || checkboxState.shipName.names || "--" }}
          /
          {{ checkboxState.shipName.mmsi || "--" }}
        </span>
      </p>
      <p>
        <span class="label">总里程:</span>
        <span class="text">
          {{ state2.show_l_data.totalDistance || "--" }}nm
        </span>
      </p>
      <p>
        <span class="label">已行驶里程/时长:</span>
        <span class="text">
          {{ state2.show_l_data.traveledDistance || "--" }}nm/{{ state2.show_l_data.traveledTime || "--" }}h
        </span>
      </p>
      <p>
        <span class="label">剩余里程/时长:</span>
        <span class="text">
          {{ state2.show_l_data.remainingDistance || "--" }}nm/{{ state2.show_l_data.remainingTime || "--" }}h
        </span>
      </p>
      <p>
        <span class="label">进度百分比:</span>
        <span class="text" style="color: #1FC37F">
          {{ Math.ceil(state2.show_l_data.progress * 100) || "--" }}%
        </span>
      </p>
      <p>
        <span class="label">预抵时间:</span>
        <span class="text">
          {{ state2.show_l_data.eta || "--" }}
        </span>
      </p>
    </div>
  </div>
</template>

核心代码逻辑:

javascript 复制代码
<script setup>
import { nearestPointOnLine } from "@turf/nearest-point-on-line";
import { parse } from 'wellknown';
import * as turf from "@turf/turf";
import Overlay from 'ol/Overlay';
import { fromLonLat, transform, toLonLat } from "ol/proj";

// 3.overlay
const getOverlay = (data) => {
  const map = getMap.mapData.GlobalMap;
  state.overlay = new Overlay({
    element: document.getElementById("overlay"),
    positioning: "bottom-center",
    stopEvent: false,
    offset: [0, -40],
    autoPan: false,
    autoPanAnimation: {
      duration: 0
    }
  });
  map.addOverlay(state.overlay);
  const geoJsonFromWKT_point = parse(data.geom);
  const coordinate = geoJsonFromWKT_point.coordinates;
  const transformCoordinate = transform(coordinate, 'EPSG:4326', 'EPSG:3857');
  state.overlay.setPosition(transformCoordinate);
  // map.on("singleclick", (evt) => {
  //   console.log('ddd', evt.coordinate);
  //   const coordinate = evt.coordinate // 获取坐标
  //   state.overlay.setPosition(coordinate)
  // })
}
</script>

写到这儿功能基本就实现了。。。

相关推荐
计算机学姐1 小时前
基于SpringBoot的高校社团管理系统【协同过滤推荐算法+数据可视化】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法
Wang's Blog7 小时前
前端FAQ: Vue 3 与 Vue 2 相⽐有哪些重要的改进?
前端·javascript·vue.js
ss2738 小时前
Springboot + vue 医院管理系统
vue.js·spring boot·后端
今天也是爱大大的一天吖8 小时前
vue2中的.native修饰符和$listeners组件属性
前端·javascript·vue.js
STUPID MAN10 小时前
Linux使用tomcat发布vue打包的dist或html
linux·vue.js·tomcat·html
JIngJaneIL11 小时前
助农惠农服务平台|助农服务系统|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·助农惠农服务平台
云外天ノ☼11 小时前
待办事项全栈实现:Vue3 + Node.js (Koa) + MySQL深度整合,构建生产级任务管理系统的技术实践
前端·数据库·vue.js·mysql·vue3·koa·jwt认证
一位搞嵌入式的 genius11 小时前
前端实战开发(三):Vue+Pinia中三大核心问题解决方案!!!
前端·javascript·vue.js·前端实战
前端.火鸡11 小时前
Vue 3.5 新API解析:响应式革命、SSR黑科技与开发体验飞跃
javascript·vue.js·科技
嗝屁小孩纸11 小时前
开发集成热门小游戏(vue+js)
前端·javascript·vue.js