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 相关文章推荐
JQuery UI皮肤定制
Jul 27 Javascript
基于jquery的direction图片渐变动画效果
May 24 Javascript
jquery text(),val(),html()方法区别总结
Nov 04 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
js判断60秒以及倒计时示例代码
Jan 24 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 Javascript
JS+Canvas绘制时钟效果
Aug 20 Javascript
Vue.js双向绑定实现原理详解
Dec 22 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
jQuery简介_动力节点Java学院整理
Jul 04 jQuery
Vue单文件组件的如何使用方式介绍
Jul 28 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在字符串中查找另一个字符串
2008/11/19 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
jquery实现的图片点击滚动效果
2014/04/29 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
从零学Python之hello world
2014/05/21 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
python中的随机函数random的用法示例
2018/01/27 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
详解Anaconda 的安装教程
2020/09/23 Python
python的数学算法函数及公式用法
2020/11/18 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
实习鉴定评语
2014/01/19 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android