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 相关文章推荐
dojo学习第二天 ajax异步请求之绑定列表
Aug 29 Javascript
使用jquery实现IE下按backspace相当于返回操作
Mar 18 Javascript
jQuery实现平滑滚动到指定锚点的方法
Mar 20 Javascript
jQuery设置指定网页元素宽度和高度的方法
Mar 25 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
Dec 03 Javascript
BootStrap 可编辑表Table格
Nov 24 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
jQuery+ajax实现修改密码验证功能实例详解
Jul 06 jQuery
js中el表达式的使用和非空判断方法
Mar 28 Javascript
详解javascript对数组和json数组的操作
Apr 15 Javascript
vue+element实现表单校验功能
May 20 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 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编写大型网站问题集
2007/03/06 PHP
php 404错误页面实现代码
2009/06/22 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
DOM 事件流详解
2015/01/20 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Python使用爬虫猜密码
2016/02/19 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
材料工程专业毕业生求职信
2014/03/04 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
2015高考寄语集锦
2015/02/27 职场文书
标枪加油稿
2015/07/22 职场文书
创业计划书之酒吧
2019/12/02 职场文书