javascript - 在隐藏传单地图时使用传单图像
问题描述
有没有办法在不显示的情况下将传单地图绘制和渲染成图像?
我目前正在使用传单图像,每次我需要渲染时,我发现唯一可行的方法是在渲染之前附加画布并在之后将其移除。但它使地图可见几秒钟,我不希望这样。
我有时也会随机收到此错误:
Element could not be drawn on canvas
<canvas class="leaflet-zoom-animated" style="transform: translate3d(0…idth: 0px; height: 0px;" width="0" height="0">
这是我当前的代码:
import L from 'leaflet';
import leafletImage from 'leaflet-image';
var map = null;
var hiddenMap = document.createElement('div');
function getMap(){
document.body.appendChild(hiddenMap);
if(map)
return map;
hiddenMap.setAttribute('style', 'width: 790px; height: 250px;');
map = L.map(hiddenMap, { renderer: L.canvas() });
L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
id: 'mapbox/streets-v11',
tileSize: 512,
zoomOffset: -1,
accessToken: process.env.VUE_APP_MAP_BOX_TOKEN
}).addTo(map);
map.invalidateSize();
return map;
}
function cleanMap(){
document.body.removeChild(hiddenMap);
}
export function render(lats, longs){
if(lats.length == 0 || longs.length == 0)
return null;
var m;
try{
m = getMap();
var coords = new Array(lats.length);
for(var i=0; i<lats.length; i++){
coords[i] = new L.LatLng(lats[i], longs[i]);
}
m.fitBounds(coords);
var path = new L.Polyline(coords, {
color: 'red',
weight: 3,
opacity: 0.5,
smoothFactor: 1
}).addTo(m);
}catch(err){
console.error(err);
return null;
}
return new Promise((resolve, reject) => {
leafletImage(m, function(err, canvas) {
path.remove(m);
cleanMap();
if(err)
reject(err);
resolve(canvas.toDataURL().replace(/^data:image\/png;base64,/, ""));
});
});
}
解决方案
推荐阅读
- reactjs - 这是使用 shouldComponentUpdate 生命周期方法的好地方吗?(反应JS)
- c - RISCV 32 位基础和 64 位扩展
- node.js - node rd kafka 为每条消息从头开始重复传递报告
- javascript - 如何从父导航器定义子导航器的初始路由名称?
- javascript - 如何在 fs 文本文件中进行换行以进行日志记录
- ubuntu - Ubuntu 18.10 上的 ROS Melodic 安装在 pcl_ros 包中失败
- python-3.x - Python 退出代码
- android - Unity 2018.3 android dex合并问题
- node.js - 运行 puppeteer-core AWS 层时出错
- angular - Angular Virtual Scroll 在浏览器上运行良好,但在初始化时未能通过 Jasmine 测试