当前位置: 首页 > news >正文

100.Vue3 + OpenLayers:使用 marker-feature 添加 Marker

在前端 GIS(地理信息系统)开发中,OpenLayers 是一个强大的开源地图库,可以帮助开发者快速构建 Web 地图应用。本文将详细介绍如何在 Vue3 项目中,使用 OpenLayers 并结合 marker-feature 插件来添加 Marker


1. 项目初始化

如果你的 Vue3 项目还没有创建,可以使用 Vite 进行快速搭建:

npm create vite@latest vue-openlayers-demo --template 
vue cd vue-openlayers-demo npm install

然后安装 OpenLayersmarker-feature 插件:

npm install ol ol-marker-feature ol-popup

2. 创建 MarkerFeature.vue 组件

components 目录下新建 MarkerFeature.vue,然后使用 setup 语法来封装 OpenLayers 地图,并添加 marker-feature

<!--
 * @Author: 彭麒
 * @Date: 2025/3/12
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->  
<template>
  <div class="container">
    <div class="w-full flex justify-center">
      <div class="font-bold text-[24px]">在Vue3 + OpenLayers使用 marker-feature 来添加 marker</div>
    </div>
    <div id="vue-openlayers"></div>
  </div>
</template>

<script setup>
import { onMounted } from "vue";
import "ol/ol.css";
import { Map, View } from "ol";
import Tile from "ol/layer/Tile";
import OSM from "ol/source/OSM";
import Marker from "ol-marker-feature";
import Popup from "ol-popup";

let map; // map 作为普通变量,不使用 ref

const initMap = () => {
  if (map) return; // 避免重复初始化

  const OSMlayer = new Tile({ source: new OSM() });

  map = new Map({
    target: "vue-openlayers",
    layers: [OSMlayer],
    view: new View({
      center: [113.448, 23.986],
      zoom: 7,
      projection: "EPSG:4326",
    }),
  });

  const marker = new Marker([113.448, 23.986]);
  marker.set(
    "info",
    `<div style="background:#fff; padding:20px;">
      <h3>我的 Marker 标题</h3>
      <h4>vue-openlayers 的信息内容</h4>
    </div>`
  );
  marker.setMap(map);

  const popup = new Popup({ offset: [0, -32] });
  map.addOverlay(popup);

  marker.on("click", () => {
    popup.show(marker.getLocation(), marker.get("info"));
  });
};

onMounted(initMap);
</script>

<style scoped>
.container {
  width: 840px;
  height: 590px;
  margin: 50px auto;
  border: 1px solid #42B983;
}
#vue-openlayers {
  width: 800px;
  height: 470px;
  margin: 0 auto;
  border: 1px solid #42B983;
  position: relative;
}
</style>

3. 组件解析

3.1 OpenLayers 地图初始化

我们创建了一个 OSM(OpenStreetMap)底图,并在 div#vue-openlayers 内渲染 Map 实例:

map = new Map({ 
    target: "vue-openlayers", 
    layers: [OSMlayer], 
    view: new View({ 
        center: [113.448, 23.986], 
        zoom: 7, 
        projection: "EPSG:4326", 
    }), 
});

注意:OpenLayers 默认使用 EPSG:3857 投影,因此如果你的坐标是 EPSG:4326,请确保所有数据一致。


3.2 添加 Marker

ol-marker-feature 允许我们直接创建 Marker 并绑定到 Map

const marker = new Marker([113.448, 23.986]); 
marker.set("info", "<div>Vue3 OpenLayers Marker</div>"); 
marker.setMap(map);

这样,我们的 Marker 就会出现在指定经纬度的位置。


3.3 绑定 Popup 信息框

为了让 Marker 可以在点击时弹出 Popup,我们使用 ol-popup 插件:

const popup = new Popup({ offset: [0, -32] }); 
map.addOverlay(popup); 
marker.on("click", () => { 
    popup.show(marker.getLocation(), marker.get("info")); 
});

这样,点击 Marker 时就能弹出对应的 HTML 内容。


4. 在 App.vue 引用组件

App.vue 中引入 MarkerFeature.vue 并使用:

<template> 
    <MarkerFeature /> 
</template> 
<script setup> 
    import MarkerFeature from "./components/MarkerFeature.vue"; 
</script>

5. 运行项目

npm run dev

打开浏览器,访问 http://localhost:5173(默认 Vite 端口),你应该可以看到地图,以及点击 Marker 后弹出的 Popup 信息框。


6. 常见问题

Uncaught TypeError: Class constructor _Feature cannot be invoked without 'new'

如果 ol-marker-feature 发生此错误,可以使用 Feature + Point 方式替代:

import Feature from "ol/Feature"; 
import Point from "ol/geom/Point"; 
import VectorLayer from "ol/layer/Vector"; 
import VectorSource from "ol/source/Vector"; 
import { Icon, Style } from "ol/style"; 
import { fromLonLat } from "ol/proj"; // 使用 Feature + Point 方式创建 Marker 
const markerFeature = new Feature({ 
    geometry: new Point(fromLonLat([113.448, 23.986])), 
}); 
markerFeature.setStyle( new Style({ 
    image: new Icon({ anchor: [0.5, 1], 
    src: "https://openlayers.org/en/latest/examples/data/icon.png", // 自定义图标 
    }), 
}) ); // 创建矢量图层 
const vectorLayer = new VectorLayer({ 
    source: new VectorSource({ features: [markerFeature], }), 
}); 
map.addLayer(vectorLayer);

推荐:如果 marker-feature 兼容性不好,建议直接用 Feature + Point 方式实现。


7. 总结

  • Vue3 + OpenLayers 提供了强大的 Web 地图能力
  • marker-feature 可以快速添加 Marker,但兼容性可能有问题
  • 推荐使用 Feature + Point 方式 来实现 Marker
  • 可以结合 ol-popup 添加信息弹窗交互

8. 参考文档

  • OpenLayers 官网
  • ol-marker-feature GitHub
  • Vue.js 官网

这样,你的 CSDN 文章就完成了!🚀 希望能帮到你,记得给文章加点排版,效果会更好哦! 🎉

相关文章:

  • linux基本操作系统2
  • How to install a package in offline scenario in Ubuntu 24.04
  • bean的加载过程
  • WPF从初学者到专家:实战项目经验分享与总结
  • Gymnasium Taxi‐v3 环境 与 Q-learning 算法 —— 强化学习入门 I
  • 2min搞定~Mac Pro 编译安装 Nginx 1.8.1
  • IP地址到地理地址查询的实现逻辑
  • 【Go】字符串相关知识点
  • ranger集成starrock报错
  • CTFshow 【WEB入门】信息搜集 【VIP限免】 web1-web17
  • 【第四节】windows sdk编程:windows 中的窗口
  • 隐藏的git文件夹
  • 【解决报错】:detected dubious ownership in repository at ‘D:/idea_code/xxx‘问题
  • 每日一题——两两交换链表中的节点
  • koltin在android 开发
  • 微电网管理 实现分布式能源的智能调度和管理
  • 【Java】并发编程实战:单例模式 + 阻塞队列的终极实现指南
  • 系统化战略管理国产软件的开创者与引领者
  • 【结构光相机的精度极限】
  • 【网络通信安全】子专栏链接及简介
  • 中共中央、国务院印发《党政机关厉行节约反对浪费条例》
  • 李洋谈美国黑帮电影与黑帮文化
  • 江西4人拟任县(市、区)委书记,其中一人为“80后”
  • 尹锡悦宣布退出国民力量党
  • 刘国中将出席第78届世界卫生大会并顺访瑞士、访问白俄罗斯
  • 陕西三原高新区违法占用土地,被自然资源局罚款10万元