首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >支持翻译3d的Leaflet.js客户端-系统屏幕截图

支持翻译3d的Leaflet.js客户端-系统屏幕截图
EN

Stack Overflow用户
提问于 2016-02-12 13:27:55
回答 2查看 511关注 0票数 2

日安!我试着用html光栅制作传单地图的截图。因为使用translate3d和缩尺(硬件加速)库拉票和html2canvas不能给我好的结果。有人知道我该怎么做才能拍html截图吗?首先,作为油漆瓷砖-好的(但这只是幸运的,因为html2canvas把翻译为x,translate1作为y。如果层有刻度-它给了我错误的位置)

也许有一些脚本可以解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-17 13:22:24

以下是类方法映射--是通常的映射、主窗格--是克隆的映射容器,ctx -是主要的画布上下文:

代码语言:javascript
运行
复制
    var mainpane = $(map.getContainer()).clone();
    var mapPane = mainpane.find(".leaflet-map-pane")[0];
    var mapTransform = mapPane.style.transform.split(",");
    this.mapX = parseFloat(mapTransform[0].split("(")[1].replace("px", ""));
    this.mapY = parseFloat(mapTransform[1].replace("px", ""));
    var canvas = document.createElement("canvas");
    canvas.className = "screenShotCanvas";
    canvas.width = map.getSize().x;
    canvas.height = map.getSize().y;
    canvas.style.left = -this.mapX;
    canvas.style.top = -this.mapY;
    var ctx = canvas.getContext("2d");



drawSVGOnCanvas: function(map, mainpane, ctx) {
    var overlayClass = $(map.getPanes().overlayPane).attr('class');
    var svgE = mainpane.find('.' + overlayClass.replace(' ', '.')).find('svg');
    var xml;
    var svgElements = svgE[0];
    var svgElementsTransform = svgElements.style.transform.split(",");
    var svgElementsX = parseFloat(svgElementsTransform[0].split("(")[1].replace("px", ""));
    var svgElementsY = parseFloat(svgElementsTransform[1].replace("px", ""));
    svgElements.style.transform = " ";
    svgElements.style.left = svgElementsX + "px";
    svgElements.style.top = svgElementsY + "px";

    var svgCanvas = document.createElement("canvas");
    svgCanvas.className = "screenShotTempCanvas";
    svgCanvas.id = "SvgToCanvas";
    svgCanvas.width = map.getSize().x;
    svgCanvas.height = map.getSize().y;
    var svgCtx = svgCanvas.getContext("2d");

    svgE.each(function() {
        L.DomUtil.getPosition(svgE);
        xml = new XMLSerializer().serializeToString(this);
        canvg(svgCanvas, xml);
    });
    ctx.drawImage(svgCanvas, svgElementsX + that.mapX, svgElementsY + that.mapY);
},
票数 1
EN

Stack Overflow用户

发布于 2016-10-17 19:25:54

谢谢三乙,我也做了类似的事。

代码语言:javascript
运行
复制
        var that  = this,
            map_c = that.map.getContainer();

        //Check if have svg on map
        var svg     =  map_c.querySelector('svg');
        var _canvas = map_c.querySelector('canvas');

        if(svg) {

            var svg_attr = {
                w: parseInt(svg.attributes.width.value),
                h: parseInt(svg.attributes.height.value)
            };

            _canvas.width  = svg_attr.w;
            _canvas.height = svg_attr.h;

            _canvas.style.display = 'block';

            var serializer = new XMLSerializer();

            var c   = _canvas;
            var ctx = c.getContext('2d');
            ctx.clearRect(0, 0, svg_attr.w, svg_attr.h);

            var trans_val = map_c.querySelector('.leaflet-map-pane').style['transform'].replace('translate','').replace(/px/g,'').replace('(','').replace(')','').split(',');

            var trans_y = parseInt(trans_val[trans_val.length - 1]) ,
                trans_x = parseInt(trans_val[trans_val.length - 2]);


            ctx.translate(trans_x,trans_y);
            ctx.drawSvg("<svg>"+serializer.serializeToString(svg)+"</svg>", 0, 0, svg_attr.w, svg_attr.h);
            svg.style.display = 'none';
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35363838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档