如何使用外部 Select 下拉组件在 React Leaflet 地图上 select 区域
How to select area on React Leaflet Map using external Select dropdown component
所以问题是如何 select 使用外部 Select
下拉组件的特定区域:
<div className="Map">
<Select
onChange={setArea}
size={"large"}
className="Map-areaSelector"
value={selectedArea}
>
{areaList}
</Select>
{colors && (
<MapContainer center={getCenter()} zoom={getZoom()}>
<>
<GeoJSON
style={setColor}
data={germanyDis}
onEachFeature={onEachArea}
/>
<NewLegend arr={gradient} />
</>
</MapContainer>
)}
</div>
想要这样的结果,而我正在从右上角的 Select
下拉列表中选择城市
现在我只能select区域,虽然我直接点击这个区域的地图(使用onEachFeature
功能)但无法理解如何将Select
组件连接到实现相同的功能,同时从下拉列表中选择区域。
如果我们假设您的下拉列表中有地区名称,并且与 geojson 中包含的名称相同,还有 select
中的地图实例 onChange
你将不得不使用 json ref 找到具有所选地区名称的图层,然后对其执行任何操作,如打开其弹出窗口或缩放到所选图层。
const geoJsonRef = useRef();
const [selectValue, setSelectValue] = useState("");
...
const handleDistrictChange = (e) => {
const newDistrict = e.target.value;
setSelectValue(newDistrict);
if (!newDistrict) return;
const layer = geoJsonRef.current
.getLayers()
.find((layer) => layer._popup._content === newDistrict);
layer.openPopup();
map.fitBounds(layer.getBounds());
};
并在 GeoJSON 组件上添加 ref 以及从 MapContainer 获取地图实例。
<>
<MapContainer
center={position}
zoom={13}
style={{ height: "80vh" }}
whenCreated={setMap}
>
...
{geoJSON && (
<GeoJSON
data={geoJSON}
onEachFeature={handleEachFeature}
ref={geoJsonRef}
/>
)}
</MapContainer>
<select value={selectValue} onChange={handleDistrictChange}>
<option value="">Select a district</option>
{geoJsonRef.current
?.getLayers()
.map((layer) => layer._popup._content)
.map((district, index) => (
<option key={`district-${index}`} value={district}>
{district}
</option>
))}
</select>
</>
你可以看到更多关于这个demo
所以问题是如何 select 使用外部 Select
下拉组件的特定区域:
<div className="Map">
<Select
onChange={setArea}
size={"large"}
className="Map-areaSelector"
value={selectedArea}
>
{areaList}
</Select>
{colors && (
<MapContainer center={getCenter()} zoom={getZoom()}>
<>
<GeoJSON
style={setColor}
data={germanyDis}
onEachFeature={onEachArea}
/>
<NewLegend arr={gradient} />
</>
</MapContainer>
)}
</div>
想要这样的结果,而我正在从右上角的 Select
下拉列表中选择城市
现在我只能select区域,虽然我直接点击这个区域的地图(使用onEachFeature
功能)但无法理解如何将Select
组件连接到实现相同的功能,同时从下拉列表中选择区域。
如果我们假设您的下拉列表中有地区名称,并且与 geojson 中包含的名称相同,还有 select
中的地图实例 onChange
你将不得不使用 json ref 找到具有所选地区名称的图层,然后对其执行任何操作,如打开其弹出窗口或缩放到所选图层。
const geoJsonRef = useRef();
const [selectValue, setSelectValue] = useState("");
...
const handleDistrictChange = (e) => {
const newDistrict = e.target.value;
setSelectValue(newDistrict);
if (!newDistrict) return;
const layer = geoJsonRef.current
.getLayers()
.find((layer) => layer._popup._content === newDistrict);
layer.openPopup();
map.fitBounds(layer.getBounds());
};
并在 GeoJSON 组件上添加 ref 以及从 MapContainer 获取地图实例。
<>
<MapContainer
center={position}
zoom={13}
style={{ height: "80vh" }}
whenCreated={setMap}
>
...
{geoJSON && (
<GeoJSON
data={geoJSON}
onEachFeature={handleEachFeature}
ref={geoJsonRef}
/>
)}
</MapContainer>
<select value={selectValue} onChange={handleDistrictChange}>
<option value="">Select a district</option>
{geoJsonRef.current
?.getLayers()
.map((layer) => layer._popup._content)
.map((district, index) => (
<option key={`district-${index}`} value={district}>
{district}
</option>
))}
</select>
</>
你可以看到更多关于这个demo