vue3中openlayers绘制多个Overlay

项目需求是要在地图上显示多个div,之前使用Overlay绘制单个显示正常,结果绘制多个的时候就显示一个,不过也解决了,下面我就把核心代码贴一下,如果有什么问题可以留言,我就是提供一个思路。
效果图
在这里插入图片描述
上面图片的信号塔是动态显示的,一般可以使用动态图片,但是我觉得动态图片达不到我想要的效果,所以改成了svg加css做出的动态效果图。

  <span v-for="(item, index) in locationList" :key="index">
    <img
    class="css_animation"
    ref="animationdiv"
    src="../../assets/Signaltower.svg"
    alt=""
    srcset=""
    :id="index"
   
  />
  </span>
  <style lang="less" scoped>
  .css_animation {
  height: 30px;
  width: 30px;
  display: none;
  animation: myfirst 3s ease-in-out;
  animation-iteration-count: infinite;
}

@keyframes myfirst {
  0%,
  100% {
    opacity: 0.5;
    // transform: translateX(-100%); /* 从左侧开始隐藏 */
  }

  50% {
    opacity: 1;
    // transform: translateX(0); /* 在中间状态下居中显示 */
  }
}
    </style>

忽略我命名的不规范,这只是我模拟的假数据

<script setup>
const aaa=ref({ "payload": {
    "lat": 43.887798338,
    "lon": 125.3587389704,
    "radiu": 4000,
    "deviceId": null,
    "locationList": [
      {
        "lat": 43.887798338,
        "lng": 125.3587389704
      },
      {
        "lat": 43.877798338,
        "lng": 125.3587389704
      },
      {
        "lat": 43.879798338,
        "lng": 125.3587389704
      }
    ]
  }
})
const ysjdequipmentlist=(timeToNextHour)=>{
locationList.value=aaa.value.payload.locationList
   aaa.value.payload.locationList.forEach((val,i) => {
          nextTick().then(() => {
        
            initImage(
                animationdiv.value[i],
                {lat: val.lat,lng:val.lng},
                aaa.value.payload.radiu,
                timeToNextHour,
                isdeviceIdShow.value
            ); 
          });            
        
        });
       
    } 
</script>

地图核心代码

 /**
     * 创建地图中心点 
     * @point_div 信号塔容器
     * @value 经纬度
     * @range 半径
     * @timeToNextHour 如果有时间传入说明要更新了
     * @deviceIdEqit 设备id
     */
  
    function initImage(point_div, value, range, timeToNextHour,deviceIdEqit) {   
        if (point_div) {
            // 半径为0不渲染信号塔和圈
            if (range != '0') {
                point_div.style.display = 'block'
                let  point_overlay = new Overlay({
                    name:'Signaltowerlayer',
                    element: point_div,
                    positioning: "center-center",
                    position: [value.lng, value.lat],
                    id:'Signaltowerlayer'
                });
               
                imap.addOverlay(point_overlay);           
                console.log(imap.getOverlays().getArray(),'添加信号塔');
            }else if(range == '0'){
                var feature = new Feature({
                    geometry: new Point( [value.lng, value.lat]),
                });
                let iconStyle = new Style({
                    image: new Icon({
                        //图片地址
                        src: isImageKong,
                        //长宽缩放比
                        scale: [0.2, 0.2],
                        //锚点位置
                        anchor: [0.2, 0.2],
                        //给图片着色
                        // color: 'rgba(255, 0, 0,0.5)',
                        //旋转弧度
                        rotation: 0
                    }),
                });
                feature.setStyle(iconStyle);
                var layers = imap.getLayers();
                layers.forEach(element => {
                    if (element?.get('name') == 'Circlelayers') {
                        element.getSource().addFeature(feature);
                    }
                  });
            }
            imap.getView().setCenter([value.lng, value.lat]);//定位
          
        }
    }
### 使用 OpenLayers 实现测量面积功能 以下是基于 Vue 3OpenLayers 的示例代码,用于实现测量面积的功能。此代码封装了核心逻辑,使其易于集成到项目中。 #### 安装依赖 首先确保安装了必要的库: ```bash npm install vue openlayers ``` #### 示例代码 以下是一个完整的组件示例: ```vue <template> <div id="map-container"></div> </template> <script> import &#39;ol/ol.css&#39;; import { Map, View } from &#39;ol&#39;; import TileLayer from &#39;ol/layer/Tile&#39;; import OSM from &#39;ol/source/OSM&#39;; import VectorSource from &#39;ol/source/Vector&#39;; import VectorLayer from &#39;ol/layer/Vector&#39;; import Draw from &#39;ol/interaction/Draw&#39;; import Overlay from &#39;ol/Overlay&#39;; export default { name: &#39;AreaMeasurement&#39;, data() { return { map: null, drawInteraction: null, vectorSource: new VectorSource(), overlayPopup: null, }; }, mounted() { this.initMap(); this.setupDrawInteraction(); }, methods: { initMap() { const view = new View({ center: [0, 0], zoom: 2, }); this.map = new Map({ target: &#39;map-container&#39;, layers: [ new TileLayer({ source: new OSM() }), new VectorLayer({ source: this.vectorSource }), ], view: view, }); }, setupDrawInteraction() { this.drawInteraction = new Draw({ type: &#39;Polygon&#39;, // 设置绘图类型为多边形 source: this.vectorSource, }); this.map.addInteraction(this.drawInteraction); let sketch; // 当前正在绘制的对象 let measureTooltipElement; let measureTooltip; this.drawInteraction.on(&#39;drawstart&#39;, (event) => { sketch = event.feature; let coordinates = event.coordinate; if (!measureTooltipElement) { measureTooltipElement = document.createElement(&#39;div&#39;); measureTooltipElement.className = &#39;tooltip tooltip-measure&#39;; measureTooltip = new Overlay({ element: measureTooltipElement, offset: [0, -15], positioning: &#39;bottom-center&#39;, }); this.map.addOverlay(measureTooltip); } let geom = sketch.getGeometry(); // 获取几何对象 let output = &#39;&#39;; if (geom.getType() === &#39;Polygon&#39;) { output = &#39;Polygon&#39;; // 显示当前形状名称 } measureTooltipElement.innerHTML = output; measureTooltip.setPosition(coordinates); // 将提示框定位到鼠标位置 }); this.drawInteraction.on(&#39;drawend&#39;, () => { const area = this.calculateArea(sketch.getGeometry()); alert(`The measured area is ${area.toFixed(2)} square meters`); }); }, calculateArea(geometry) { return geometry.getArea(); // 计算多边形的面积 }, }, }; </script> <style scoped> #map-container { width: 100%; height: 600px; } .tooltip { position: relative; background-color: rgba(0, 0, 0, 0.7); border-radius: 4px; color: white; padding: 4px 8px; font-size: 12px; } </style> ``` --- ### 关键点解析 1. **初始化地图** 地图使用 `ol.Map` 初始化,并加载基础瓦片层(如 OSM)。同时创建了一个矢量源 (`vectorSource`) 来存储绘制的图形[^1]。 2. **设置绘图交互** 使用 `ol.interaction.Draw` 创建一个多边形绘图交互器。当用户完成绘制时触发事件回调函数,在其中计算面积并弹窗展示结果[^2]。 3. **动态提示信息** 在绘制过程中实时更新提示信息,通过 `ol.Overlay` 动态显示在地图上[^4]。 4. **面积计算方法** 调用了 `geometry.getArea()` 方法来获取多边形的面积值。注意单位默认为平方米[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值