Как отобразить полигон geojson в MapContainer листовки React?

#reactjs #leaflet #geojson #react-leaflet

Вопрос:

Стек : Reactjs, Листовки, EsriLeafletjs

Я пытаюсь отобразить один полигон в GeoJSON в контейнере карты листовки. Моя главная проблема заключается в том, что когда я использую Leaflet.GeoJSON(данные), он возвращает недопустимый объект JSON.

Пожалуйста, взгляните …

Мой файл JSON выглядит так. Он содержит один многоугольник. https://gist.githubusercontent.com/UmairMughal901/d43ee77a9be27f2dcd006038fe8f07e7/raw/8650f4f3585ff0c1706da7a434251cfc70f1907b/map.geojson

Мой компонент Карты

     import React, { useEffect, useRef } from 'react';
    import * as L from 'leaflet';
    import 'leaflet/dist/leaflet.css';
    import * as EL from "esri-leaflet";
    import axios from 'axios';
    import { GeoJSON } from 'react-leaflet';

    export default function Mapfun() {
      const mapCanvas = useRef(null);
    
      const dataParcel = axios.get('https://gist.githubusercontent.com/UmairMughal901/d43ee77a9be27f2dcd006038fe8f07e7/raw/8650f4f3585ff0c1706da7a434251cfc70f1907b/map.geojson').then(resp => {
    
        console.log(resp.data);
      });
    
    
      useEffect(() => {
        mapCanvas.current = L.map('mapdiv', {
          center: [31, 72],
          zoom: 6,
          layers: [
            L.tileLayer("http://{s}.tile.osm.org/{z}/{x}/{y}.png", {
              attribution:
                'amp;copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
            }),
            EL.featureLayer({ url: 'http://localhost:6080/arcgis/rest/services/Pu/PB_/MapServer/11' }),
  //Main Issue here          
L.geoJSON(dataParcel),
    
    
          ]
        })
    
        
      }
        );
    
      //todo 
    
    
      return (
        <div id='mapdiv' style={{ width: '100%' }}>
        </div>
    
      )
    }
 

Ответ №1:

const dataParcel = axios.get это не то, что вы думаете. axios.get является асинхронной функцией, поэтому dataParcel является не результатом того, что было возвращено из Обещания, а скорее самим обещанием. Вам нужно сделать это в правильном синтаксисе async/await. В react-листовке это делается еще проще. С вами вообще не нужно работать L.map , в листовке вы охвачены.

Создайте компонент специально для извлечения данных, который будет извлекать данные при монтировании, и отобразит GeoJSON-листовку с реакцией, когда данные будут готовы:

 const MyData = () => {
  // create state variable to hold data when it is fetched
  const [data, setData] = React.useState();

  // useEffect to fetch data on mount
  useEffect(() => {
    // async function!
    const getData = async () => {
      // 'await' the data
      const response = await axios.get("url");
      // save data to state
      setData(response.data);
    };
    getData();
  }, []);

  // render react-leaflet GeoJSON when the data is ready
  if (data) {
    return <GeoJSON data={data} />;
  } else {
    return null;
  }
};


// Use your component in a MapContainer
const Map = (props) => {
  return (
    <MapContainer {...mapcontainerprops}>
      <MyData />
    </MapContainer>
  );
};
 

Рабочий Код и Коробка

Кроме того, для удовольствия, если вы работаете с компонентами esri-листовки в приложении react-листовки, вы можете попробовать react-esri-листовку.

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

1. Спасибо. Объяснил очень хорошо. Я новичок в этой технологии. Это работает.