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 QueryString解析类代码
Jan 17 Javascript
jQuery初学:find()方法及children方法的区别分析
Jan 31 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
Mar 02 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
jqPlot jQuery绘图插件的使用
Jun 18 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
Nov 30 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 jQuery
解决vue加scoped后就无法修改vant的UI组件的样式问题
Sep 07 Javascript
JSONObject与JSONArray使用方法解析
Sep 28 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
Nov 10 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下打开URL地址的几种方法小结
2010/05/16 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
Jquery 扩展方法
2010/05/06 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jquery图片切换插件
2015/03/16 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
js中new一个对象的过程
2017/02/20 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
Python实现完整的事务操作示例
2017/06/20 Python
Python类的继承用法示例
2019/01/31 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
教师党性分析材料
2014/02/04 职场文书
党务公开方案
2014/05/06 职场文书
暖春观后感
2015/06/08 职场文书
反腐倡廉观后感
2015/06/08 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python