vue-openlayers 弹框-地图坐标

https://openlayers.org/en/master/examples/overlay.html?q=overlay

这个效果是点击地图,弹出坐标信息。

点击地图边缘时,底图会跟着移动,使弹窗能完整显示出来。

<template>
  <div class="vm">
    <h2 class="h-title">弹窗 popup</h2>
    <div id="map" class="map-x"></div>
    
    <!-- 弹窗元素 -->
    <div
      class="popup"
      ref="popup"
      v-show="currentCoordinate"
    >
      <span class="icon-close" @click="closePopup">✖</span>
      <div class="content">{
   
   {currentCoordinate}}</div>
    </div>
  </div>
</template>

<script>
import 'ol/ol.css'
import { Map, View } from 'ol'
import Tile from 'ol/layer/Tile'
import OSM from 'ol/source/OSM'
import { toStringHDMS } from 'ol/coordinate'
import { toLonLat } from 'ol/proj'
import Overlay from 'ol/Overlay'

export default {
  name: 'Popup',
  data () {
    return {
      map: null,
      currentCoordinate: null, // 弹窗坐标数据
      overlay: null
    }
  },
  methods: {
    initMap () {
      // 弹窗
      this.overlay = new Overlay({
        element: this.$refs.popup, // 弹窗标签,在html里
        autoPan: true, // 如果弹窗在底图边缘时,底图会移动
        autoPanAnimation: { // 底图移动动画
          duration: 250
        }
      })

      // 实例化地图
      this.map = new Map({
        target: 'map',
        layers: [
          new Tile({
            source: new OSM() // 使用OSM底图
          })
        ],
        overlays: [this.overlay], // 把弹窗加入地图
        view: new View({
          center: [-27118403.38733027, 4852488.79124965], // 北京坐标
          zoom: 12 // 地图缩放级别(打开页面时默认级别)
        })
      })
      this.mapClick() // 初始化地图成功后,给地图添加点击事件
    },
    mapClick () { // 地图点击事件
      // 通过 map.on() 监听,singleclick 是单击的意思。也可以用 click 代替 singleclick。
      this.map.on('singleclick', evt => {
        const coordinate = evt.coordinate // 获取坐标
        const hdms = toStringHDMS(toLonLat(coordinate)) // 转换坐标格式
        
        this.currentCoordinate = hdms // 保存坐标点

        setTimeout(() => {
          // 设置弹窗位置
          // 这里要设置定时器,不然弹窗首次出现,底图会跑偏
          this.overlay.setPosition(coordinate)
        }, 0)
        

      })
    },
    // 关闭弹窗
    closePopup () {
      // 把弹窗位置设置为undefined,并清空坐标数据
      this.overlay.setPosition(undefined)
      this.currentCoordinate = null
    }
  },
  mounted () {
    this.initMap()
  }
}
</script>

<style lang="scss" scoped>
  /* 弹窗样式 */
  .popup {
    min-width: 280px;
    position: relative;
    background: #fff;
    padding: 8px 16px;
    display: flex;
    flex-direction: column;
    transform: translate(-50%, calc(-100% - 12px));

    /* 弹窗下方的小三角形 */
    &::after {
      display: block;
      content: '';
      width: 0;
      height: 0;
      position: absolute;
      border: 12px solid transparent;
      border-top-color: #fff;
      bottom: -23px;
      left: 50%;
      transform: translateX(-50%);
    }
  }
  /* 关闭弹窗按钮 */
  .icon-close {
    cursor: pointer;
    align-self: flex-end;
    margin-bottom: 10px;
  }
</style>

猜你喜欢

转载自blog.csdn.net/ANNENBERG/article/details/107199318