首页 / 资讯中心 / 文章详情

OpenLayers 地图打印与导出:从 A4 到大幅面,只改这几个参数

OpenLayers 地图打印与导出:从 A4 到大幅面,只改这几个参数 ★ FEATURED ARTICLE
OpenLayers 地图打印与导出从 A4 到大幅面只改这几个参数【免费下载链接】openlayersOpenLayers项目地址: https://gitcode.com/gh_mirrors/op/openlayersOpenLayers 地图导出的核心问题是把一块屏幕上的地图变成物理尺寸的成品一张 A4 图纸、一幅 A1 展板走的是同一条管线。本文面向正在使用 OpenLayers 但没做过打印定制的前端开发者先讲 A4 输出的三步走再讲大幅面如何不爆内存最后给一份交付前的自查表。 动手前先把账算好纸张、DPI 与像素换算表写代码前先定两个数纸张尺寸和输出 DPIdots per inch即每英寸压多少个像素。导出画布不是屏幕的复制品它的像素尺寸完全由这两个数决定。记住一个公式像素 毫米 ÷ 25.4 × DPI。常用规格已经替你算好交付时直接查表纸张横向mm英寸1 inch 25.4 mm150 DPI 像素300 DPI 像素A4 297×21011.69×8.271754×12403508×2480A3 420×29716.54×11.692480×17544961×3508A2 594×42023.39×16.543508×24807016×4961A1 841×59433.11×23.394966×35089933×7016标准 A4 输出的三步走建画布、等渲染、转数据A4 导出只需三步建一张目标像素的离屏 canvas、把地图塞进去等 rendercomplete地图完成一次渲染的事件、再转成图片下载。矢量图层和文字标签会在离屏画布里由地图重新绘制不需要你复制图层关键改动只有 setTarget 和 setSize 两处官方示例 export-map.js仓库路径 examples/export-map.js就是这个思路。const canvas document.createElement(canvas); canvas.width 3508; canvas.height 2480; // A4 横向 300DPI map.setSize([3508, 2480]); map.setTarget(canvas); map.once(rendercomplete, () { const link document.createElement(a); link.href canvas.toDataURL(image/png); // 画布转 base64 图片 link.download a4-map.png; link.click(); map.setTarget(map); // 还原原视口 });如果比例尺要跟着纸张走记得给 ScaleLine 调 setDpi(300)print-to-scale.js 里就是这么处理的。大幅面渲染不爆内存的做法分条 后台线程大幅面输出的第一条军规别在主线程一次性渲染整张图。单个 canvas 占宽×高×4 字节A1 300DPI 接近 280 MB一张画布就能吃掉浏览器大半内存。稳妥方案是分条渲染按行带逐段出图再拼回每段前把 View 移到对应区域再往上的压力交给 Web Worker可与 UI 分离跑 JS 的后台线程配合 OffscreenCanvas仓库示例 tiled-layer-rendering-in-offscreen-canvas.html 给出了接入方式。另外把栅格源的 preload 调低能减少同一时刻加载的瓦片数。const BAND 2048; // 按行带渲染封顶单次画布内存 for (let y 0; y height; y BAND) { const h Math.min(BAND, height - y); // 每段前把 View 的 center 移到该条带中心 map.setTarget(band); await new Promise((r) map.once(rendercomplete, r)); targetContext.drawImage(band, 0, y); // 拼进最终大图 }从图片到文档PDF 与分页的取舍OpenLayers 的原生能力止于图片PDF 靠 jsPDF 这类库拼装。仓库官方示例 print-to-scale.jsexamples/print-to-scale.js是标准做法先把地图尺寸设成纸张像素用 html2canvas把 DOM 转成 canvas 图像的库截图再交给 jsPDF覆盖 A0 到 A5 横版。两个边界要心里有数一是这种 PDF 本质是内嵌的单张位图文字不可选中、无法拆分二是真需要 A4 多页输出时得自己把地图范围按页切开、每页单独渲染一次 View原生没有分页能力。要求文档可二次编辑时建议图片导出后交给服务端做矢量 PDF。交付前自查表检查项对照常见坑交付前把下面这张表过一遍。线上地图的质量问题大多出在前两行像素没按纸张算或者栅格重投影瓦片源从一种坐标系映射到地图当前坐标系的过程留下了裂缝和重影。检查项常见坑画布像素尺寸按屏幕像素而非mm ÷ 25.4 × DPI设置打印出来发糊栅格重投影伪影跨坐标系瓦片源放大后出现接缝、双影需全图核对比例尺与文字ScaleLine 没设 DPI印出来尺子就是错的画布污染瓦片源没配 crossOrigintoDataURL 直接抛错文件体积A1 300 DPI 的 PNG 轻松破百 MB考虑 JPEG 或分条交付颜色还原屏幕 sRGB 出图在印刷机上可能偏色务必打样校对把管线捋顺之后你会发现OpenLayers 原生负责的是画布渲染这一段——按纸张像素尺寸撑开画布地图会把所有图层重新画进去至于 PDF 拼装、分页、色彩管理都要靠第三方库或后端补位。输出需求超过 A1 时建议直接考虑服务端渲染浏览器画布终究会是这条管线的瓶颈。【免费下载链接】openlayersOpenLayers项目地址: https://gitcode.com/gh_mirrors/op/openlayers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站