Что означает «Ошибка: уже есть источник с этим идентификатором (Анонимная функция)»? (Реагируйте, MapboxGL)

#javascript #reactjs #error-handling #mapbox #mapbox-gl-js

Вопрос:

У меня есть небольшое приложение для создания карт. Когда пользователь нажимает кнопку поиска, я хочу, чтобы карта увеличивалась в определенной области на карте и появлялось поле. Я получаю сообщение об ошибке, что уже есть источник с этим идентификатором. Что это значит и как я могу это исправить?

 const Map = (props) => {
  console.log(props);
  const mapContainerRef = useRef(null);

  const [lng, setLng] = useState(5);
  const [lat, setLat] = useState(34);
  const [zoom, setZoom] = useState(1.5);
  const [globalMap, setMap] = useState(Object());

  // Initialize map when component mounts
  useEffect(() => {
    const map = new mapboxgl.Map({
      container: mapContainerRef.current,
      style: 'mapbox://styles/mapbox/dark-v10',
      center: [lng, lat],
      zoom: zoom
    });

    setMap(map);

    // Disable default box zooming.
    map.boxZoom.disable();
    
    // Create a popup, but don't add it to the map yet.
    var popup = new mapboxgl.Popup({
      closeButton: false
    });

    // Add navigation control (the  /- zoom buttons)
    map.addControl(new mapboxgl.NavigationControl(), 'top-right');

    map.on('move', () => {
      setLng(map.getCenter().lng.toFixed(4));
      setLat(map.getCenter().lat.toFixed(4));
      setZoom(map.getZoom().toFixed(2));
    });

    map.on('load', function () {
    
    // function omitted to save space

    }

    // Clean up on unmount
    return () => map.remove(); 
  }, []); // eslint-disable-line react-hooks/exhaustive-deps

  React.useEffect(() => {
    if(props.show) {

      // Coordinates (eventually connect to back end)
      var northEast = [131.308594, 46.195042];
      var southEast = [117.597656, 8.233237];
      var southWest = [79.101563, 32.842674];
      var northWest = [86.847656, 44.715514];

      var maxSouth = Math.min(southEast[1], southWest[1]);
      var maxWest = Math.min(southWest[0], northWest[0]);
      var maxNorth = Math.max(northWest[1], northEast[1]);
      var maxEast = Math.max(northEast[0], southEast[0]);
      globalMap.fitBounds([
        [maxWest - 5, maxSouth - 5], // southwestern corner of the bounds
        [maxEast   5, maxNorth   5] // northeastern corner of the bounds
      ]); 
      
      // Add bounding box to the map
      // Defines bounding box
      // Polygons seem to be the preferred method according to my research
      globalMap.addSource('route', {
        'type': 'geojson',
        'data': {
            'type': 'Feature',
            'properties': {},
            'geometry': {
                'type': 'LineString',
                'coordinates': [
                    northEast, southEast, southWest, northWest, northEast
                ]
            }
        }
      });

      // Draws bounding box
      globalMap.addLayer({
        'id': 'route',
        'type': 'line',
        'source': 'route',
        'layout': {
            'line-join': 'round',
            'line-cap': 'round'
        },
        'paint': {
            'line-color': '#ff0000',
            'line-width': 5
        }
      });
    }
  });

 

Ошибка возникает на линии globalMap.addSource('route', { ... . Он также показывает раздел setLng, setLat, setZoom.