Vue中使用Openlayers添加提示信息

博客展示了部分Vue的关键代码及其呈现的效果,聚焦于Vue技术相关内容,为Vue开发提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部分关键代码

<!-- 主页面 -->
<template>
	<div id="coalmap"  class="map">
		<div v-for="(i, index) in popupList" :key="index">
	        <home-popup :id="i.id" :popup="i" @closepop="closepop"></home-popup>
	      </div>
      </div>
</template>
export default {
	data () {
		return {
			coalMap: null,
			sendataForm: null,
			popupList: []
		}
	},
	components: {
      homePopup
    }
	methods: {
	  ...
	  // 监听单击事件
      monitorsbclick () {
        let self = this
        this.coalMap.on('singleclick', function (e) {
          let pixel = self.coalMap.getEventPixel(e.originalEvent)
          let fet = self.coalMap.forEachFeatureAtPixel(pixel, function (fe) {
            return fe
          })
          if (fet) { // 点击到图标
            let value = JSON.parse(fet.get('value'))
            self.sendataForm.name = value.name
            self.sendataForm.location = value.location
            self.getIconData(value)
          }
        })
      },
		// 查询点位信息
      getIconData (val) {
        this.messList = []
        this.$http({
          url: this.$http.adornUrl('/api/home/getDevAttrs'),
          method: 'get',
          params: this.$http.adornParams({
            'code': val.code,
            'type': val.type
          })
        }).then(({data}) => {
          this.messList = data.data
          // 生成弹窗
          this.setPoper(val, data.data)
        })
      },
      // 生成弹窗
      setPoper (val, list) {
        let a = this.popupList.filter(i => {
          return i.id === val.id + ''
        })
        let vid = val.id + ''
        if (a.length === 0) {
          this.popupList.push({
            id: vid,
            name: JSON.parse(JSON.stringify(this.sendataForm.name)),
            messList: list
          })
        }
        this.$nextTick(() => {
          let container = document.getElementById(vid)
          let overlay = new ol.Overlay(({
            id: `odom${vid}`,
            element: container,
            autoPan: true,
            positioning: 'bottom-left',
            autoPanAnimation: {
              duration: 250
            }
          }))
          this.coalMap.addOverlay(overlay)
          overlay.setPosition([parseFloat(val.xAxis), parseFloat(val.yAxis)])
        })
      },
      closepop (ids) {
        let b = this.coalMap.getOverlays().getArray()
        for (var i = 0; i < b.length; i++) {
          if (b[i].id === `odom${ids}`) {
            b[i].setPosition(undefined)
          }
        }
      },
      ...
	}
}
<!-- 组件 -->
<template>
  <div class="ol-popup">
    <div class="fontTitle">
      <span>{{popup.name}}</span>
      <i class="el-icon-close closeIcon" @click="closepop(popup.id)"></i>
    </div>
    <div class="popup-content">
      <hr class="style-five" />
      <div v-for="(a, aindex) in popup.messList" :key="aindex">
        {{a.name}}
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    props: {
      popup: {
        type: Object
      }
    },
    methods: {
      closepop (id) {
        this.$emit('closepop', id)
      }
    }
  }
</script>

<style lang="scss">
  .ol-popup {
    min-width: 100px;
    min-height: 30px;
    max-height: 140px;
    overflow-y: auto;
    background: rgba(53,55,58,0.8);
    -webkit-box-shadow: -5px 0px 15px #494A4F inset, 10px 0px 15px #494A4F inset;
     box-shadow: -5px 0px 15px #494A4F inset, 10px;
    margin-left: 12px;
    margin-bottom: 20px;
  }
  .closeIcon {
    color: #ED2641;
    cursor: pointer;
    float: right;
    font-size: 20px;
    line-height: 30px;
    margin-top: 1px;
    margin-right: 1px;
  }
  .fontTitle {
    span {
      font-size: 14px;
      line-height: 30px;
      margin-right: 10px;
      margin-left: 10px;
      color: #fff;
    }
  }
  .popup-content {
    max-height: 100px;
    overflow-y: auto;
    margin-right: 0px;
    float: left;
    font-size: 12px;
    line-height: 20px;
    color: #fff;
  }
</style>

效果
在这里插入图片描述

<think>好的,用户想在Vue3项目中使用OpenLayers修改地图版权信息。我需要先回忆一下相关的知识。记得OpenLayers的版权控件可以通过配置来调整,可能需要找到对应的设置位置。 首先,用户使用的是Vue3,所以项目结构可能基于组合式API,比如使用setup语法。我需要考虑如何在Vue组件中正确引入OpenLayers并配置地图。根据引用中的内容,他们提到了自定义版权信息的方法,可能需要通过Map的controls属性来添加或修改。 接下来,版权信息通常属于地图控件的一部分。OpenLayers的默认控件包括缩放、旋转等,版权信息控件可能默认显示底图提供的版权。要修改它,可能需要移除默认的版权控件,然后添加自定义的。 然后,我需要确认如何创建自定义的版权控件。查阅OpenLayers文档,版权控件是ol/control/Attribution,可以通过实例化这个类并传入新的参数来定制内容。比如,设置collapsible为false可以让控件一直展开,而不要折叠按钮。 另外,用户可能需要动态修改版权信息,比如根据不同的地图源切换显示。这时候可以考虑在控件初始化时绑定变量,或者在需要的时候通过方法更新内容。但根据引用中的例子,他们可能是在初始化时静态设置的,所以需要指导用户如何在Vue中动态处理。 还要注意Vue3的响应式系统,比如使用ref或reactive来管理控件实例,确保在数据变化时正确更新DOM。不过版权控件的内容可能在创建后无法直接修改,这时候可能需要替换整个控件实例。 可能的步骤包括:引入OpenLayers的Attribution控件,在创建地图时配置controls选项,排除默认控件,添加自定义的版权控件。同时,在Vue组件中正确管理地图实例的生命周期,比如在onMounted钩子中初始化地图,避免内存泄漏。 最后,需要检查示例代码的正确性,确保使用正确的导入路径(如从'ol/control'引入Attribution),以及Vue3的语法,比如使用setup函数和组合式API。可能还需要处理CSS样式,确保版权信息正确显示在页面上。</think>在 Vue3 中使用 OpenLayers 修改地图版权信息,可通过以下步骤实现: ### 一、基础配置方法 1. **引入 OpenLayers 控件** 在组件中引入版权信息控件: ```javascript import Attribution from 'ol/control/Attribution'; import { Map, View } from 'ol'; ``` 2. **创建自定义版权控件** 通过 `new Attribution()` 构造函数配置参数: ```javascript const customAttribution = new Attribution({ collapsible: false, label: '©', // 默认折叠按钮显示内容 tipLabel: '版权信息', // 鼠标悬停提示 className: 'custom-attribution', // 自定义 CSS 类名 target: document.getElementById('attribution-container') // 指定渲染容器(可选) }); ``` 3. **初始化地图时注入控件** 在 Vue3 的 `onMounted` 生命周期中配置地图: ```javascript const map = new Map({ target: 'map-container', controls: [customAttribution], // 注入自定义控件 view: new View({ /* 视图配置 */ }) }); ``` ### 二、动态修改技巧 ```vue <script setup> import { ref, onMounted } from 'vue'; import Attribution from 'ol/control/Attribution'; const attributionText = ref('Custom © 2023'); onMounted(() => { const dynamicAttribution = new Attribution({ html: `<span>${attributionText.value}</span>` }); // 修改版权内容 setTimeout(() => { attributionText.value = 'Updated © 2024'; dynamicAttribution.setElement(document.createElement('div')); // 强制刷新 }, 5000); }); </script> ``` ### 三、样式优化建议 在 `<style>` 标签中添加 CSS 规则: ```css .custom-attribution { background: rgba(255,255,255,0.8); padding: 2px 5px; border-radius: 3px; font-family: 'Arial'; } ``` ### 四、注意事项 1. 使用 `controls: defaultControls().extend([customAttribution])` 可保留默认控件[^2] 2. 通过 `map.removeControl()` 可移除特定版权控件 3. 多图层场景需注意不同图层的版权信息叠显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值