【问题标题】:Export png from deckl map从deckl地图导出png
【发布时间】:2020-05-05 16:29:42
【问题描述】:

我正在使用 react-map-gldeck.gl 将图层加载到 mapbox 中。

我正在尝试导出带有图层的地图的 png 图像,但下载时图像不显示图层。

这些层是:一个 GeojsonLayer 和一个 HexagonalLayer。

如何在我的 png 中显示图层?

<MapGL
  ref={this.mapRef}
  {...viewport}
  className="mapbox"
  mapStyle={mapStyle}
  mapboxApiAccessToken={MAPBOX_TOKEN}
  preserveDrawingBuffer={true}
  attributionControl={false}
  onLoad={this.handleLoad}
  onViewportChange={(viewport) => {
    viewport.width = "100%";
    viewport.height = "400px";
    this.setState({ viewport });
  }}
>
  <DeckGL layers={layers} onHover={this.onHoverDeckgl} viewState={viewport} />
</MapGL>;

// 这是我下载图片的方法。

downloadImage = () => {
    const fileName = `${"Mapa"}_${moment().format(
        "DD_MM_YYYY_ HH_mm"
    )}.png`;

    const canvas = this.state.mapGL.getCanvas();
    canvas.toBlob(blob => {
        FileSaver.saveAs(blob, fileName);
    });
};

【问题讨论】:

    标签: mapbox-gl-js deck.gl react-map-gl


    【解决方案1】:

    终于,我做到了!!!

    我犯了一个将 mapbox 中的画布和 deckgl 中的画布结合起来的解决方案。

    1. 添加 id 到 Deckgl 组件和引用

      return (
           <DeckGL
              id="deck-gl-canvas"
              ref={this.deckRef}
              layers={layers}
              onHover={this.onHoverDeckgl}
              onLoad={this.handleLoad}
              viewState={viewport}
           >
              {this.renderTooltip()}
           </DeckGL>
      );
      
      // pass deck reference where will be action to download image
      handleLoad = () => {
          const deck = this.deckRef.current.deck;
          this.props.onGetDeckGL(deck);
      };
      
    2. 将 ref 添加到 Mapbox 组件并传递将是下载图像的操作

    3. 调用重绘到牌组

    4. 在第三个画布上合并画布

      downloadImage = () => {
          const fileName = "Map.png";
      
          const { mapGL, deck } = this.state;
          const mapboxCanvas = mapGL.getCanvas(
              document.querySelector(".mapboxgl-canvas")
          );
          deck.redraw(true);
          const deckglCanvas = document.getElementById("deck-gl-canvas");
      
          let merge = document.createElement("canvas");
          merge.width = mapboxCanvas.width;
          merge.height = mapboxCanvas.height;
      
          var context = merge.getContext("2d");
      
          context.globalAlpha = 1.0;
          context.drawImage(mapboxCanvas, 0, 0);
          context.globalAlpha = 1.0;
          context.drawImage(deckglCanvas, 0, 0);
      
          merge.toBlob(blob => {
              FileSaver.saveAs(blob, fileName);
          });
      };
      

    【讨论】:

    • 为什么要重绘套牌?
    • @HimanshuRawat 因为如果不重绘​​它就是空的。你下载一张透明图片。
    猜你喜欢
    • 2019-05-03
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多