草庐IT

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

GIS之家 2023-03-28 原文

前言

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('<i style="color:red">读取CSV文件报错异常</i>', {
               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('<i style="color:red">数据预处理完成</i>', { 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('<i style="color:red">获取不到CSV文件采集点经纬度数据源,导出图片异常</i>', {
           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('<i style="color:red">导出完成</i>', { html: true });
         });
       }
     }
     // 截屏图片函数
     ……
    

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

有关leaflet地图截图批量导出(附源码下载)的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  3. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  6. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  7. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  8. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  9. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  10. ruby-on-rails - Rubygems - 包在哪里下载? - 2

    当你安装一个新包时,例如,'geminstallfb-graph',文件下载到哪里了? 最佳答案 使用此命令查找特定gem的安装位置:gemwhich例如:gemwhichfb-graph 关于ruby-on-rails-Rubygems-包在哪里下载?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13200065/

随机推荐