leaflet 加载海量点位,点击marker 查看详情功能

18 篇文章 0 订阅
4 篇文章 0 订阅

在开发有地图需要加载大量点位的时候,就不能使用L.marker 方法来 addTo(map) ,这样会导致地图特别卡,下面我们用一个插件

Leaflet.Canvas-Markers  .

github地址:https://github.com/eJuke/Leaflet.Canvas-Markers   里面有详情的api调用方法。 

接下来我们在项目里面使用

1.加载方式

2种方法加载 

cnpm i  leaflet-canvas-marker  -S       

或者直接下载Leaflet.Canvas-Markers  在项目里面直接引入

2.使用

我是使用的cnpm 安装的所以在项目里面直接使用import 引入

import 'leaflet-canvas-marker';

项目使用的天地图,具体使用方法可以查找案例,或者使用leaftlet 官方使用的 openstreetmap.

首先声明 

let ciLayer = null;

然后在initMap 初始化地图的时候调用,通过github 里面的api 可以知道addOnClickListener 是查看点击了哪个marker 其中data可以取到定义的数据

    ciLayer = L.canvasIconLayer({}).addTo(map);
    ciLayer.addOnClickListener(function(e, data) {
      markerIconShow(data[0].data);
    
    });

接下来 我们随意定义几个点位增加到地图上,其中 使用再定义一个addMarker 来定义一些marker的样式大小等属性

let listIcon=[
      {id:100,locationName:"测试路",goTime:"8:41",stopTime:"1h19min",lat:36.95903,lng:118.099474},
      {id:110,locationName:"测试2",goTime:"9:41",stopTime:"1h19min",lat:36.95891,lng:118.105649},
      {id:120,locationName:"测试3",goTime:"9:41",stopTime:"1h19min",lat:36.954315,lng:118.099383},
      {id:130,locationName:"测试4",goTime:"10:41",stopTime:"1h19min",lat:36.95903,lng:118.099474}
  
  ]

 addMarker(listIcon)

addMarker方法展示

 重点是   ciLayer.addLayers(_markers),将构建好的marker添加到海量点位插件里面,其中用到的 iconTemplate 就是图片地址  "xxx.png"

  //添加标注
  const addMarker = data => {
    let arr = data,
      _markers = [],
      type = markerType;
    if (map) {
      arr.forEach((elem, index) => {
        if (type === "icon") {
          let iconHtml = ``;
          iconHtml = iconTemplate(elem.type);
          let Opts = ``;
          Opts = L.divIcon({
            iconUrl: iconHtml,
            iconSize: [24, 24],
            iconAnchor: [12, 12],
            className: `${
              elem.state
                ? `device device-${index} marker-status-${elem.type} `
                : `device  marker-status-${elem.type}  unnormal `
            }`
          });
          let marker = L.marker([elem.lat, elem.lng], { icon: Opts });
          marker.data = elem;
          marker.bindTooltip(`<span>${elem.title}</span>`, {
            offset: [10, -10],
            direction: "right"
          });
          markers.push(marker);
          _markers.push(marker);
        }
      });
      ciLayer.addLayers(_markers);
    }
  };

markerIconShow方法展示

此方法主要是用于在点击了之后可以查看点击的详情,弹出框向用户展示.注意:若不是纯文本,里面有功能按钮需要使用L.popup 来绑定弹框方法,若使用bindPopup会导致弹框点击第二次点击事件无效的BUG。

其次,再L.popup里面使用addEventListener  来点击按钮 要给一个setTimeout 否则会导致 'addEventListener of null'

 const markerIconShow = data => {
 
  let marker = data;
   
      ajax({
        url: "/api/task/local_detail",
        data: { type: marker.data.type, id: marker.data.id }
      }).then(res => {
        let infoTem = ``;
        infoTem = infoTemplate(res.data, marker.data.type);
        let markerCenter = [marker.data.lat, marker.data.lng];
        // marker.bindPopup(infoTem,{className:"marker-popup"}).openPopup()
        let arr = [];
        let popup = L.popup({
          className: "marker-popup"
        })
          .setLatLng(markerCenter)
          .setContent(infoTem)
          .addTo(map);
        arr.push(popup);
        map.flyTo(markerCenter, 11);
        }
        if (document.getElementById("path-click")) {
          setTimeout(() => {
            document
              .getElementById("path-click")
              .addEventListener("click", function(e) {
                let id = e.target.dataset.id,
                  type = e.target.dataset.type;
                map.closePopup();
                mapRemove(arr);
                pathOut();
                setOutStatus(false);
                pathFun(id, type);
              });
          }, 100);
        }
      });
    }
  };

至此 使用海量点位插件 可以实现加载大量点位,对点位的操作功能

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值