【问题标题】:My markers are not displayed React leaflet我的标记没有显示 React 传单
【发布时间】:2022-07-16 22:34:47
【问题描述】:

目标是在地图上显示标记。

我不明白为什么我的标记没有显示

我使用 react-leaflet

响应正常,但没有显示任何内容

Response

My map

导入

import { MapContainer, TileLayer, Marker, ScaleControl } from 'react-leaflet';
import tileLayer from '../util/tileLayer';
import L from "leaflet";
import 'leaflet-fullscreen/dist/Leaflet.fullscreen.js';
import 'leaflet-fullscreen/dist/leaflet.fullscreen.css';
import { useEffect } from 'react';
import newMarker from "../data/asset/pin.png";
import axios from 'axios'

第一个视图的中心

const center = [46.227638, 2.213749];

图标

const pointerIcon = new L.Icon({
  iconUrl: newMarker,
  iconSize: [50, 58], // size of the icon
  iconAnchor: [20, 58], // changed marker icon position
});

标记

const MyMarkers = ({ data }) => {
  return data.map(({ lat, lng }, index) => (
    <Marker
      key={index}
      position={{ lat, lng }}
      icon={pointerIcon}
    >
    </Marker>
  ));
}

使用 useEffect、async await 和 axios 获取数据

const MapWrapper = () => {

  useEffect( async () => {

    markers = (await componentDataMarkers()).data
    console.log(markers);
  }, [])
  const componentDataMarkers = async () => await axios.get(`http://localhost:5000/plane/latlong`)
  var markers = []

React Leaflet 组件

  return (
    <MapContainer
    fullscreenControl={true}
    center={center}
    zoom={13}
    scrollWheelZoom={true}
    >

      <TileLayer {...tileLayer} />

      <MyMarkers data={markers} />
      <ScaleControl imperial={false} />
    </MapContainer>
  )
}

export default MapWrapper;

【问题讨论】:

    标签: javascript reactjs react-leaflet


    【解决方案1】:

    Marker 位置是类型 [lat, lng] 而不是 {lat, lng}。示例 -

    <Marker position={[51.505, -0.09]} />
    

    更新:您的data 对象是arrayarraysmap 函数似乎不正确。它需要像markers.map((marker, index) =&gt;

    您可以在live editor 试用的工作示例 -

    const center = [51.505, -0.09]
    const markers = [[51.505, -0.10], [51.505, -0.09], [51.505, -0.08]];
    const MyMarkers = ({ data }) => {
        return data.map((marker, index) => {
         return (
         <Marker key={index} position={marker}>
          <Popup>
            Marker <br /> Popup.
          </Popup>
        </Marker>
         ); 
         });
    }
    render(
      <MapContainer center={center} zoom={13} scrollWheelZoom={false}>
        <TileLayer
          attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
       <MyMarkers data={markers} />
      </MapContainer>,
    )
    

    【讨论】:

    • 感谢您的回答即使按照您的建议进行操作也没有显示任何内容
    • 请分享data对象。
    • data.map 不正确。请查看我的更新答案。
    • 我按照你的建议做,但仍然行不通
    【解决方案2】:
    return data.map(({ lat, lng }, index) => (
        <Marker
          key={index}
          position={[ lat, lng ]} // array here
          icon={pointerIcon}
        >
        </Marker>
      ));
    

    在这里,为什么要从键为 0 和 1 的数组中提取 lat 和 lng ? 您不能从数组中提取 { lat, lng },只能从具有 lat 和 lng 键的对象中提取。

    你能控制台记录一下 lat 和 lng 看看你这里有数据还是未定义数据?

    【讨论】:

    • 在日志中: undefined lat home.js:40 undefined lng image.noelshack.com/fichiers/2022/19/5/…
    • 是的,因为您尝试在类似对象的地图中提取数据,但它是一个数组。 data.map(({ lat, lng }, index) 你不能这样做,试试: data.map((value, index) 并使用 lat like value[0] 和 lng like value[1]
    • 好的,我该怎么做?编辑:好的,我会尝试
    • 看看,我已经编辑了我的评论
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2022-11-22
    • 2021-04-28
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2013-07-04
    • 2021-05-16
    相关资源
    最近更新 更多