如何在 React 传单 MapContainer 中呈现 geojson 多边形?
How to render geojson polygon in React leaflet MapContainer?
堆栈:Reactjs、Leafletjs、EsriLeafletjs
我正在尝试在传单地图容器上显示 GeoJson 中的一个多边形。我的主要问题是当我使用 Leaflet.geoJson(data) 它 return invalid JSON object.
请看...
我的 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:
'© <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>
)
}
const dataParcel = axios.get
不是你想的那样。 axios.get
是一个异步函数,所以 dataParcel 不是从 Promise 返回的结果,而是 Promise 本身。您需要以适当的方式执行此操作 async/await syntax。在 react-leaflet 中,这变得更加容易。您根本不需要使用 L.map
,reat-leaflet 已涵盖。
创建一个专门用于数据获取的组件,它将在挂载时获取数据,并在数据准备好时渲染一个 react-leaflet 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>
);
};
Working Codesandbox
此外,对于有趣的人,如果您在 react-leaflet 应用程序中使用 esri-leaflet 组件,您可以尝试 react-esri-leaflet.
堆栈:Reactjs、Leafletjs、EsriLeafletjs
我正在尝试在传单地图容器上显示 GeoJson 中的一个多边形。我的主要问题是当我使用 Leaflet.geoJson(data) 它 return invalid JSON object.
请看...
我的 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:
'© <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>
)
}
const dataParcel = axios.get
不是你想的那样。 axios.get
是一个异步函数,所以 dataParcel 不是从 Promise 返回的结果,而是 Promise 本身。您需要以适当的方式执行此操作 async/await syntax。在 react-leaflet 中,这变得更加容易。您根本不需要使用 L.map
,reat-leaflet 已涵盖。
创建一个专门用于数据获取的组件,它将在挂载时获取数据,并在数据准备好时渲染一个 react-leaflet 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>
);
};
Working Codesandbox
此外,对于有趣的人,如果您在 react-leaflet 应用程序中使用 esri-leaflet 组件,您可以尝试 react-esri-leaflet.