React-Leaflet/React-Routing-Machine:删除路线和航路点

Posted

技术标签:

【中文标题】React-Leaflet/React-Routing-Machine:删除路线和航路点【英文标题】:React-Leaflet/React-Routing-Machine: Remove route and waypoints 【发布时间】:2020-11-23 06:09:29 【问题描述】:

我正在为我的地图使用以下软件包:

    "leaflet-routing-machine": "^3.2.12",
    "leaflet": "^1.7.1",
    "react-leaflet": "^2.7.0",

基本上我有一个路由机组件,我已将它与我的地图和标记集成,即(单击地图上的两个点即可获得路线)您可以拖动每个点并更新路线!

但是,此时我有一个按钮,可以重置所有内容、清除标记、相关的 LAT 和 LONG。但我也只想重置路线。

您可以在地图上看到那些以前的路线(在漂亮的“chartreuse”中)。

现在我有一个函数应该控制组件何时可见:

function clearMarkers()
  setIsRoutingDone(false);


 isRoutingDone &&  <Routing isRoutingDone=isRoutingDone map=map myMapRef=myMapRef icon=startIcon, endIcon userLocation=userLocation  coords=fromLat, fromLon, toLat, toLon  />

这是我的路由机:

import  MapLayer  from "react-leaflet";
import L from "leaflet";
import "leaflet-routing-machine";
import  withLeaflet  from "react-leaflet";


class Routing extends MapLayer 
 constructor(props) 
    super(props);
  

  createLeafletElement() 
    const  map, coords, icon,  removeFrom, removeTo  = this.props;


    var dStart = L.latLng(coords.fromLat, coords.fromLon);
    var dGoal = L.latLng(coords.toLat, coords.toLon);


    this.leafletElement = L.Routing.control(
      collapsible: true,
       lineOptions: 
      styles: [color: 'chartreuse', opacity: 1, weight: 5]
     ,
      waypoints: [dStart, dGoal],
      createMarker: function(i, waypoints, n) 
        if (i === 0) 
         marker_icon = icon.startIcon;
        


       var marker_icon;
        if (i === 0) 
         marker_icon = icon.startIcon;
        
        else if (i == n - 1) 
         marker_icon = icon.endIcon
        
        var marker = L.marker(i === 0 ? dStart : dGoal,
         draggable: true,
         icon: marker_icon
        );
        return marker;
     
    ).addTo(map.leafletElement);

    return this.leafletElement.getPlan();
  

  updateLeafletElement(props) 
    if(this.leafletElement)
      if(this.props.isRoutingDone === false)
this.leafletElement.spliceWaypoints(0, 2); // <-- removes your route
      
    
  


export default withLeaflet(Routing);

实际上我在 updateLeafletElement 函数和 zzilch 中记录了一些内容。

And this is my map:

    import React,  useState, useEffect, useRef  from 'react'
    import  Map, Marker  from 'react-leaflet';
    import LocateControl from '../LocateControl/LocateControl.jsx';
    import MapboxLayer from '../MapboxLayer/MapboxLayer.jsx';
    import Routing from '../RoutingMachine/RoutingMachine.jsx'
    
    export default function MyMap(getAddressFromLatLong, hillfinderFormButtonRef, setCurrentLocation, setCurrentDestination) 
 
    var myMapRef = useRef();
        
      useEffect(() => 
       hillfinderFormButtonRef.current = clearMarkers;
    
        return() => 
          hillfinderFormButtonRef.current = null;
        
      , []);
    
    
    function resetHandler ()
        return myMapRef.current();
      ;
    
    
    function clearMarkers()
      console.log("markerData ", markerData);
      setMarkerData(markerData => [], ...markerData);
      setFromLat(fromLat => null);
      setFromLon(fromLon => null);
      setToLat(toLat => null)
      setToLon(toLon => null)
      setFrom(from => 0);
      setTo(to => 0);
      setIsRoutingDone(false);
      // setRemoveFrom(removeFrom => null)
      // setRemoveTo(removeTo => null)
    
    

  function saveMap(map)
    setMap(map);
  

  function handleOnLocationFound(e)
   setUserLocation(e.latlng)
  
    
  function markerClick(e)
   e.originalEvent.view.L.DomEvent.stopPropagation(e)
  

  return (
  <Map animate=animate center=userLocation onClick=setMarkers onLocationFound=handleOnLocationFound zoom=zoom ref=saveMap>

     markerData && markerData.map((element, index) => 
      return (
      <Marker
        key=index
        marker_index=index
        position=element
        draggable=true
        onClick=markerClick
        onDragend=updateMarker
        icon=element.id === 0 ? startIcon : endIcon
      />
      )
     )
    <MapboxLayer
      accessToken=MAPBOX_ACCESS_TOKEN
      style="mapbox://styles/mapbox/streets-v9"
    />
    <LocateControl startDirectly />

     isRoutingDone &&  <Routing isRoutingDone=isRoutingDone map=map myMapRef=myMapRef icon=startIcon, endIcon userLocation=userLocation  coords=fromLat, fromLon, toLat, toLon  />
  </Map>

  )

我把对手头的问题不重要的代码去掉了!

提前致谢!

【问题讨论】:

【参考方案1】:

其实我自己解决了!

想想头疼是因为 react-leaflet 有它的 lifeCycle 方法,即 createLeaflet、updateLeafletElement 你不应该忘记常规的 React life 方法!

不确定它们是否重叠,但我发现添加了 componentDidMount:

  componentDidMount() 
    const  map  = this.props;

    map.addControl(this.routing);
  

使用 updateLeafletElement(我现在正在正确使用该函数的 API)它接受 fromPropstoProps 来检查我传递给路由机的道具的值...

  updateLeafletElement(fromProps, toProps) 
    if (toProps.removeRoutingMachine !== false) 
      this.routing.setWaypoints([]);
    
  

 

最后在卸载时,使用map 上的removeControl 方法,您传递到路由机以删除路由器机!

import  MapLayer  from 'react-leaflet';
import L from 'leaflet';
import 'leaflet-routing-machine';
import  withLeaflet  from 'react-leaflet';

class Routing extends MapLayer 
  constructor(props) 
    super(props);
  

  createLeafletElement(props) 
    const  map, coords, icon  = this.props;

    var dStart = L.latLng(coords.fromLat, coords.fromLon);
    var dGoal = L.latLng(coords.toLat, coords.toLon);

    if (map && !this.routing) 
      this.routing = L.Routing.control(
        collapsible: true,
        position: 'bottomleft',
        lineOptions: 
          styles: [ color: 'chartreuse', opacity: 1, weight: 5 ]
        ,
        waypoints: [dStart, dGoal],
        createMarker: function(i, waypoints, n) 
          var marker_icon;

          if (i === 0) 
            marker_icon = icon.startIcon;
           else if (i == n - 1) 
            marker_icon = icon.endIcon;
          
          var marker = L.marker(i === 0 ? dStart : dGoal, 
            draggable: true,
            icon: marker_icon
          );
          return marker;
        
      );
    

    return this.routing.getPlan();
  

  componentDidMount() 
    const  map  = this.props;

    console.log('map ', map);
    map.addControl(this.routing);
  

  updateLeafletElement(fromProps, toProps) 
    if (toProps.removeRoutingMachine !== false) 
      this.routing.setWaypoints([]);
    
  

  componentWillUnmount() 
    this.destroyRouting();
  

  destroyRouting() 
    if (this.props.map) 
      this.props.map.removeControl(this.routing);
    
  


export default withLeaflet(Routing);

希望这会有所帮助!仅供参考:这是app 我正在使用路由机,以防您想浏览其他集成...

【讨论】:

以上是关于React-Leaflet/React-Routing-Machine:删除路线和航路点的主要内容,如果未能解决你的问题,请参考以下文章