React 传单 Canvas

问题描述 投票:0回答:2

我正在尝试使用传单标记方法绘制大约 50K 点,但由于需要时间渲染和 ram,这是不可能的。 我看到的新方法是使用 Leaflet-canvas 在屏幕上而不是在 DOM 中绘制点。 我如何在 React 传单 3.X 中执行此操作。 我试过 https://www.npmjs.com/package/react-leaflet-canvas-markers 但是它不支持传单的V3。

有什么建议吗?

leaflet react-leaflet react-leaflet-v3
2个回答
8
投票

安装并导入库

npm i leaflet-canvas-marker

创建自定义组件并使用 useEffect 来模仿香草传单的行为example

import { useEffect } from "react";
import { useMap } from "react-leaflet";
import "leaflet-canvas-marker";
import L from "leaflet";

export default function LeafletCanvasMarker() {
  const map = useMap();

  useEffect(() => {
    if (!map) return;

    var ciLayer = L.canvasIconLayer({}).addTo(map);

    ciLayer.addOnClickListener(function (e, data) {
      console.log(data);
    });
    ciLayer.addOnHoverListener(function (e, data) {
      console.log(data[0].data._leaflet_id);
    });

    var icon = L.icon({
      iconUrl: "https://unpkg.com/[email protected]/dist/images/marker-icon.png",
      iconSize: [20, 18],
      iconAnchor: [10, 9],
    });

    var markers = [];
    for (var i = 0; i < 50000; i++) {
      var marker = L.marker(
        [58.5578 + Math.random() * 1.8, 29.0087 + Math.random() * 3.6],
        { icon: icon }
      ).bindPopup("I Am " + i);
      markers.push(marker);
    }
    ciLayer.addLayers(markers);
  }, [map]);

  return null;
}

将您的自定义组件作为 MapContainer 子项包含

<MapContainer center={position} zoom={10} style={{ height: "100vh" }}>
   <TileLayer
        attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
      />
   <LeafletCanvasMarker />
</MapContainer>

你应该得到类似于下图的结果:


-1
投票

请帮帮我 我正在使用 leaflet-canvas-marker。我遵循了相同的代码。在加载时我得到一些标记数据并绘制它,在更改时我得到一些新数据集。但是在地图中,我的旧图层/标记没有被删除,新标记添加到它上面。

请帮助我通过删除旧数据并使用新数据绘制来更新地图

© www.soinside.com 2019 - 2024. All rights reserved.