leaflet地图截图批量导出(附源码下载)


前言

leaflet 入门开发系列环境知识点了解:

  • leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等
  • leaflet 在线例子
  • leaflet 插件,leaflet 的插件库,非常有用

内容概览

leaflet地图截图批量导出
源代码demo下载

效果图如下:

具体实现思路:
打开csv文件,读取点数据源经纬度,循环遍历数据源,以经纬度为中心,构造1000*1000屏幕像素值的正方形范围,批量截图,最后压缩导出。

  • 核心代码,完整源码见尾部下载
     var map = null; //地图对象
     var marker = null;
     var packageName = '打包下载'; // 打包文件名称
     var zip = new JSZip();
     var baseList = []; // base64格式图片列表
     var imgNameList = []; // 图片名称列表
     var points = []; //经纬度点列表
     var filePath = null;
     var loading;
     // [113.6250387, 22.6713741], [113.64075074, 22.68880195], [113.53854455, 22.78899001], [113.52453318, 22.79709604]]; // 经纬度点列表
     var node = document.getElementById('map');
     // 打开文件按钮点击事件
     $("input[type='file']").change(function () {
       var file = this.files[0];
       if (window.FileReader) {
         var reader = new FileReader();
         reader.readAsDataURL(file);
         //监听文件读取结束后事件    
         reader.onloadend = function (e) {
           filePath = e.target.result;
           console.log('文件路径:' + e.target.result);
           // 读取文件数据处理中……
           loading = Qmsg.loading("读取文件数据处理中……");
           openFile();
         };
       }
     });
     // 导出图片按钮点击事件
     $("#mapexport_btn").click(function () {
       goScreenshotMap2Img();
     });
     // 地图初始化
     initMap();
    
     // 地图初始化加载
     function initMap() {
       map = L.map('map');
       L.tileLayer('http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', { subdomains: ["1", "2", "3", "4"], crossOrigin: true }).addTo(map);
       map.setView([22.83883628, 113.50329857], 16);  //设置缩放级别及中心点
     }
     // 打开文件读取数据函数
     function openFile() {
       var result = [];
       var xhr = new XMLHttpRequest();
       xhr.open("GET", filePath, false);
       xhr.onload = function (e) {
         if (xhr.readyState === 4) {
           if (xhr.status === 200) {
             result = csvJSON(xhr.responseText);
             console.log(result);
             loadDataFromCSV(result);
           } else {
             console.error(xhr.statusText);
             Qmsg.warning('读取CSV文件报错异常', {
               html: true
             });
             loading.close();
           }
         }
       };
       xhr.send(null);
     }
     // 数据预处理,批量转换坐标点
     function loadDataFromCSV(dataList) {
       for (var i = 0; i < dataList.length; i++) {
         var data = dataList[i];
         var name = data['名称'];
         if (name) {
           imgNameList.push(name);
         }
         var lat = data['纬度'];
         var lng = data['经度'];
         if (lat && lng) {
           lat = Number(data['纬度'].replace(/\s*/g, ""));
           lng = Number(data['经度'].replace(/\s*/g, ""));
           // 将WGS84坐标转换为GCJ02坐标
           var gcj02 = gcoord.transform([lng, lat], gcoord.WGS84, gcoord.GCJ02);
           points.push(gcj02);
         }
       }
       // 处理完成
       Qmsg.info('数据预处理完成', { html: true });
       loading.close();
     }
     // csv数据源转换json格式数据源
     function csvJSON(csv) {
       var lines = csv.split("\n");
       var result = [];
       // var headers = lines[0].split(",");
       var headers = lines[0].split("\t");
       for (var k = 0; k < headers.length; k++) {
         headers[k] = headers[k].replace('\"', '').replace('\r', '').replace('\"', '')
       }
       for (var i = 1; i < lines.length; i++) {
         var obj = {};
         // var currentline = lines[i].split(",");
         var currentline = lines[i].split("\t");
         for (var n = 0; n < currentline.length; n++) {
           currentline[n] = currentline[n].replace('\"', '').replace('\r', '').replace('\"', '')
         }
         for (var j = 0; j < headers.length; j++) {
           obj[headers[j]] = currentline[j];
         }
         result.push(obj);
       }
       return result;
     }
     // 批量导出图片
     async function goScreenshotMap2Img() {
       if (points.length === 0) {
         Qmsg.warning('获取不到CSV文件采集点经纬度数据源,导出图片异常', {
           html: true
         });
         return;
       }
       // 导出图片处理中
       loading = Qmsg.loading("导出图片处理中……");
       for (var i = 0; i < points.length; i++) {
         var point = points[i];
         var latlng = L.latLng(point[1], point[0]);
         if (marker) {
           marker.remove();
           marker = null;
         }
         marker = L.marker(latlng).addTo(map);
         map.setView(latlng, 16);  //设置缩放级别及中心点
         baseList.push(await screenshotMap2Img(latlng)); //await会阻塞当前异步函数的执行,等待promise返回处理结果
       }
       if (baseList.length === points.length && baseList.length > 0) {
         for (let k = 0; k < baseList.length; k++) {
           zip.file(imgNameList[k] + '.png', baseList[k], { base64: true })
         }
         zip.generateAsync({ type: 'blob' }).then(function (content) {
           saveAs(content, packageName + '.zip');
           loading.close();
           // 导出完成
           Qmsg.info('导出完成', { html: true });
         });
       }
     }
     // 截屏图片函数
     ……
    

完整内容点击跳转到小专栏文章