node將geojson轉(zhuǎn)shp需要調(diào)用[ogr2ogr][1]庫來實現(xiàn),在調(diào)用ogr2ogr庫時,因為其通過調(diào)用gdal的工具來實現(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)不了可能是因為缺少了依賴關(guān)系,簡單點(diǎn)說,就是缺少了.dll
第三:下載 Dependency Walker,這個軟件可以幫你確定一下缺少什么.dll,下載地址:http://www.dependencywalker.com/
第四:下載完Dependency Walker 直接打開.node 文件,將提示缺少的重要.dll 放在.node 同一級的目錄下,當(dāng)然你也可以不用下軟件,直接把重要的.dll放在.node目錄下就可以了。
第五:運(yùn)行,就不會報錯了。
環(huán)境配置完,可以進(jìn)行代碼實現(xiàn)了。
首先引入ogr2ogr庫
const ogr2ogr = require('ogr2ogr')
生成shp文件壓縮包
// 聲明一個geojson變量也可以是geojson文件目錄 var geojson = { type: 'FeatureCollection', features: [ { type: 'Feature', geometry } ] } // shp保存目錄 const zipPath = './export/shpfile.zip' // 創(chuàng)建文件寫入流 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壓縮文件傳給前端,這里可以通過不同的方法進(jìn)行傳遞
(1) 通過sendFile直接進(jìn)行傳遞
var resPath = path.join(__dirname, '..', zipPath)res.sendFile(resPath)
(2)通過流的方式進(jìn)行傳遞
var resPath = path.join(__dirname, '..', zipPath) // 文件寫入完成觸發(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ā)送請求接收的代碼
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ā)送請求時需要設(shè)置一個參數(shù)responseType: 'blob',這里用到了Blob對象,這里是從服務(wù)器接收到的文件流創(chuàng)建blob對象并使用該blob 創(chuàng)建一個指向類型數(shù)組的URL,將該url作為a標(biāo)簽的鏈接目標(biāo),然后去觸發(fā)a標(biāo)簽的點(diǎn)擊事件從而文件下載。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答