node將geojson轉(zhuǎn)shp返回給前端的實(shí)現(xiàn)方法
node將geojson轉(zhuǎn)shp需要調(diào)用[ogr2ogr][1]庫(kù)來(lái)實(shí)現(xiàn),在調(diào)用ogr2ogr庫(kù)時(shí),因?yàn)槠渫ㄟ^(guò)調(diào)用gdal的工具來(lái)實(shí)現(xiàn)將
geojson轉(zhuǎn)shp,所以需要安裝gdal并配置環(huán)境變量。
參考文章:https://stackoverflow.com/questions/41253450/error-the-specified-module-could-not-be-found
第一:你要確定你的.node 是好的,然后你可以繼續(xù)下一步了
第二:你的.node發(fā)現(xiàn)不了可能是因?yàn)槿鄙倭艘蕾囮P(guān)系,簡(jiǎn)單點(diǎn)說(shuō),就是缺少了.dll
第三:下載 Dependency Walker,這個(gè)軟件可以幫你確定一下缺少什么.dll,下載地址:http://www.dependencywalker.com/
第四:下載完Dependency Walker 直接打開(kāi).node 文件,將提示缺少的重要.dll 放在.node 同一級(jí)的目錄下,當(dāng)然你也可以不用下軟件,直接把重要的.dll放在.node目錄下就可以了。
第五:運(yùn)行,就不會(huì)報(bào)錯(cuò)了。
環(huán)境配置完,可以進(jìn)行代碼實(shí)現(xiàn)了。
首先引入ogr2ogr庫(kù)
const ogr2ogr = require('ogr2ogr')
生成shp文件壓縮包
// 聲明一個(gè)geojson變量也可以是geojson文件目錄
var geojson = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry
}
]
}
// shp保存目錄
const zipPath = './export/shpfile.zip'
// 創(chuàng)建文件寫(xiě)入流
var file = fs.createWriteStream(zipPath)
// 調(diào)用ogr2ogr進(jìn)行轉(zhuǎn)化
var ogr = ogr2ogr(geojson).project('EPSG:4326')
.format('ESRI Shapefile')
.skipfailures()
.stream()
ogr.pipe(file)
然后將shp壓縮文件傳給前端,這里可以通過(guò)不同的方法進(jìn)行傳遞
(1) 通過(guò)sendFile直接進(jìn)行傳遞
var resPath = path.join(__dirname, '..', zipPath) res.sendFile(resPath)
(2)通過(guò)流的方式進(jìn)行傳遞
var resPath = path.join(__dirname, '..', zipPath)
// 文件寫(xiě)入完成觸發(fā)事件
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)
})
})
最后是前端發(fā)送請(qǐng)求接收的代碼
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)
})
這里需要注意的地方是前端發(fā)送請(qǐng)求時(shí)需要設(shè)置一個(gè)參數(shù)responseType: 'blob',這里用到了Blob對(duì)象,這里是從服務(wù)器接收到的文件流創(chuàng)建blob對(duì)象并使用該blob 創(chuàng)建一個(gè)指向類型數(shù)組的URL,將該url作為a標(biāo)簽的鏈接目標(biāo),然后去觸發(fā)a標(biāo)簽的點(diǎn)擊事件從而文件下載。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于socket.io+express實(shí)現(xiàn)多房間聊天
本文給大家分享的是使用node.js,基于socket.io+express實(shí)現(xiàn)多房間聊天的代碼,非常的實(shí)用,有需要的小伙伴可以來(lái)參考下2016-03-03
NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù)
這篇文章主要為大家介紹了NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Node.js?中使用fetch?按JSON格式發(fā)post請(qǐng)求的問(wèn)題解析
最近在測(cè)試一個(gè)api,可以用curl命令直接訪問(wèn),指定header相關(guān)配置,request?body(JSON),成功后返回一個(gè)JSON,這篇文章主要介紹了Node.js?中使用fetch?按JSON格式發(fā)post請(qǐng)求,需要的朋友可以參考下2023-04-04
使用express搭建一個(gè)簡(jiǎn)單的查詢服務(wù)器的方法
本篇文章主要介紹了使用express搭建一個(gè)簡(jiǎn)單的查詢服務(wù)器的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Node.js本地搭建簡(jiǎn)單頁(yè)面小游戲的過(guò)程
Node.js是能夠在服務(wù)器端運(yùn)行 JavaScript 的開(kāi)放源代碼、跨平臺(tái)運(yùn)行環(huán)境,Node.js 大部分基本模塊都用 JavaScript 語(yǔ)言編寫(xiě),下面將介紹如何簡(jiǎn)單幾步實(shí)現(xiàn)遠(yuǎn)程公共網(wǎng)絡(luò)下訪問(wèn)windwos node.js的服務(wù)端2024-01-01

