Как удалить предыдущий маршрут из маршрутов Google Maps в react?

#reactjs #google-maps

#reactjs #google-карты

Вопрос:

Я хочу отображать разные пути направления при изменении источника и пункта назначения, но предыдущий маршрут все еще находится на карте.

Как я могу удалить это и оставить только текущий путь?

Вот мой код, который отображается в хуке useEffect

 const directionsService = new maps.DirectionsService();
const directionsDisplay = new maps.DirectionsRenderer();
if (origin.postCode amp;amp; destination.postCode) {
    directionsService.route({
        origin: origin.postCode,
        destination: destination.postCode,
        waypoints: [],
        travelMode: 'DRIVING'
    }, (response, status) => {
        if (status === 'OK') {
            directionsDisplay.setDirections(response);
            const routePolyline = new maps.Polyline({
                path: response.routes[0].overview_path,
                strokeColor: purple,
                strokeOpacity: 1.0,
                strokeWeight: 5
            });
            routePolyline.setMap(map);
        } else {
            window.alert('Directions request failed due to '   status);
        }
    });
    if (mapRef) {
        const bounds = new maps.LatLngBounds();
        mapRef.props.children.forEach((child) => {
            if (child amp;amp; child.type === Marker) {
                bounds.extend(new maps.LatLng(child.props.lat, child.props.lng));
            }
        })
        map.fitBounds(bounds);
        setCenter({
            lat: (origin.location.lat   destination.location.lat) / 2,
            lng: (origin.location.lng   destination.location.lng) / 2
        })
    }
}
  

Ответ №1:

Вы должны сохранить routePolyline как ссылку (поскольку вы хотите показать только одну):

 function MyComponent() {
  const routePolyline = React.useRef();

  React.useEffect(() => {
    if (origin.postCode amp;amp; destination.postCode) {
      directionsService.route(
        {
          origin: origin.postCode,
          destination: destination.postCode,
          waypoints: [],
          travelMode: "DRIVING",
        },
        (response, status) => {
          if (status === "OK") {
            directionsDisplay.setDirections(response);
            if (routePolyline.current) {
              // if we have an existing routePolyline we unset it
              routePolyline.setMap(null);
            }
            routePolyline.current = new maps.Polyline({
              path: response.routes[0].overview_path,
              strokeColor: purple,
              strokeOpacity: 1.0,
              strokeWeight: 5,
            });
            routePolyline.setMap(map);
          } else {
            window.alert("Directions request failed due to "   status);
          }
        }
      );
      if (mapRef) {
        const bounds = new maps.LatLngBounds();
        mapRef.props.children.forEach((child) => {
          if (child amp;amp; child.type === Marker) {
            bounds.extend(new maps.LatLng(child.props.lat, child.props.lng));
          }
        });
        map.fitBounds(bounds);
        setCenter({
          lat: (origin.location.lat   destination.location.lat) / 2,
          lng: (origin.location.lng   destination.location.lng) / 2,
        });
      }
    }
  }, []);
}
  

^ Приведенный выше пример предназначен только для демонстрации использования ссылки routePolyline, в нем отсутствуют некоторые части компонента (например, возврат и т.д.).

Комментарии:

1. Если вы установите routePolyline.current.setMap (карта); он работает без каких-либо других изменений