繁体   English   中英

如何更新 leaflet 路线?

[英]How can I update leaflet route?

所以我有一个带有 leaflet 路由的组件,它看起来像这样:

function LeafletRoutingMachine() {
  const map = useMap();
  const route = useSelector((state) => state.route.route);

  const control = L.Routing.control({
    waypoints: [
      L.latLng(route.coord_from_lat, route.coord_from_lng),
      L.latLng(route.coord_to_lat, route.coord_to_lng),
    ],
  });

  const changeRoute = () => {
    control.remove();
    control.addTo(map);
  };

  useEffect(() => {
    changeRoute();
  }, [route]);

  return null;
}

export default LeafletRoutingMachine;

我单击带有坐标的不同行的表格,它应该更改 map 上的路线。虽然它起作用了,但我只需要在屏幕上显示一条路线,但现在它绘制了新路线,而以前的路线仍然存在. 我怎样才能从 map 中删除以前的路由?

在向map添加新路由之前,可以通过调用路由控件的remove方法来删除map之前的路由。

以下是如何执行此操作的示例:

function LeafletRoutingMachine() {
  const map = useMap();
  const route = useSelector((state) => state.route.route);

  const control = L.Routing.control({
    waypoints: [
      L.latLng(route.coord_from_lat, route.coord_from_lng),
      L.latLng(route.coord_to_lat, route.coord_to_lng),
    ],
  });

  // create a ref to store the previous control
  const prevControlRef = useRef(control);

  const changeRoute = () => {
    //remove the previous control
    prevControlRef.current.remove();
    //add new control
    control.addTo(map);
    //update ref
    prevControlRef.current = control;
  };

  useEffect(() => {
    changeRoute();
  }, [route]);

  return null;
}

通过使用 ref prevControlRef 来存储之前的控件,并在添加新控件之前将其删除,它将确保在 map 上一次只显示一个路由。

还需要注意的是,确保在卸载组件时删除控件,您可以使用 useEffect cleanup function 来执行此操作。

useEffect(() => {
    changeRoute();
    return () => {
      prevControlRef.current.remove();
    }
  }, [route]);

这样,当组件卸载时,控件将从 map 中删除,并且当路由更改时,它将删除以前的路由并添加新路由。

请检查文档

https://www.liedman.net/leaflet-routing-machine/api/

可以在map上设置单控

并使用

control.setWaypoints(// 新点)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM