【问题标题】:How to use bounds with dynamic markers in react-leaflet如何在反应传单中使用带有动态标记的边界
【发布时间】:2021-03-28 06:49:17
【问题描述】:

我有以下功能性反应组件,它可以在“边界”框中正确显示两个静态标记,该框适合两个标记。

我希望能够传入一组纬度和经度值以供地图显示,但我不知道该怎么做。

这是有效的静态示例:

import React from 'react'
import { MapContainer, TileLayer, Marker } from 'react-leaflet'
import L from 'leaflet'
import 'leaflet/dist/leaflet.css'

const MapLeaflet = () => {

// STATIC MARKER POSITIONS
const position = [42.2974279, -85.628292];
const position2 = [-8.852507, -45.351563];

// BOUNDS CODE
const bounds = L.latLngBounds([position, position2]);

return (
    <MapContainer
        className=" map"
        center={position}
        bounds={bounds}
    >
        <Marker key={key} position={position}>
            <Heart/>
        </Marker>
        <Marker key={key} position={position2}>
            <Heart/>
        </Marker>

        <TileLayer
            attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
            url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
    </MapContainer>
        
)
}

如果我通过的是 {coords},我可以动态显示标记:

const MapLeaflet = ({coors}) => {
...
    { coords && coords.map(coord => (
           <Marker key={key} latitude={coord[0]} longitude={coord[1]}>
                <SomeMarker/>
           </Marker>
    ))}
...
}

但显然,地图尚未将这些“坐标”考虑在内。传入的坐标数组的console.log输出如下:

0: (2) [51.52167056034225, -0.12894469488176763]
1: (2) [46.58635156377568, 2.1796793230151184]
2: (2) [40.819721, 14.341111]

不知何故,我需要以代码接受的格式将以下行替换为对传入坐标的引用,但我不知道该怎么做。

const bounds = L.latLngBounds([position, position2]);

类似

const bounds = L.latLngBounds({coords});

非常感谢任何帮助。

亲切的问候,马特

【问题讨论】:

  • 您是否传递了一个由 3 个数组组成的数组(坐标值)? latLngBounds 接受一对纬度数组。还有为什么要在 latLngBounds 上使用 {}。 coords 值不是一个对象,而是一个数组数组
  • 您好 kboul,控制台日志输出仅显示三个条目作为示例。尽管我认为,从它的外观来看,我正在使用一个数组数组。 {coords} 只是作为一个例子,我知道它表示一个对象。请问您知道这是否可行吗?
  • 能否请您使用您当前的尝试和您传递的真实值创建一个小演示,因为我不清楚您目前正在尝试什么?
  • 对不起,我不是很清楚。我会做一个 jsfiddle 并在完成后发表评论。同时,我只想将静态标记值 const position 和 const position2 替换为我将作为道具传递给组件的动态值。动态值是从 Firestore 中提取的,看起来像我在上面发布的 console.log。感谢您的帮助!

标签: javascript reactjs leaflet react-leaflet


【解决方案1】:

我想我明白你想要达到的目标。

maxBounds 在 react-leaflet v.3 中是不可变的,因此您需要创建一个自定义组件,该组件将在坐标更改时更改地图边界。它将坐标作为道具,当坐标改变或comp着陆时,它会改变地图边界。

function Bounds({ coords }) {
  const map = useMap();
  useEffect(() => {
    if (!map) return;

    map.fitBounds(coords);
  }, [map, coords]);
  return null;
}

在您的应用程序中,我包含了一个边界变化(坐标变量)并且地图边界相应变化的情况。希望这就是您正在寻找的。​​p>

function App() {
  const [coords, setCoords] = useState([
    [51.52167056034225, -0.12894469488176763],
    [46.58635156377568, 2.1796793230151184],
    [40.819721, 14.341111]
  ]);

  return (
    <>
      <MapLeaflet coords={coords} />
      <button
        onClick={() =>
          setCoords([
            [52.52167056034225, -0.12894469488176763],
            [47.58635156377568, 2.1796793230151184],
            [41.819721, 14.341111]
          ])
        }
      >
        Change coords
      </button>
    </>
  );
}

Demo

【讨论】:

  • 你是一个绝对的传奇。这太妙了。你完全理解我,并提供了一个绝妙的解决方案。非常感谢你。我很惊讶你在沙箱中编写了所有代码来展示给我看,我非常感谢。度过美好的一天
  • 代码有一个非常奇怪的问题。我已经链接了一个简短的视频给你看。 streamable.com/9ok78f 基本上,如果从新开始使用动态代码它不起作用,但是如果我们从 useState 中的标记引用开始它可以工作,然后我们切换到动态道具,它仍然可以工作,直到页面重新加载,当它再次失败时
  • 我没有看到您使用 MapLeafet 和传递坐标道具的部分。您删除了静态变量,但坐标应该作为道具出现。在演示中,我从 App comp 传递坐标。你确定它仍然会出现并且不是未定义的吗?此外,它们是否具有预期的正确结构(数字数组数组)?
  • 抱歉,我添加了一个较慢的视频。我开始使用状态作为标记,这当然有效。然后我删除状态并将“坐标”作为道具导入,这很有效(因此变量具有正确的结构 - 您可以看到地图标记发生变化)。然后我冷刷新页面,我得到 Bounds are not valid 错误。然后我只是再次经历这个过程只是为了展示。 streamable.com/r6sqka
  • 再次感谢您,您的帮助很大
猜你喜欢
  • 2016-04-11
  • 2018-05-23
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多