vue3使用openlayers然后添加自定义背景图层和标记点,标记点使用自定义图标以及点击标记点悬浮详细内容

5 篇文章 0 订阅
2 篇文章 0 订阅

vue3使用openlayers然后添加自定义背景图层和标记点,标记点使用自定义图标以及点击标记点悬浮详细内容

在Vue3中使用OpenLayers,首先需要安装OpenLayers库

npm install vue@next ol

然后,在Vue组件中引入OpenLayers并使用它创建一个地图示例

<template>
  <div id="map"></div>
</template>

<script setup>
import 'ol/ol.css';
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import { fromLonLat } from 'ol/proj';
import Feature from 'ol/Feature';
import Point from 'ol/geom/Point';
import Icon from 'ol/style/Icon';
import Style from 'ol/style/Style';
import Overlay from 'ol/Overlay';

// 创建地图对象
const map = new Map({
  // 指定地图渲染的目标 DOM 元素的 ID
  target: 'ap',
  // 定义地图的图层
  layers: [
    // 创建一个瓦片图层
    new TileLayer({
      // 设置图层的数据源
      source: new XYZ({
        // 自定义背景图层的 URL
        url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png',
      }),
    }),
  ],
  // 定义地图的视图
  view: new View({
    // 地图的初始中心坐标
    center: fromLonLat([0, 0]),
    // 初始缩放级别
    zoom: 2,
  }),
});

// 用于存储标记点的数组
const markerFeatures = [];

// 添加标记点的函数
function addMarkers() {
  // 创建第一个标记点的特征
  const marker1 = new Feature({
    // 定义标记点的几何位置
    geometry: new Point(fromLonLat([10, 20])),
  });
  // 设置标记点的样式
  marker1.setStyle(new Style({
    // 使用自定义图标
    image: new Icon({
      // 自定义图标路径
      src: 'custom-icon.png',
      // 图标的锚点
      anchor: [0.5, 1],
    }),
  }));

  // 创建第二个标记点的特征
  const marker2 = new Feature({
    geometry: new Point(fromLonLat([30, 40])),
  });
  marker2.setStyle(new Style({
    image: new Icon({
      src: 'another-custom-icon.png',
      anchor: [0.5, 1],
    }),
  }));

  // 将标记点特征添加到数组
  markerFeatures.push(marker1, marker2);

  // 创建标记点的数据源
  const vectorSource = new VectorSource({
    features: markerFeatures,
  });

  // 创建标记点图层
  const vectorLayer = new VectorLayer({
    source: vectorSource,
  });

  // 将标记点图层添加到地图
  map.addLayer(vectorLayer);
}

// 处理地图点击事件
map.on('click', (event) => {
  // 获取点击位置处的特征(如果有)
  const feature = map.forEachFeatureAtPixel(event.pixel, (feature) => feature);

  if (feature) {
    // 如果点击到了标记点,显示悬浮框
    showOverlay(feature);
  }
});

// 显示悬浮框的函数
function showOverlay(feature) {
  // 悬浮框的内容
  const content = `<div>
    <h2>标记点详细信息</h2>
    <button @click="handleViewTrajectory">查看轨迹</button>
    <button @click="handleCloseTrajectory">关闭轨迹</button>
  </div>`;

  // 创建悬浮框对象
  const overlay = new Overlay({
    // 创建 DOM 元素作为悬浮框的载体
    element: document.createElement('div'),
    // 悬浮框的定位方式
    positioning: 'bottom-center',
  });

  // 设置悬浮框的内容
  overlay.getElement().innerHTML = content;

  // 将悬浮框添加到地图
  map.addOverlay(overlay);

  // 设置悬浮框的位置
  overlay.setPosition(map.getCoordinateFromPixel(event.pixel));
}

// 处理查看轨迹的点击事件
function handleViewTrajectory() {
  console.log('查看轨迹');
}

// 处理关闭轨迹的点击事件
function handleCloseTrajectory() {
  console.log('关闭轨迹');
}
</script>

<style scoped>
#map {
  width: 100%;
  height: 500px;
}
</style>

总结

上述代码是一个使用 Vue 3 和 OpenLayers 实现添加自定义背景图层、自定义图标标记点,并在点击标记点时显示带有查看轨迹和关闭轨迹按钮的悬浮框的示例。
首先,导入了 OpenLayers 所需的模块和样式。
创建了地图对象 map ,设置了背景图层的 URL 、初始中心坐标和缩放级别。
markerFeatures 数组用于存储标记点的特征。
addMarkers 函数用于创建标记点特征,设置样式,并将其添加到图层中。
通过 map.on(‘click’) 监听地图的点击事件。在事件处理函数中,如果点击到了标记点,调用 showOverlay 函数显示悬浮框。
showOverlay 函数创建了悬浮框的内容,包括标题和查看轨迹、关闭轨迹的按钮。然后创建悬浮框对象,设置内容、添加到地图并确定位置。
handleViewTrajectory 和 handleCloseTrajectory 函数分别处理查看轨迹和关闭轨迹按钮的点击事件,目前只是简单地打印日志。。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 引入高德地图API 在vue3项目中,可以通过在index.html中引入高德地图API的方式来使用高德地图。在head标签中添加以下代码: ```html <script src="https://webapi.amap.com/maps?v=1.4.15&key=你的高德地图key"></script> ``` 其中,key为你在高德开放平台申请的地图应用的key。 2. 在组件中添加地图容器 在组件模板中添加一个div作为地图容器: ```html <template> <div id="map"></div> </template> ``` 3. 初始化地图 在组件中添加一个mounted生命周期钩子,在其中初始化地图: ```javascript mounted() { const map = new AMap.Map("map", { zoom: 13, //地图级别 center: [116.397428, 39.90923], //中心坐标 }); } ``` 其中,zoom为地图级别,center为地图中心的经纬度坐标。 4. 添加标记 在地图上添加标记,可以通过AMap.Marker类来实现。在mounted生命周期钩子中添加以下代码: ```javascript const marker = new AMap.Marker({ position: [116.397428, 39.90923], //标记位置 title: "这是一个标记", //鼠标悬停时的提示信息 }); marker.setMap(map); //将标记添加到地图中 ``` 其中,position为标记的经纬度坐标,title为鼠标悬停时显示的提示信息。 完整代码如下: ```html <template> <div id="map"></div> </template> <script> export default { mounted() { const map = new AMap.Map("map", { zoom: 13, center: [116.397428, 39.90923], }); const marker = new AMap.Marker({ position: [116.397428, 39.90923], title: "这是一个标记", }); marker.setMap(map); }, }; </script> ``` 运行项目后即可在地图上看到一个标记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值