leaflet 多个图层做聚合

使用到的点位聚合插件是 leaflet.markercluster-src

git 地址:https://github.com/Leaflet/Leaflet.markercluster#customising-the-clustered-markers

使用方法

1.把相关css/js 引入项目文件夹后 使用import导入

import "./css/screen.css"
import "./css/MarkerCluster.css"
import "./css/MarkerCluster.Default.css"
import "./js/leaflet.markercluster-src"

2.创建加载点位的变量,我这里有10种类型图标,先定义变量 用于存放生成的marker 组

let polyMarkers={
  station:[],
  moun:[],
  patrol:[],
  physical:[],
  car:[],
  face:[],
  video:[],
  phone:[],
  wifi:[],
  high:[]
}
 markerArr.forEach((item)=>{
      polyMarkers[item]=L.markerClusterGroup();
    }) 

3.分组加载点位,这里markerArr主要用于匹配上面定义的polyMarkers 添加多个聚合组

let markerArr=["station","moun","patrol","physical","car","face","video","phone","wifi","high"]
let data=[
    {
				"id": 2,
				"lat": "36.386719",
				"lng": "119.047852",
				"title": "岗亭1",
				"type": "moun",
				"state": 1
			}, {
				"id": 3,
				"lat": "28.300781",
				"lng": "115.532227",
				"title": "岗亭2",
				"type": "moun",
				"state": 1
			}, {
				"id": 4,
				"lat": "36.964249",
				"lng": "118.073521",
				"title": "警务站1",
				"type": "station",
				"state": 1
			}, {
				"id": "37032101001316004014",
				"lat": "36.949660778045654",
				"lng": "118.09536159038544",
				"title": "车载12_巡特警x鲁xC-2898警",
				"type": "patrol",
				"state": 1
			}, {
				"id": "37032101001316004013",
				"lat": "36.960850954055786",
				"lng": "118.09093058109283",
				"title": "车载07_巡特警鲁xxxcC-2789警",
				"type": "patrol",
				"state": 1
			}, {
				"id": 32,
				"lat": "",
				"lng": "",
				"title": "巡逻队员高",
				"type": "physical",
				"state": 0,
				"iconType": "workPeople",
				"cid": "3"
			}, {
				"id": 33,
				"lat": "",
				"lng": "",
				"title": "执勤民警",
				"type": "physical",
				"state": 0,
				"iconType": "workPeople",
				"cid": "2"
			}, {
				"id": 34,
				"lat": "",
				"lng": "",
				"title": "xxxxx",
				"type": "physical",
				"state": 1,
				"iconType": "workPeople",
				"cid": "2"
			}
]
 //地图图标默认全选
  const [markerTo, setMarkerTo] = useState({
    station: true,
    stationData: [],
    moun: true,
    patrol: true,
    physical: true,
    unPhysical: true,
    car: true,
    face: true,
    video: true,
    phone: true,
    wifi: true,
    status: true,
    high: true
  });

4.点位样式,数据循环添加marker, 其中L.markerClusterGroup(); 就是生成当前聚合组,至此可以实现多种点位类型加载

const polyMarker=data=>{
  
    if(map){
      data.forEach((elem,index)=>{
        let iconHtml = ``,opts=``;
        iconHtml = iconTemplate(elem);
        opts=L.icon({
          iconUrl: iconHtml,
          iconSize: [20, 20],
          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);
        marker.addEventListener('click',function(e){
          markerIconShow(elem)
        })
        markerArr.forEach((item)=>{
          if(elem.type==item){
              if(elem.state==2){
                unPolyMarkers[item].addLayer(marker)
              }else{
                polyMarkers[item].addLayer(marker)
              }
          
          }
        })
      })
      markerArr.forEach((item)=>{
        map.addLayer(polyMarkers[item])
        map.addLayer(unPolyMarkers[item])
       })
    }
  }

ps:效果图
在这里插入图片描述

5.若要对地图的marker进行显示隐藏 只需要把对应的聚合组删除掉即可,假设你有几个按钮,点击之后隐藏添加事件即可,

markerValue就是你点击的当前按钮的type值,通过比对删除对应的图层,其中使用eval 来计算出需要显示的type+Data ,得到在上面对数据进行分组的数据。

在这里插入图片描述

 //地图底部图标切换 地图点位的marker
  const markerToggle = (e, type) => {
     setMarkerValue(type);
    setMarkerTo({
      ...markerTo,
      [type]:!markerTo[type],
      status:2
    })
  };  


  //加载,隐藏地图marker
  useEffect(() => {
    if (markerTo.status == 2) {
        polyMarkers[markerValue].clearLayers()    
      } else {
        let data=eval(markerValue+"Data")
        polyMarker(data)
      }
    }
  }, [markerTo]);

效果图:
在这里插入图片描述

7.若有需求想要改变每个聚合的样式,只需要在初始化聚合组时候进行 iconCreateFunction ,这样就可以自定义样式了,以及添加你自己想要添加的数据

 markerArr.forEach((item,index)=>{
      polyMarkers[item]=L.markerClusterGroup({iconCreateFunction: function(cluster) {
        return L.divIcon({ html: `<div class="polyMarker-box    marker-status-${item}">
        <span class="polyMarker-box-${item} polyMarker-${item} "></span>
       <span> ${cluster.getChildCount()}</span></div>` });
      }});
    })

效果图
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要移除leaflet中所有图层,可以使用 `removeLayer`方法。该方法接受一个图层对象作为参数,并将其从地图中移除。 首先,需要创建一个leaflet地图实例,然后在地图上添加几个图层。例如,可以创建一个tile图层和一个marker图层: ``` // 创建地图实例 var map = L.map('map'); // 创建tile图层 var tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ attribution: 'Map data © OpenStreetMap contributors' }).addTo(map); // 创建marker图层 var marker = L.marker([51.5, -0.09]).addTo(map); ``` 接下来,可以使用 `removeLayer`方法来移除这两个图层: ``` // 移除tile图层 map.removeLayer(tileLayer); // 移除marker图层 map.removeLayer(marker); ``` 通过调用 `removeLayer`方法,将tile图层和marker图层对象传递给它,这样就可以从地图中移除它们。这样,地图中就不会再显示这两个图层。 如果需要一次性移除多个图层,可以在 `removeLayer`方法中传递图层对象的数组。 ``` // 创建多个marker图层 var marker1 = L.marker([52, -0.09]).addTo(map); var marker2 = L.marker([51, -0.09]).addTo(map); var marker3 = L.marker([52, -1]).addTo(map); // 移除多个marker图层 map.removeLayer([marker1, marker2, marker3]); ``` 通过在 `removeLayer`方法中传递一个包含多个图层对象的数组,可以一次性移除这些图层。 总之,使用 `removeLayer`方法可以很方便地移除leaflet中的所有图层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值