vue3天地图如何实现自定义信息窗

上代码:

//lnglat 数据可以自行创建
//数据模板参考
/*{
    "type": "6",
    "typeText": "",
    "lat": 31.40528426728419,
    "lng": 121.48942597741174,
    "time": "2023-07-28 15:10:10",
    "insp": [
        {
            "itemName": "",
            "type": "bridge",
            "status": "2",
            "statusText": "缺损",
            "image": [],
            "uid": "1",
            "userName": "uu",
            "platform": "wxapp",
            "desc": "",
            "memo": "",
            "option": "1",
            "description": "1",
            "remark": "1",
            "time": "2023-07-12 13:42:26"
        },
        {
            "itemName": "桥",
            "type": "",
            "status": "2",
            "statusText": "",
            "image": [],
            "uid": "1",
            "userName": "",
            "platform": "wxapp",
            "desc": "",
            "memo": "",
            "option": "2",
            "description": "2",
            "remark": "2",
            "time": "2023-07-12 13:42:15"
        },
        {
            "itemName": "",
            "type": "bridge",
            "status": "2",
            "statusText": "",
            "image": [],
            "uid": "1",
            "userName": "",
            "platform": "wxapp",
            "desc": "",
            "memo": "",
            "option": "2",
            "description": "2",
            "remark": "2",
            "time": "2023-07-12 13:42:38"
        }
    ],
    "toType": ""
}*/
const loadTrack = (lnglatList)=>{
  mapRef.value.clearOverLays(); //mapRef.value 天地图实例
  if (lnglatList.length != 0) {
    let view = mapRef.value.getViewport(eval(lnglatList)); //自适应标点可视范围内
    let mapZoom = view.zoom;
    let centerPoint = view.center;
    mapRef.value.centerAndZoom(centerPoint,mapZoom - 1); 
  }
  if (lnglatList.length != 0) {
    let icon0 = new T.Icon({
      iconUrl: require('@/assets/images/point.svg'),
      iconSize: new T.Point(15, 15),
      iconAnchor: new T.Point(11, 8)
    });
    let icon1 = new T.Icon({
      iconUrl:require('@/assets/images/markerA.png') ,
      iconSize: new T.Point(38, 28),
      iconAnchor: new T.Point(12, 25)
    });
    let icon2 = new T.Icon({
      iconUrl: require('@/assets/images/markerB.png'),
      iconSize: new T.Point(38, 28),
      iconAnchor: new T.Point(12, 25)
    });
    let iconMakers = lnglatList.map((item, i) => {
      let marker;
      if (i === 0) {
        marker = new T.Marker(new T.LngLat(item.lng, item.lat), { icon: icon1 });
        item.toType = '巡检开始点';
      } else if (i === lnglatList.length - 1) {
        marker = new T.Marker(new T.LngLat(item.lng, item.lat), { icon: icon2 });
        item.toType = '巡检结束点';
      } else {
        marker = new T.Marker(new T.LngLat(item.lng, item.lat), { icon: icon0 });
        item.toType = '巡检途径';
      }
      let infoWindow = createInfoWindow(MapInfoWindow,{ ops: item, preview: (img) => $preview({ file: img }) }); //创建信息窗口
      marker.addEventListener("click", function() {
        mapRef.value.panTo({lng:item.lng,lat:item.lat}); //将坐标中心点 改成 marker 所在位置
        marker.openInfoWindow(infoWindow); //开启信息窗口
      });
      mapRef.value.addOverLay(marker);
      return marker;
    });
  }
}

//创建信息窗口函数
const createInfoWindow = (node,vnodeProps = {})=>{
  const infoWindowContent = createVNode(node,vnodeProps);
  let infoNodeContent = document.createElement('div');
  render(infoWindowContent, infoNodeContent); //利用 vue render 渲染函数 编译成 原始html代码
  let infoWindow = new T.InfoWindow(infoNodeContent,{/* minWidth:300,maxHeight:260 */});// 创建信息窗口对象
  return infoWindow;
}

别忘了引入函数

MapInfoWindow 组件

<template>
  <h4 style="margin-bottom:5px;">
    {{ ops.toType }}
  </h4>
  <div class="info-main">
    <el-carousel v-if="ops.insp.length" indicator-position="outside" :interval="5000" style="height:190px;">
      <el-carousel-item v-for="(item,index) in ops.insp" :key="index">
        <div class="img-body">
          <template v-if="item.image.length">
            <img v-for="(img,imgIndex) in item.image" :key="imgIndex" :alt="item.itemName" :src="img" @click="preview(img)">
          </template>
          <div v-else class="none-title">
            无图片
          </div>
          <div class="card-img-title">
            <div class="title-div">
              <span>检查项目:{{ item.itemName }}</span>
              <span>状况:{{ item.statusText }}</span>
            </div>
            <div class="title-div">
              <span>时间:{{ item.time }}</span>
              <span>巡检员:{{ item.userName }}</span>
            </div>
          </div>
        </div>
      </el-carousel-item>
    </el-carousel>
    <h4>巡检类型:{{ ops.typeText }}</h4>
    <h4>巡检时间:{{ ops.time }}</h4>
  </div>
</template>
<script name="locusInfoWindow" setup>
import {defineProps} from 'vue'
import {ElCarousel,ElCarouselItem} from 'element-plus'
const props = defineProps({
  ops:{
    type:Object,
    default() {
      return {}
    }
  },
  preview:{
    type:Function,
    default() {
      return function() {}
    }
  }
})

const preview = (img)=>{
  props.preview && props.preview(img)
}
</script>

<style lang="scss" scoped>
.info-main{
  padding-top:10px;
  min-width:300px;
  max-width:300px;
  max-height:290px;
  overflow:overlay;
  border-top:1px solid #959595;
  :deep(.el-carousel__container){
      height:calc(100% - 20px);
      .img-body {
        display: flex;
        flex-direction: column;
        position: relative;
        background: rgba(6, 41, 39, 0.5);
        height: 100%;
        img {
          height: 70%;
          object-fit: scale-down;
        }
        .none-title{
          height:70%;
          line-height:70%;
          font-size: 16px;
          font-weight: bold;
          align-items: center;
          display: flex;
          justify-content: center;
        }
        .card-img-title {
          display: flex;
          flex-direction: column;
          justify-content: space-around;
          position: absolute;
          height: 30%;
          bottom: 0;
          background: #353d4d;
          width: 100%;
          font-size: 12px;
          color: #cfcfcf;

          .title-div {
            display: flex;
            flex-direction: row;
            justify-content: space-around;

            span {
              text-align: center;
              width: 50%;
            }
          }
        }
      }
  }
}
</style>

默认窗口样式可参考以下css 


  :deep(.tdt-infowindow){
    background-color:transparent;
    .tdt-infowindow-content-wrapper{
      /*css*/
    }
    .tdt-infowindow-close-button{
      
    }
  }
  :deep(.tdt-infowindow-tip-container){
    .tdt-infowindow-tip{
      
    }
  }

根据自己的方式去设计

以上只是给各位一个自定义窗口的思路!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue百度地图自定义信息口,可以通过以下步骤实现: 1. 安装百度地图JavaScript API库 在Vue项目中,可以通过npm安装百度地图JavaScript API库: ``` npm install bmap-jsapi ``` 2. 在Vue组件中引入百度地图JavaScript API库 在Vue组件中,可以通过以下方式引入百度地图JavaScript API库: ``` import BMap from 'bmap-jsapi'; ``` 3. 创建百度地图实例和信息口 在Vue组件的`mounted`生命周期中,可以创建百度地图实例和信息口: ``` mounted() { const map = new BMap.Map('map-container'); const point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); const marker = new BMap.Marker(point); map.addOverlay(marker); const infoWindow = new BMap.InfoWindow('<p>这是一个自定义信息口</p>'); marker.addEventListener('click', function(){ this.openInfoWindow(infoWindow); }); } ``` 在上述代码中,首先创建了一个BMap.Map实例,并定位到北京市中心点。然后创建了一个BMap.Marker实例,并添加地图上。最后创建了一个BMap.InfoWindow实例,设置了自定义信息口内容,并添加到BMap.Marker实例上。 4. 自定义信息口样式 为了自定义信息口样式,可以在创建BMap.InfoWindow实例时,传入一个样式对象,并通过CSS样式来设置信息口的样式: ``` const infoWindow = new BMap.InfoWindow(` <div class="info-window"> <h3 class="title">这是一个自定义信息口</h3> <p class="content">欢迎来到百度地图JavaScript API</p> </div> `, { width: 300, height: 150, enableMessage: false }); ``` 在上述代码中,通过HTML字符串构建了一个自定义信息口,并为其添加了CSS样式。 完整代码如下: ``` <template> <div id="map-container" style="width: 100%; height: 500px;"></div> </template> <script> import BMap from 'bmap-jsapi'; export default { mounted() { const map = new BMap.Map('map-container'); const point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); const marker = new BMap.Marker(point); map.addOverlay(marker); const infoWindow = new BMap.InfoWindow(` <div class="info-window"> <h3 class="title">这是一个自定义信息口</h3> <p class="content">欢迎来到百度地图JavaScript API</p> </div> `, { width: 300, height: 150, enableMessage: false }); marker.addEventListener('click', function(){ this.openInfoWindow(infoWindow); }); } } </script> <style> .info-window { background-color: #fff; border: 1px solid #ccc; padding: 10px; font-size: 16px; } .title { font-size: 24px; margin-bottom: 10px; } .content { margin: 0; } </style> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值