html2canvas 不适用于 Google Maps Pan

IT技术 javascript google-maps html2canvas
2021-02-19 19:03:29

我正在使用 html2canvas 将我的在线地图另存为图像(请参阅另存为图像链接)。我已经在 Firefox、Chrome 和 Opera 中尝试过。

如果您不更改默认地图,它往往会更频繁地工作。如果缩放然后平移地图,则不太可能起作用。地图将平移,但 html2canvas 将使用旧的中心点和地图边界。并且 html2canvas 将无法为新地图边界加载地图图块。

地图平移正确,但 html2canvas 使用旧的中心点和地图边界。为什么是这样?

为了支持从不同域获取图像,我有以下设置:

useCors: true;

我尝试了以下解决方案

- 手动更改地图类型。有时这会修复它。

- 触发浏览器调整大小事件 - 没有用。

- 使用 setTimeout() 等待 2000 毫秒以确保加载图块 - 没有用

- 使用代理 (html2canvas_proxy_php.php) - 没有用

-使用谷歌地图空闲事件在保存之前等待地图空闲 - 没有用

5个回答

显然,问题似乎源于html2canvas无法渲染 css 转换,至少在 chrome 中(我只能在 OSX 上的 chrome 中重现该问题)。保存瓷砖的容器使用-webkit-transform. 所以我们可以做的是获取容器被移动的值,移除变换,赋值,left然后top从我们得到的值中transform使用html2canvas. 然后为了让地图不会中断,我们在html2canvas完成后重置地图的 css 值

所以我把它粘贴到你网站的 javascript 控制台中,它似乎工作

//get transform value
var transform=$(".gm-style>div:first>div").css("transform")
var comp=transform.split(",") //split up the transform matrix
var mapleft=parseFloat(comp[4]) //get left value
var maptop=parseFloat(comp[5])  //get top value
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
  "transform":"none",
  "left":mapleft,
  "top":maptop,
})
html2canvas($('#map-canvas'),
{
  useCORS: true,
  onrendered: function(canvas)
  {
    var dataUrl= canvas.toDataURL('image/png');
    location.href=dataUrl //for testing I never get window.open to work
    $(".gm-style>div:first>div").css({
      left:0,
      top:0,
      "transform":transform
    })
  }
});
杰出的!我也把图像保存在新窗口中。解决方案适用于 Firefox、Chrome 和 Opera。
2021-04-20 19:03:29
这适用于地图视图,知道为什么街景被破坏了吗?
2021-04-21 19:03:29
@JavaScripter StreetView 默认使用 webgl,然后对 html2canvas 无法处理的图像进行 3d 转换。简单的解决方法是将街景模式/渲染设置为html4. 这里的例子:jsfiddle.net/L0c3mL53
2021-04-28 19:03:29
你能提供一个jsfiddle吗?我部分地为我工作。它修剪地图。谢谢你。
2021-05-04 19:03:29
在 Ionic 上对我也很有用。
2021-05-05 19:03:29

在谷歌地图更新mfirdaus停止工作的解决方案后,新的解决方案是这样的:

var transform = $(".gm-style>div:first>div:first>div:last>div").css("transform")
var comp = transform.split(",") //split up the transform matrix
var mapleft = parseFloat(comp[4]) //get left value
var maptop = parseFloat(comp[5])  //get top value
$(".gm-style>div:first>div:first>div:last>div").css({ //get the map container. not sure if stable
  "transform": "none",
  "left": mapleft,
  "top": maptop,
})

是一样的,但你需要改变 de selector from

.gm-style>div:first>div

.gm-style>div:first>div:first>div:last>div

举手🙂

我们要找的div是什么?我相信这对于使用或不使用地图控件的人来说会有所不同。如果我知道我想寻找什么 div,我可以尝试在控制台中找到它。
2021-04-24 19:03:29
我想我已经尝试了几乎所有 gm 样式的嵌套 div 容器,但没有使用此代码。
2021-04-27 19:03:29
还进入 chrome“无法克隆 WebGL 上下文,因为它具有preserveDrawingBuffer=false”。它保存图像,但仍然是灰色背景。
2021-04-29 19:03:29
无法使用上面的代码读取未定义的拆分
2021-05-01 19:03:29
实际上发现我的问题是我使用了一个自定义地图ID,它被设置为矢量类型地图,不得不将其更改为光栅,现在它可以工作了。
2021-05-04 19:03:29

我有同样的问题,但我使用 Leaflet Map 而不是 Google Map。

代码如下

var transform=$(".leaflet-map-pane").css("transform");
if (transform) {
    var c = transform.split(",");
    var d = parseFloat(c[4]);
    var h = parseFloat(c[5]);
    $(".leaflet-map-pane").css({
        "transform": "none",
        "left": d,
        "top": h
    })
}           


html2canvas(document.body).then(function(canvas){
    $(".leaflet-map-pane").css({
        left: 0,
        top: 0,
        "transform": transform
    })
   }
// Here is used html2canvas 1.0.0-alpha.9
你好,我在使用 Leaflet Maps 和 wkhtmltopdf 时遇到了这个问题,你知道如何解决吗?
2021-04-21 19:03:29

就我而言,我只允许 html2Canvas 配置中的跨源资源共享(CORS),它对我有用。

useCORS:true,

有关更多信息,您可以参考 html2Canvas 文档:http ://html2canvas.hertzen.com/configuration

使用此代码更新谷歌地图。

  // @ts-ignore html2canvas defined via script
  html2canvas($('#shareScreen')[0], {
    useCORS: true,
    allowTaint: false,
    backgroundColor: null,
    ignoreElements: (node) => {
      return node.nodeName === 'IFRAME';
    }
  }).then((canvas) => {
    var dataUrl = canvas.toDataURL('image/png');
    console.log(dataUrl)
    this.shareLoader = false;
  });