You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leaflet缩放地图导致已删除的Leaflet Routing Machine路由图层复现

问题根本原因

你当前的图层删除逻辑仅移除了地图上临时渲染的可见矢量图层,没有销毁 Leaflet Routing Machine(LRM) 的Control实例本身。LRM内部会缓存全量路线数据、路线图层、路点标记、说明面板的关联引用,当地图触发zoomend、路线说明hover这类事件时,LRM会自动重新渲染内部持有的旧路线,导致已删除的图层复现。

修复步骤

1. 新增全局变量存储当前LRM实例

首先在全局作用域定义变量,用来持有当前激活的路由控件实例,方便后续销毁:

// 全局作用域定义
let currentRoutingControl = null;

2. 编写专用的旧路由销毁函数

替换你原有的遍历删层逻辑,直接调用LRM内置的销毁方法,完全清理所有关联资源:

function clearOldRouting() {
  // 销毁已存在的LRM实例,自动清理关联的路线图层、路点标记、DOM说明面板
  if (currentRoutingControl) {
    currentRoutingControl.remove();
    currentRoutingControl = null;
  }
  // 额外清理可能残留的自定义路点标记,避免漏删
  bootleaf.map.eachLayer(function(layer) {
    if (layer instanceof L.Marker && layer.options.icon?.options?.glyph !== undefined) {
      bootleaf.map.removeLayer(layer);
    }
  });
}

3. 修改路由绘制逻辑

修改drawLiedman函数,把新建的LRM实例存到全局变量中,同时调整自定义标记的创建逻辑,避免重复添加:

function drawLiedman(userId) {
  let demoArray = []
  var coords = []
  let driverUrl = '' // 注意要声明driverUrl,避免污染全局作用域

  for (let i = 0; i < 18; i++) {
    if (config.drivers[i].name == userId) {
      driverUrl = config.drivers[i].coords;
      break;
    }
  }

  $.getJSON(driverUrl)
  .done(function(response) {
    demoArray = response;
    demoArray.forEach( (element,index) => { 
      const LatLng = element.replace("(", "").replace(")", "").split(", ")
      const Lat = parseFloat(LatLng[0]);
      const Lng = parseFloat(LatLng[1]);
      coords[index] = L.latLng(Lat,Lng); 
    });

    // 将新建的LRM实例赋值给全局变量
    currentRoutingControl = L.Routing.control({
      waypoints: coords,
      addWaypoints: false,
      routeWhileDragging: false,
      profile: 'route/v1/driving',
      createMarker: function(i, wp) { 
        return L.marker(wp.latLng, {
          draggable: false,
          icon: L.icon.glyph({ glyph: i })
        });
        // 此处无需手动调用addTo,LRM会自动管理标记的添加/销毁
      },
      serviceUrl: 'http://127.0.0.1:5000',
      lineOptions: {
        styles: [{color: 'red', opacity: 1, weight: 2}]
      },
      show:false
    }).addTo(bootleaf.map);
  })
}

4. 替换原有切换逻辑

把你原有的flag判断、遍历删层的逻辑全部替换为调用销毁函数:

// 切换路由时直接执行以下代码即可
clearOldRouting();
drawLiedman(choice.value);
补充说明

LRM的remove()方法会自动清理所有内部关联资源:包括缓存的路线数据、已渲染的路线图层、路点标记、插入到页面的说明面板DOM元素,完全销毁后不会再触发旧路线的重绘,也不会出现hover说明面板复现旧图层的问题。


内容的提问来源于stack exchange,提问作者Dimitris Bratsos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:45:02