【问题标题】:How to read each features in a large geojson如何读取大型 geojson 中的每个功能
【发布时间】:2019-07-12 08:48:32
【问题描述】:

我需要从 Geojson 文件中获取数据并将其中的一些插入到数据库中。 问题是:文件是 2.4Gb,所以 Node.js 不能那样读取它。

我尝试使用一些 json 流模块但没有成功 (big-json) (stream-json)。 模块需要一个对象数组,然而,geojson 只是一个对象,里面有一个对象数组。

模块期望:

[
{
  'name': '',
  'hello': ''
},
{
  'name': '',
  'hello': ''
},
...thousands of objects
]

但我有:

{
  'type':'FeatureCollection',
  'features':[ ...thousand of objects... ]
}

我尝试使用 stream-json :

const fs = require('fs')
const {parser} = require('stream-json')
const {chain}  = require('stream-chain')
const {pick}   = require('stream-json/filters/Pick')
const {streamValues} = require('stream-json/streamers/StreamValues')

const pipeline = chain([
  fs.createReadStream('myHugeFile.json'), //2.4Gb
  parser(),
  pick({filter: /^\d+\.features\.\d+/}),
  streamValues()
])
pipeline.on('data', (data) => {
  console.log(data)
})
pipeline.on('end', () => {
  console.log(`Done`)
})

它永远不会转到on('data')。 我想获取 'features' 数组中的所有特征对象。

【问题讨论】:

    标签: node.js json geojson


    【解决方案1】:

    stream-json/filters/Pick 的文档提供了一个对 GeoJSON 文件有用的示例。

    这是您从myHugeFile.geojson 读取features 的方式:

    const Pick = require('stream-json/filters/Pick');
    const {streamArray} = require('stream-json/streamers/StreamArray');
    const {chain} = require('stream-chain');
    const fs = require('fs');
    
    const pipeline = chain([
      fs.createReadStream('myHugeFile.geojson'),
      Pick.withParser({filter: 'features'}),
      streamArray()
    ]);
    
    pipeline.on('data', data => console.log(data));
    

    请注意,pipeline.on 方法是异步调用的。因此,如果您将data 写入数组并尝试立即读取此数组,它将为空。

    读取完成后会触发end 事件(可能需要几分钟):

    pipeline.on('end', () => console.log('End!'));
    

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 2022-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2023-04-10
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多