高德地图中点标记与信息窗体的使用

2023-02-20  本文已影响0人  坐在天台吹吹风

需求描述

vue后台管理平台中引入了高德地图使用页面进行展示,自定义点标记样式以及点击点标记展示信息窗体。
由于项目中已经引入了高德地图,所以本文对高德地图的应用不做说明,假设相关配置均已完成。应用可参考高德开放平台文档

代码实现

<div id="map" ref="map" style="width: 700px; height: 440px;"></div>
mounted(){
  this.initMap(this.$refs.map);
  this.setMarkers(); //调用此方法需要在获取到点标记之后
  this.createInfoWindow();
},
// 初始化地图
initMap(dom) {
  this.map = new AMap.Map(dom, {
    center: [108.94,34.54], //地图中心点位置
    zoom: 12, //地图缩放级别
    mapStyle: "amap://styles/darkblue", //地图的显示样式
  });
},
// 地图标记点
setMarkers() {
  this.map.clearMap();
  let markerList = [];
  this.pointList.forEach((i) => { //this.pointList为点标记列表
    if (i.latitude && i.longitude) {
      AMapUI.loadUI(['overlay/SvgMarker'],(SvgMarker) =>{
        let marker =  new SvgMarker(null, {
          showPositionPoint:false,
          map: this.map,
          position: [i.longitude, i.latitude],
          label: {
            direction: "bottom",
          }
        });
        // 修改点标记样式,如果需要自定义点标记内容则不用调这个方法,需要只是修改点标记样式则可以调用此方法修改
        // marker.setSvgShape(this.getSvgShape(SvgMarker));

        // 自定义点标记内容,需要自定义可参考一下代码
        var markerContent = document.createElement("div");
        markerContent.className = 'circle';

        var markerSpan1 = document.createElement("div");
        markerSpan1.className = 'big-circle1';

        var markerSpan2 = document.createElement("div");
        markerSpan2.className = 'small-circle1';

        markerContent.appendChild(markerSpan1);
        markerContent.appendChild(markerSpan2);

        marker.setContent(markerContent); //更新点标记内容
        marker.setPosition([i.longitude, i.latitude]); //更新点标记位置
      })
      
      marker.on("mouseout", (e) => {
        this.infoWindow.close();
      });

       marker.on("click", (e) => {
         this.openInfoWindow(e, i);
      });
    }
  });
},
// 标记点样式
getSvgShape(SvgMarker) {
  return new SvgMarker.Shape["WaterDrop"]({
    width: 15,
    height: 20,
    fillColor: "red",
    strokeColor: "#ccc",
    strokeWidth: 0,
  });
},
// 创建信息窗体
createInfoWindow() {
  this.infoWindow = new AMap.InfoWindow({
    content: "",
    isCustom: true,
    offset: new AMap.Pixel(0, -20),
  });
},
// 打开信息窗体
openInfoWindow(e,i) {
  let content =
    `<div style='font-size: 14px; padding: 20px; text-align:left; border: 1px solid #58d8ec; background: #042556ed; color: #fff; position: relative;'>
    <p style='padding: 0;margin:0;'>村庄:${i.village}</p>
    <p style='padding: 5px 0 0 0;margin:0;'>姓名:${i.nickName}</p>
    <p style='padding: 5px 0 0 0;margin:0;'>联系电话:${i.phone}</p>
    </div>`;
  this.infoWindow.setContent(content);
  this.infoWindow.open(this.map, e.target.getPosition());
}

遇到问题

  1. 使用自定义点标记marker样式时,设置样式无效。
    因为在style标签上填加了scoped,去掉scoped即可生效。也就是说,自定义点标记样式时,样式必须写在本页面且不能填加scoped属性
  2. 因为需求原因,页面增加了定时器进行刷新,每次刷新时点标记不会清除,marker无法移除。
    通过查找之后发现,需要先清除地图中的所有标记物再进行绘制,调用clearMap方法

总结思考

  1. 像这种有官方文档的,开发时应该仔细阅读文档再进行开发。可是往往由于项目周期紧张的原因,我们会先动手之后遇到问题再去各种查找解决办法。但是,查找解决办法的时候不要忘记先查文档,我想文档应该比较快地会得出答案。
  2. 关于本文信息窗体的关闭,我采用了鼠标移出时自动关闭。也是由于当时看文档时比较着急所以采用这种简单一点的方法,其实可以在窗体中填加×号点击进行关闭,可以认真阅读文档试一下,我已经简单地尝试过了,是可以的。
  3. 好记性不如烂笔头。多记录不仅可以加深印象,下次遇到时也可以直接进行查找。

参考链接

自定义高德地图的标记样式和内容
VUE项目中调用高德地图 (此链接讲了如何引用高德地图,可以进行参考,本文采用的是原生调用。)

上一篇下一篇

猜你喜欢

热点阅读