当我使用 Hooks 放大地图时,如何让标记出现在地图上

Posted

技术标签:

【中文标题】当我使用 Hooks 放大地图时,如何让标记出现在地图上【英文标题】:How can I make Markers appear on a map when I zoom on it with Hooks 【发布时间】:2021-04-15 01:35:11 【问题描述】:

我对前端开发比较陌生,在寻找合适的文档来帮助我使用此功能时遇到了问题。 我一直在尝试使用 react-leaflet 和 React Hooks 在缩放到某个级别时显示一些标记。

这是我的地图代码:

import React,  useEffect  from 'react'; 
import  MapContainer, TileLayer, LayerGroup, Marker  from 'react-leaflet';
import TanitMarker from './marker';
import ZoomControlledLayer from './zoom-controlled-layer';
import CustomPopup from './popup';
import './my-map.scss';

function MyMap() 

  const hotel = 
    thumbnail: 
      src: "./hotel.jpg"
    ,
    name: "",
    title: "****",
  

  useEffect(() => 
    console.log('Map is mounted!');
  , []); 


  return (
    <div className="map-container">
      <MapContainer center=[35.741728, 10.626254] zoom=8 scrollWheelZoom=true>
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url="https://s.tile.openstreetmap.org/z/x/y.png"
        />
        <ZoomControlledLayer zoomRef=7>
          <LayerGroup>
            <Marker position=[36.4242, 10.6749]
              riseOnHover=true>
              <CustomPopup site=hotel></CustomPopup>
            </Marker>
          </LayerGroup>
        </ZoomControlledLayer>
      </MapContainer>
    </div>
  )


export default MyMap;

我正在尝试使 ZoomControlledLayer 下的 LayerGroup 在达到缩放级别 7 时出现。

提前谢谢你。

【问题讨论】:

欢迎来到 SO!您的自定义文件 ZoomControlledLayer 中有什么?缺少一些细节时很难提供帮助。 抱歉没有解释,实际上 ZoomControlledLayer 充当了一个包装器,我想让它的内容出现在 Zoom 上。现在什么都没有,因为我尝试了一些东西,但没有任何效果。 【参考方案1】:

TileLayers 和 GridLayers 有一个 maxZoomminZoom 属性,但它看起来不像 LayerGroup 有一个,所以你必须手动实现它。首先,让我们在状态变量中跟踪地图的缩放级别:

import  MapContainer, useMapEvents  from 'react-leaflet';

function ZoomTracker = ( setZoom ) => 
  const map = useMapEvents(
    zoom()
      setZoom(map.getZoom())
    
  )
  return null


function MyMap()

  const [zoom, setZoom] = useState()

  return (

    <MapContainer>
      <ZoomTracker setZoom=setZoom />
      <ZoomControlledLayer zoom=zoom minZoom=7>
        ...all_the_stuff_in_here
      </ZoomControlledLayer>
    </MapContainer>

  )


所以现在MyMap 正在跟踪状态中的当前缩放级别,并将其传递给ZoomControlledLayer 组件。现在在你的ZoomControlledLayer:

const ZoomControlledLayer = ( zoom, minZoom, children ) => 

  if (zoom >= minZoom)
    return (
      <>
        children
      </>
    );
   else 
    return null;
  


所以ZoomControlledLayer 仅在地图缩放与您的minZoom 相同或更大时才会渲染任何内容。我没有对此进行测试,但希望它足以让你继续前进。您可以在 react-leaflet v3 here 中阅读有关使用地图事件的更多信息。

【讨论】:

以上是关于当我使用 Hooks 放大地图时,如何让标记出现在地图上的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌地图android上添加标记?

谷歌地图标记出现在地图上的错误位置

ClusterManager 重绘 Google maps v2 utils 的标记

如何使用百度地图查询出行路线

IOS谷歌地图标记标题不出现

带有集群和自定义视图标记的谷歌地图在放大和缩小时滞后太多