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

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

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

npm install ol

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

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

<script>
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';  // 引入 Overlay 用于创建悬浮框

export default {
  name: 'MapComponent',
  data() {
    return {
      map: null,
      markerFeatures: [],
      overlay: null,  // 用于存储悬浮框对象
    };
  },
  mounted() {
    // 创建地图对象
    this.map = new Map({
      target:'map',  // 地图渲染的目标 DOM 元素的 ID
      layers: [
        new TileLayer({
          source: new XYZ({
            url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png',  // 自定义背景图层的 URL
          }),
        }),
      ],
      view: new View({
        center: fromLonLat([0, 0]),  // 地图的初始中心坐标
        zoom: 2,  // 初始缩放级别
      }),
    });

    // 添加标记点
    this.addMarkers();

    // 监听地图的点击事件
    this.map.on('click', this.handleMapClick);
  },
  methods: {
    addMarkers() {
      const marker1 = new Feature({
        geometry: new Point(fromLonLat([10, 20])),  // 创建标记点 1 的几何位置
      });
      marker1.setStyle(new Style({
        image: new Icon({
          src: 'custom-icon.png',  // 标记点 1 的自定义图标路径
          anchor: [0.5, 1],  // 图标的锚点
        }),
      }));

      const marker2 = new Feature({
        geometry: new Point(fromLonLat([30, 40])),  // 创建标记点 2 的几何位置
      });
      marker2.setStyle(new Style({
        image: new Icon({
          src: 'another-custom-icon.png',  // 标记点 2 的自定义图标路径
          anchor: [0.5, 1],  // 图标的锚点
        }),
      }));

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

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

      const vectorLayer = new VectorLayer({
        source: vectorSource,  // 为标记点图层设置数据源
      });

      this.map.addLayer(vectorLayer);  // 将标记点图层添加到地图
    },
    handleMapClick(event) {
      const feature = this.map.forEachFeatureAtPixel(event.pixel, (feature) => feature);  // 获取点击位置的特征(如果有)

      if (feature) {  // 如果点击到了标记点
        this.showOverlay(feature);  // 显示悬浮框
      } else {  // 否则
        this.hideOverlay();  // 隐藏悬浮框
      }
    },
    showOverlay(feature) {
      // 创建悬浮框的内容
      const content = `<div>
        <h2>标记点详细信息</h2>
        <button οnclick="handleViewTrajectory()">查看轨迹</button>
        <button οnclick="handleCloseTrajectory()">关闭轨迹</button>
      </div>`;

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

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

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

      // 设置悬浮框的位置
      this.overlay.setPosition(this.map.getCoordinateFromPixel(event.pixel));
    },
    hideOverlay() {
      if (this.overlay) {  // 如果存在悬浮框
        this.map.removeOverlay(this.overlay);  // 从地图中移除悬浮框
        this.overlay = null;  // 重置悬浮框对象为 null
      }
    },
    handleViewTrajectory() {
      // 处理查看轨迹的逻辑(这里仅为示例,实际需根据需求实现)
      console.log('查看轨迹');
    },
    handleCloseTrajectory() {
      // 处理关闭轨迹的逻辑(这里仅为示例,实际需根据需求实现)
      console.log('关闭轨迹');
    },
  },
  beforeDestroy() {
    this.map.un('click', this.handleMapClick);  // 在组件销毁前取消点击事件的监听
  },
};
</script>

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

总结

上述代码实现了在 Vue2 中使用 OpenLayers 创建地图,并添加自定义背景图层、自定义图标的标记点,同时实现了点击标记点显示悬浮框,悬浮框中包含查看轨迹和关闭查看轨迹的按钮。
在 mounted 钩子中,首先创建了地图对象,设置了背景图层和初始视图。然后调用 addMarkers 方法添加标记点,并监听地图的点击事件。
addMarkers 方法中,创建了两个标记点的特征对象,并为它们设置了自定义图标和位置。将这些标记点特征添加到一个数组,创建数据源和图层,最终将图层添加到地图中。
handleMapClick 方法根据点击位置获取是否命中标记点,如果命中则调用 showOverlay 显示悬浮框,否则调用 hideOverlay 隐藏悬浮框。
showOverlay 方法创建了悬浮框的内容,包括标记点的详细信息和操作按钮。创建悬浮框对象,设置其内容、添加到地图并设置位置。
hideOverlay 方法用于在需要时移除悬浮框。
handleViewTrajectory 和 handleCloseTrajectory 方法目前仅作为示例,实际应用中需要根据具体的轨迹数据和需求来实现查看和关闭轨迹的功能。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue2中使用OpenLayers点击标记,可以按照以下步骤操作: 1. 安装OpenLayers使用npm或yarn安装OpenLayers。 2. 导入OpenLayers:在Vue组件中导入OpenLayers。 ``` import ol from 'openlayers'; ``` 3. 创建地图容器:在Vue组件中创建一个地图容器用于显示地图。 ``` <template> <div id="map"></div> </template> <script> export default { name: 'Map', mounted() { var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([0, 0]), zoom: 2 }) }); } } </script> ``` 4. 添加标记:在Vue组件中添加标记并设置点击事件。 ``` <template> <div id="map"></div> </template> <script> export default { name: 'Map', mounted() { var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([0, 0]), zoom: 2 }) }); var marker = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.fromLonLat([0, 0])) }); var vectorSource = new ol.source.Vector({ features: [marker] }); var vectorLayer = new ol.layer.Vector({ source: vectorSource }); map.addLayer(vectorLayer); map.on('click', function(e) { map.forEachFeatureAtPixel(e.pixel, function(feature) { alert('Marker clicked!'); }); }); } } </script> ``` 在上面的代码中,添加了一个标记并将其添加到地图上。然后,将地图的click事件绑定到一个函数,该函数检查单击位置是否在标记上,并触发一个警报。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值