leaflet marker点击高亮

上一篇初始化地图的链接 https://blog.csdn.net/KK_vicent/article/details/125451475?spm=1001.2014.3001.5502https://blog.csdn.net/KK_vicent/article/details/125451475?spm=1001.2014.3001.5502

实现方法

       步骤一 .

        在初始化地图的时候,定义一个新的图层,专门用来将所有的图标画到该图层上。

const initMap = () => {
    //矢量地图
    const tiandituMap =  L.tileLayer(`http://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    //注记
    const tiandituText =  L.tileLayer(`http://t0.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    const layers = L.layerGroup([tiandituMap,tiandituText])
    mapObj = L.map('myMap',{
      center:[39.56,116.20], //初始地图中心
      zoom:10, //初始缩放等级
      maxZoom:18, //最大缩放等级
      minZoom:0, //最小缩放等级
      zoomControl:false,//不显示缩放小控件
      layers:[layers]
    })
    //新的图层,下面将图标画在新图层上。
    paintLayer = new L.FeatureGroup()
    mapObj.addLayer(paintLayer)
    // console.log(mapObj)
  }

不建议直接画在定义的地图上。

        原因:

        1.如果想在地图上画两类图形,线和点。如果都画在地图上,调用清除图层函数的时候就把它全部清除掉了,如果在地图上加两个图层,线图层 lineLayer和点图层pointLayer,如果不要线了就执行 lineLayer.clearLayer()。

        2.都加载在地图上,数据量很大时会很杂乱,不容易找到对应的数据。

        步骤二.

               创建画图标函数,定义好图标之后,给图标添加点击事件,当触发点击事件的时候就遍历整个图标图层,通过指定的参数找到找到当前点击的图标,使用setIcon重新替换图标。

        leaflet的各种函数可以在leaflet官网上查看。leaflet官网地址https://leafletjs.com/reference.htmlhttps://leafletjs.com/reference.html   

const paintMarker = () => {
    //坐标数组
    let markerArrs = [
      {
        lat: 39.1, //纬度
        lng: 116.1, //经度
        title: '1'
      },
      {
        lat: 39.6,
        lng: 116.6,
        title: '2'
      }
    ]
    let iconSrc = require('../assets/image/greenIcon.png') //assets下的照片需要用require引入
    markerArrs.forEach(item => {
      let icon = L.icon({
        iconUrl: iconSrc, //图片地址
        iconSize: [25,25] //图片大小
      })
      let marker = L.marker([item.lat,item.lng],{
        icon: icon, //图标
        title: item.title, //图标名称
      })
      marker.on('click',(e) => {
        // console.log(e)
        //设置点击图标高亮显示
        //实现方式:遍历图标的图层,现将所有图标设置为旧图标,判断找到当前点击的图标,将点击的图标替换为新图标。
        paintLayer.eachLayer(function(layer) {
            console.log(layer)
            let iconSrc = require("../assets/image/redIcon.png")
            let newIcon  = L.icon({
                //图标地址
                iconUrl: iconSrc,
                //图标大小
                iconSize: [25, 25]
            })
            layer.setIcon(icon) //旧图标
            if (layer.options.title === e.target.options.title) {  //通过title找到当前点击的图标
                layer.setIcon(newIcon) //替换为新图标
            }
          }
        )
        let pop = L.popup().setLatLng([e.latlng.lat, e.latlng.lng]).setContent(`四喜大丸子${e.target.options.title}`) //定义泡泡弹框
        pop.addTo(mapObj) //添加泡泡弹框到到地图上
        pop.on('remove',()=>{
            paintLayer.clearLayers()
            paintMarker()
        })
      })
      marker.addTo(paintLayer)
    })
  }

效果展示

marker点击高亮

完整代码

<template>
    <!-- leaflet 地图容器 -->
    <div id="myMap"></div> 
</template>
<script setup>
  import L from 'leaflet';
  import 'leaflet/dist/leaflet.css'
  import 'leaflet.pm'
  import 'leaflet.pm/dist/leaflet.pm.css'
  import {onMounted} from 'vue'
  let tdtKey = '242c568d3a7aafcb08f001e4e5437b6f'
  let mapObj = null
  let paintLayer = null
  const initMap = () => {
    //矢量地图
    const tiandituMap =  L.tileLayer(`http://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    //注记
    const tiandituText =  L.tileLayer(`http://t0.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    const layers = L.layerGroup([tiandituMap,tiandituText])
    mapObj = L.map('myMap',{
      center:[39.56,116.20], //初始地图中心
      zoom:10, //初始缩放等级
      maxZoom:18, //最大缩放等级
      minZoom:0, //最小缩放等级
      zoomControl:false,//不显示缩放小控件
      layers:[layers]
    })
    //新的图层,下面将图标画在新图层上。
    paintLayer = new L.FeatureGroup()
    mapObj.addLayer(paintLayer)
    // console.log(mapObj)
  }
  const paintMarker = () => {
    //坐标数组
    let markerArrs = [
      {
        lat: 39.1, //纬度
        lng: 116.1, //经度
        title: '1'
      },
      {
        lat: 39.6,
        lng: 116.6,
        title: '2'
      }
    ]
    let iconSrc = require('../assets/image/greenIcon.png') //assets下的照片需要用require引入
    markerArrs.forEach(item => {
      let icon = L.icon({
        iconUrl: iconSrc, //图片地址
        iconSize: [25,25] //图片大小
      })
      let marker = L.marker([item.lat,item.lng],{
        icon: icon, //图标
        title: item.title, //图标名称
      })
      marker.on('click',(e) => {
        // console.log(e)
        //设置点击图标高亮显示
        //实现方式:遍历图标的图层,现将所有图标设置为旧图标,判断找到当前点击的图标,将点击的图标替换为新图标。
        paintLayer.eachLayer(function(layer) {
            console.log(layer)
            let iconSrc = require("../assets/image/redIcon.png")
            let newIcon  = L.icon({
                //图标地址
                iconUrl: iconSrc,
                //图标大小
                iconSize: [25, 25]
            })
            layer.setIcon(icon) //旧图标
            if (layer.options.title === e.target.options.title) {  //通过title找到当前点击的图标
                layer.setIcon(newIcon) //替换为新图标
            }
          }
        )
        let pop = L.popup().setLatLng([e.latlng.lat, e.latlng.lng]).setContent(`四喜大丸子${e.target.options.title}`) //定义泡泡弹框
        pop.addTo(mapObj) //添加泡泡弹框到到地图上
        pop.on('remove',()=>{
            paintLayer.clearLayers()
            paintMarker()
        })
      })
      marker.addTo(paintLayer)
    })
  }
  onMounted(()=>{
    initMap()
    paintMarker()
  })
</script>
<style lang="stylus" scoped>
#myMap
  z-index 10
  width: 100%
  height: 100%
</style>

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: leaflet marker点击事件是指在使用leaflet地图时,当用户点击标记(marker)时,会触发相应的事件。这个事件可以用来实现一些交互功能,比如弹出信息框、跳转链接等。在leaflet中,可以通过绑定marker的click事件来实现这个功能。当用户点击marker时,就会触发click事件,然后可以在事件处理函数中实现相应的功能。 ### 回答2: leaflet是一款基于JavaScript的交互式地图库,它提供了一套易于使用的API,可用于处理交互和动画效果,能够创建漂亮的交互式地图。leaflet markerleaflet的一个组件,用于在地图上添加点标记。当我们需要实现地图上的特殊标记功能时,需要用到leaflet marker点击事件。 leaflet marker点击事件是指我们在地图上添加点标记(marker)时,给这个marker添加一个响应事件,使得在marker点击时可以触发一些特定的交互或操作。下面是leaflet marker点击事件的实现步骤: 1. 创建marker。首先需要创建一个marker对象,并设置marker的图标、位置及其他属性。创建marker的代码如下: ``` var marker = L.marker([51.5, -0.09]).addTo(map); ``` 其中L.markerleaflet的API,[51.5, -0.09]是marker的位置坐标,map是地图对象。 2. 为marker添加点击事件。接下来需要为marker对象添加一个点击事件,这可以通过marker对象的on方法来实现,代码如下: ``` marker.on('click', function(e) { //marker点击后执行的操作 }) ``` 其中‘click’是事件类型,function(e)是事件处理函数,e代表事件对象。 3. 在点击事件中执行操作。最后,在marker点击后,需要执行特定的操作或交互。常见的操作包括弹出信息框、获取marker信息、跳转到其他页面等。具体的实现根据需要来决定。 总之,leaflet marker点击事件是实现地图交互功能的关键之一。通过这种方式,我们可以为marker对象添加自定义交互效果,实现更加灵活和丰富的地图交互体验。 ### 回答3: leaflet marker点击事件是指在使用leaflet地图时,当用户对地图中的标志物进行点击时所触发的响应事件。这个事件在leaflet中可以通过绑定相应的监听函数来实现。 在leaflet中,我们可以使用L.marker()方法来创建一个标志物实例,通过设置其position属性来指定标志物的位置。当用户对该标志物进行点击时,我们可以使用marker对象的on()方法,将一个事件监听器绑定到该标志物上,以实现在用户点击时的响应。 举个例子,比如我们想给一个标志物绑定点击事件,实现用户点击后弹出一个窗口显示该标志物的名称和位置信息。我们可以这样写: ``` // 创建标志物实例 var marker = L.marker([39.9, 116.4]).addTo(map); // 绑定点击事件监听器 marker.on('click', function(e) { // 在点击事件响应函数中,使用marker对象的getLatLng()方法获取标志物的位置信息 var position = marker.getLatLng(); // 定义弹出窗口的内容信息 var content = '<h2>标志物信息</h2>' + '<p>名称:XXX</p>' + '<p>位置:' + position.lat + ',' + position.lng + '</p>'; // 在地图上使用popup()方法创建一个弹出窗口,并设置其内容 marker.bindPopup(content).openPopup(); }); ``` 通过以上代码,我们创建了一个标志物实例,并将它添加到地图上。然后,我们使用on()方法在该标志物实例上绑定了一个‘click’事件监听器,当用户对该标志物进行点击时,响应函数会弹出一个窗口,显示该标志物的名称和位置信息。 总的来说,leaflet marker点击事件是非常实用的,可用于实现很多地图特定的交互操作,比如显示标记物信息,打开超链接等等。开发者可以根据具体需求选择合适的事件响应函数来实现所需的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值