nodeがgeojsonをshpに変えて先端に戻す実現方法

3204 ワード

nodeがgeojsonをshpに切り替えるには[ogr 2 ogr][1]ライブラリを呼び出す必要があります。Gr 2 ogrライブラリを呼び出すとき、gdalのツールを呼び出すことによって実現されます。
geojsonからshpに移行するため、gdalをインストールして環境変数を配置する必要があります。
参考文献:https://stackoverflow.com/questions/41253450/error-the-specified-module-could-not-be-found
第一:あなたはあなたのを確定します。nodeはいいです。そして次のステップを続けてもいいです。
第二に、あなたのノドが発見できないのは、依存関係が欠けているからかもしれません。
第三:Dependency Walkerをダウンロードして、このソフトウェアは何が足りないか確認してくれます。dll、ダウンロード住所:http://www.dependencywalker.com/
第四:Dependency Walkerをダウンロードしました。nodeファイルは、欠けている重要性をヒントにします。nodeの同じクラスのディレクトリの下に置いてください。もちろん、あなたもソフトウェアをダウンロードしなくてもいいです。直接に重要なdllを置いてください。nodeディレクトリの下に置いてもいいです。
第5:運行して、間違いを申し込むことはできませんでした。
環境の配置が終わったら、コードが実現できます。
まず、ogr 2 ogrライブラリを導入します。

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)
   })
ここで注意すべき点は、フロントエンド送信要求時にパラメータreponseTypeを設定する必要があります。ここでは、Blobオブジェクトを使用して、サーバから受信したファイルフローからblobオブジェクトを作成し、このblobを使用して指向型配列のURLを作成し、このurlをaタグのリンク先として、aタグのクリックイベントをトリガしてファイルをダウンロードします。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。