node将geojson转shp返回给前端的实现方法


Posted in Javascript onMay 29, 2019

node将geojson转shp需要调用[ogr2ogr][1]库来实现,在调用ogr2ogr库时,因为其通过调用gdal的工具来实现将

geojson转shp,所以需要安装gdal并配置环境变量。

参考文章:https://stackoverflow.com/questions/41253450/error-the-specified-module-could-not-be-found

第一:你要确定你的.node 是好的,然后你可以继续下一步了

第二:你的.node发现不了可能是因为缺少了依赖关系,简单点说,就是缺少了.dll

第三:下载 Dependency Walker,这个软件可以帮你确定一下缺少什么.dll,下载地址:http://www.dependencywalker.com/

第四:下载完Dependency Walker 直接打开.node 文件,将提示缺少的重要.dll 放在.node 同一级的目录下,当然你也可以不用下软件,直接把重要的.dll放在.node目录下就可以了。

第五:运行,就不会报错了。

环境配置完,可以进行代码实现了。

首先引入ogr2ogr库

const ogr2ogr = require('ogr2ogr')

生成shp文件压缩包

// 声明一个geojson变量也可以是geojson文件目录
  var geojson = {
   type: 'FeatureCollection',
   features: [
    {
     type: 'Feature',
     geometry
    }
   ]
  }
  // shp保存目录
  const zipPath = './export/shpfile.zip'
  // 创建文件写入流
  var file = fs.createWriteStream(zipPath)
  // 调用ogr2ogr进行转化
  var ogr = ogr2ogr(geojson).project('EPSG:4326')
   .format('ESRI Shapefile')
   .skipfailures()
   .stream()
  ogr.pipe(file)

然后将shp压缩文件传给前端,这里可以通过不同的方法进行传递

(1) 通过sendFile直接进行传递

var resPath = path.join(__dirname, '..', zipPath)
res.sendFile(resPath)

(2)通过流的方式进行传递

var resPath = path.join(__dirname, '..', zipPath)
  // 文件写入完成触发事件
  file.on('finish', function() {
   res.set({
    'Content-Type': 'application/zip',
    'Content-Disposition':
     'attachment; filename=' + encodeURI(name) + '.zip',
    'Content-Length': fs.statSync(zipPath).size
   })
   let fReadStream = fs.createReadStream(zipPath)
   fReadStream.pipe(res)
   fReadStream.on('end', function() {
    fs.unlinkSync(resPath)
   })
   fReadStream.on('error', function(err) {
    console.log(err)
   })
  })

最后是前端发送请求接收的代码

axios.post('http://localhost:3000/jsontoshp', {
    responseType: 'blob'
   }).then(res => {
    const blobUrl = URL.createObjectURL(res.data)
    const a = document.createElement('a')
    a.style.display = 'none'
    a.download = '文件名称'
    a.href = blobUrl
    a.click()
    URL.revokeObjectURL(blobUrl)
   })

这里需要注意的地方是前端发送请求时需要设置一个参数responseType: 'blob',这里用到了Blob对象,这里是从服务器接收到的文件流创建blob对象并使用该blob 创建一个指向类型数组的URL,将该url作为a标签的链接目标,然后去触发a标签的点击事件从而文件下载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript框架(iframe)操作总结
Apr 16 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
angular.bind使用心得
Oct 26 Javascript
基于jQuery实现搜索关键字自动匹配功能
Mar 26 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
javascript的BOM
May 03 Javascript
薪资那么高的Web前端必看书单
Oct 13 Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 jQuery
javascript实现动态时钟的启动和停止
Jul 29 Javascript
Node.js Domain 模块实例详解
Mar 18 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
May 29 #Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 #Javascript
JS学习笔记之数组去重实现方法小结
May 29 #Javascript
基于Vue实现电商SKU组合算法问题
May 29 #Javascript
JS学习笔记之闭包小案例分析
May 29 #Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 #Javascript
elementUI select组件value值注意事项详解
May 29 #Javascript
You might like
php minixml详解
2008/07/19 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
机械专业应届生求职信
2013/09/21 职场文书
区域总监的岗位职责
2013/11/21 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
主要负责人任命书
2014/06/06 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
月考总结与反思
2015/10/22 职场文书
诚信高考倡议书
2019/06/24 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python