【问题标题】:How to use Leaflet Routing Machine with React-Leaflet 3?如何在 React-Leaflet 3 中使用 Leaflet Routing Machine?
【发布时间】:2021-05-24 18:41:20
【问题描述】:

在 react-leaflet 2.8.0 中的旧方法是使用 MapLayerwithLeaflet

但现在在 react-leaflet 中:

MapLayerwithLeaflet 自版本 3 起已弃用。

我正在尝试掌握核心文档:https://react-leaflet.js.org/docs/core-introduction

但以下不起作用,我明白了

提供的对象不是图层。

import React, { Component, useEffect } from "react";
import { useLeafletContext, leafletElement, createLayerComponent } from '@react-leaflet/core'
import { MapContainer, TileLayer, useMap } from "react-leaflet";
import Leaflet from "leaflet";
import "leaflet-routing-machine";

function Routing(props) {
    const context = useLeafletContext();
    useEffect(() => 
    {
      let routing = createLayerComponent(Leaflet.Routing.control(
      {
        waypoints: [
          Leaflet.latLng(33.52001088075479, 36.26829385757446),
          Leaflet.latLng(33.50546582848033, 36.29547681726967)
        ],
        lineOptions: {
          styles: [{ color: "#6FA1EC", weight: 4 }]
        },
        show: false,
        addWaypoints: false,
        routeWhileDragging: true,
        draggableWaypoints: true,
        fitSelectedRoutes: true,
        showAlternatives: false
      }), )
      const container = context.layerContainer || context.map
      container.addLayer(routing)

      return () => {
        container.removeLayer(routing)
      }
    })
  return null;
}


function MapComponent() {

  return (
      <MapContainer center={[33.5024, 36.2988]} zoom={14} >
        <TileLayer url="https://api.maptiler.com/maps/ch-swisstopo-lbm-dark/256/{z}/{x}/{y}.png?key=gR2UbhjBpXWL68Dc4a3f" />
        <Routing />
      </MapContainer>
    );
  }


export default MapComponent;

【问题讨论】:

    标签: javascript reactjs leaflet react-leaflet leaflet-routing-machine


    【解决方案1】:

    您使用的是createLayerComponent,但路由机器实际上是一个控件。使用createControlComponent

    我还建议将其作为一个单独的自定义组件,如文档中所述,而不是将其放入 useEffect 中。文档很难。随意阅读How to extend TileLayer component in react-leaflet v3?,看看这是否有助于理解如何使用 react-leaflet v3 制作自定义组件。

    你会这样做:

    import L from "leaflet";
    import { createControlComponent } from "@react-leaflet/core";
    import "leaflet-routing-machine";
    
    const createRoutineMachineLayer = (props) => {
      const instance = L.Routing.control({
        waypoints: [
          L.latLng(33.52001088075479, 36.26829385757446),
          L.latLng(33.50546582848033, 36.29547681726967)
        ],
        ...otherOptions
      });
    
      return instance;
    };
    
    const RoutingMachine = createControlComponent(createRoutineMachineLayer);
    
    export default RoutingMachine;
    

    Working Codesandbox

    【讨论】:

    • 赛斯的回答太棒了!通过一个很好的工作示例和改进建议非常清楚,并参考 SO 上的其他答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2015-12-18
    • 2022-08-20
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多