谷歌地图API V3打印地图

4

我正在寻找一种高效打印使用 Google Maps API V3 实现的网站上的谷歌地图的方法。

我看到有些人只使用 window.print JS,然后...

@media print
{
    body * { visibility: hidden; }
    #map * { visibility: visible; }
    #map {visibility: visible;position:absolute; top: 5px; left: 5px;}
}

目前,使用fancybox向用户显示更大的地图,并在此基础上添加了一个打印按钮。理想情况下,我只想添加一些jquery或类似的东西来打印地图。

然而,这似乎并不真正起作用。有没有人对如何最好地实现这一点有任何建议?


1
如果有帮助的话,请查看https://dev59.com/5GbWa4cB1Zd3GeqPYJb8#11739627或http://stackoverflow.com/a/11485923/1055987。 - JFK
非常感谢,那很简单易懂。不确定我是如何找到那些帖子的。再次感谢 :) - Purple Hexagon
6个回答

19

我猜通过简单而微妙的DOM操作,您可以获取Google地图(理论上可以是任何地图:))查看器的“快照”,并在任何浏览器中完美地打印它。 假设$mapContainer是您地图的主容器,相关代码如下:

// printAnyMaps ::
function printAnyMaps() {
  const $body = $('body');
  const $mapContainer = $('.map-container');
  const $mapContainerParent = $mapContainer.parent();
  const $printContainer = $('<div style="position:relative;">');

  $printContainer
    .height($mapContainer.height())
    .append($mapContainer)
    .prependTo($body);

  const $content = $body
    .children()
    .not($printContainer)
    .not('script')
    .detach();

  /**
   * Needed for those who use Bootstrap 3.x, because some of
   * its `@media print` styles ain't play nicely when printing.
   */
  const $patchedStyle = $('<style media="print">')
    .text(`
      img { max-width: none !important; }
      a[href]:after { content: ""; }
    `)
    .appendTo('head');

  window.print();

  $body.prepend($content);
  $mapContainerParent.prepend($mapContainer);

  $printContainer.remove();
  $patchedStyle.remove();
}

请注意,您可以灵活地将 $printContainer 替换为任何打印模板。 在这里,我只使用一个简单的
作为快照的占位符。
代码演示: http://jsfiddle.net/glenn/6mx21ted

这个函数的打印功能本来是正常的,但是有一个小问题。尽管地图只能放在一页上,它却打印了3页。 - Pulkit Pithva
我尝试了这个,但它显示空白地图,只有标记被显示。 - Ronak Patel
@RonakP 介意在像JSFiddle或GitHub这样的地方分享您的代码,以便我更好地理解原因并改进解决方案吗? - Glenn Mohammad
1
感谢您提供的解决方法,在我的网站中仅使用了您CSS代码部分就生效了:' @media print { img { max-width: none !important; } a[href]:after { content: ""; } } ' - Igor Trindade
工作得很好。确保地图在一个div中,否则当您关闭打印对话框时,它将出现在页面的顶部。 - Atchoum
显示剩余4条评论

5

2
在HTML中,#Gmap是您显示谷歌地图的div,而Print Button在被点击后将调用函数gmapPrint()。
<!-- HTML -->
<div id="Gmap"></div> 
<div onclick="gmapPrint();">Print Button</div>

在JavaScript中,gmapPrint()函数读取地图细节并将其写入新窗口。然后打印新窗口。

<!-- JS Script -->
function gmapPrint() {
    var content = window.document.getElementById("Gmap"); // get you map details
    var newWindow = window.open(); // open a new window
    newWindow.document.write(content.innerHTML); // write the map into the new window
    newWindow.print(); // print the new window
}

嗨@Jingwen,我想同时打印地图和页面内容。我有一个收据布局,其中包含地图位置,当我使用window.Print()时,它会打印div中的所有文本,但无法打印Google地图?有什么想法或建议吗? - SHEKHAR SHETE

1

如果您想在任何浏览器上打印地图的全尺寸,请尝试以下方法:

function printMap() {
$('<style media="print">')
    .text(`
   body {
    width: ${screen.width}px;
    height: ${screen.height}px;
  }
  body { zoom: 50% !important;}
`)
    .appendTo('head');

window.print();
return false;

}


他们在评论中得到了答案,现在回答这个问题已经太晚了。 - hio
但是非常有帮助的答案。之前的回答对我没有用(有时之前的回答无法正确打印)。 - RSB

0
你可以使用html2canvas.js将地图div转换为画布元素,然后将其打印为图像。以下代码对我来说完美运行:
HTML
<div id="map" style="width:500px;height:500px;"></div>
<input type="button" value="Print Map" class="printBtn" />

JavaScript

var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 13,
            center: defLocation,
            mapTypeId: 'satellite',
            streetViewControl: false
        });      
$(document).on('click', '.printBtn', function () {
            map.setOptions({
                mapTypeControl: false,
                zoomControl: false,
                streetViewControl: false,
                panControl: false
            });
            var printWin = window.open('', '', 'width=1000,height=700');
            var windowContent = '<!DOCTYPE html>';

            html2canvas($("#map"), {
                useCORS: true,
                onrendered: function (canvas) {
                    windowContent += '<html>'
                    windowContent += '<head><title>Print canvas</title></head>';
                    windowContent += '<body>'
                    windowContent += '<img src="' + canvas.toDataURL() + '">';
                    windowContent += '</body>';
                    windowContent += '</html>';
                    printWin.document.open();
                    printWin.document.write(windowContent);
                    printWin.document.close();
                    printWin.focus();
                    setTimeout(function () { printWin.print(); printWin.close(); }, 500);

                    map.setOptions({
                        mapTypeControl: true,
                        zoomControl: true,
                        streetViewControl: true,
                        panControl: true
                    });
                }
            });
        });

0

我没有足够的声望来发布评论,但请听我说。

对于那些在接受的答案中遇到一些问题的人,其中地图上有随机的瓷砖顺序和/或一些完全变灰(在最新版本的Chrome中,这个小提琴正在为我执行此操作),您需要将此小片段添加到注入页面的CSS中:

#map_canvas div > img {
        position: absolute;
}

其中 #map_canvas 是你地图的选择器。我在一个旧的错误报告线程上偶然发现了这个答案,现在它正在拯救我的生命:https://issuetracker.google.com/issues/35825130?pli=1

所以这是一个“修正”版本的示例代码:http://jsfiddle.net/nbLr3jtf/

感谢 @Glenn Mohammad 的原始答案!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接