本文主要是基于geojson-merge,实现多个geojson文件合并为一个geojson文件,以便实现基于该文件进行数据分析展示
geojson合并概述
当前在 datav的geoatlas中,可以下载单个地市或区县的数据,例如福建省下面每个地市都可以单独下载一个geojson文件,现在需要将所有地市的geojson合并为一个福建省区县层级的geojson
geojson-merge
现在 npm安装 geojson-merge库:
npm i @mapbox/geojson-merge
支持两种方式进行合并
方式1-文件方式合并
该方式是每个geojson文件作为数组,传入到merge方法中进行合并,具体如下:
var geojsonUtil = require("@mapbox/geojson-merge");
var fs = require("fs");
var fileDir = "./infiles/";
// 该方法是异步执行的
fs.readdir(fileDir, { withFileTypes: true }, function (derr, files) {
if (derr) {
return console.error(derr);
}
var fileNames = [];
files.forEach(function (file) {
// 读取每个文件
if (file.isFile()) {
// 注意name只能获取到文件名称
fileNames.push(fileDir + file.name);
}
});
// 此处返回的是JSONStream对象
var mergeStream = geojsonUtil.mergeFeatureCollectionStream(fileNames);
// 直接文件方式合并结果会导致一部分数据丢失
var outFileStream = fs.createWriteStream("./outfiles/文件方式合并结果.json");
mergeStream.pipe(outFileStream);
// mergeStream.pipe(process.stdout);
console.log("json文件合并完毕");
});
注意:当前将福建省各个地市文件合并后,得到的结果会出现一部分数据丢失
方式2-内存数据合并
更推荐的一种方式是,将所有json文件读取到内存中,然后进行合并,具体如下:
var geojsonUtil = require("@mapbox/geojson-merge");
var fs = require("fs");
var fileDir = "./infiles/";
语言
方法
8873
XeO35
9918
2011-08-24 04:31:40
// 该方法是异步执行的
fs.readdir(fileDir, { withFileTypes: true }, function (derr, files) {
if (derr) {
return console.error(derr);
}
var datas = [];
files.forEach(function (file) {
// 读取每个文件
if (file.isFile()) {
// 注意name只能获取到文件名称
// 注意同步读取的结果是string类型,需要转换为json对象
datas.push(JSON.parse(fs.readFileSync(fileDir + file.name, "utf8")));
}
});
// merge之后得到的是json对象,写入数据文件时需要通过stringify方法转换为string类型
var mergedJson = geojsonUtil.merge(datas);
fs.writeFile(
"./outfiles/内存方式合并结果.json",
JSON.stringify(mergedJson),
() => {
console.log("文件合并完成");
}
);
});
输出的合并json文件,用tableau可视化展示效果如下(增加了随机指标值):
补充说明
vscode可以直接对node程序进行debug,一般是先采用默认配置进行debug,然后手工将配置信息修改如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": ["<node_internals>/**"],
"program": "${file}"
}
]
}