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 可以拖动的DIV(二)
Jun 26 Javascript
Juqery Html(),append()等方法的Bug解决方法
Dec 13 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
javascript 循环调用示例介绍
Nov 20 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
jQuery基于正则表达式的表单验证功能示例
Jan 21 Javascript
基于JavaScript实现焦点图轮播效果
Mar 27 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
Jul 06 Javascript
浅谈jQuery框架Ajax常用选项
Jul 08 jQuery
node中IO以及定时器优先级详解
May 10 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 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
通过html表格发电子邮件
2006/10/09 PHP
php数组合并的二种方法
2014/03/21 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
PHP经典面试题集锦
2015/03/19 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Python中用于返回绝对值的abs()方法
2015/05/14 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
Django如何配置mysql数据库
2018/05/04 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
工厂会计员职责
2014/02/06 职场文书
基层党支部承诺书
2015/04/30 职场文书
禁毒心得体会范文
2016/01/15 职场文书
MySQL基础(二)
2021/04/05 MySQL
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
新手入门Mysql--sql执行过程
2021/06/20 MySQL
JS实现简单的九宫格抽奖
2022/06/28 Javascript
使用CSS实现音波加载效果
2023/05/07 HTML / CSS