GeoJson数据合并

本文主要是基于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/";

// 该方法是异步执行的
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}"
    }
  ]
}

参考资料

  • https://www.npmjs.com/package/@mapbox/geojson-merge
  • https://datav.aliyun.com/tools/atlas/
合并 GeoJSON 数据之前,需要确保这些数据属于同一地理区域,并且具有相同的坐标系和属性结构。以下是合并 GeoJSON 数据的一般步骤: 1. 将所有 GeoJSON 数据加载到一个列表中,可以使用 Python 中的 `json` 模块或者 JavaScript 中的 `fetch` 方法来加载数据。 2. 对于每个 GeoJSON 数据,使用该数据的 `features` 属性以及 `Array.concat()` 方法将其所有特征对象合并到一个新的 `features` 列表中。 3. 创建一个新的 GeoJSON 对象,将上一步中创建的 `features` 列表作为其 `features` 属性的值。 4. 如果需要,可以在新的 GeoJSON 对象中添加其他属性或元数据。 以下是一个使用 JavaScript 合并 GeoJSON 数据的示例代码: ```javascript // 加载 GeoJSON 数据 const data1 = fetch('data1.geojson').then(response => response.json()); const data2 = fetch('data2.geojson').then(response => response.json()); // 合并 feature 列表 Promise.all([data1, data2]).then(values => { const features = values.reduce((acc, curr) => acc.concat(curr.features), []); // 创建新的 GeoJSON 对象 const mergedData = { type: 'FeatureCollection', features: features }; // 可以在合并后的数据中添加其他属性或元数据 // mergedData.metadata = { ... }; console.log(mergedData); }); ``` 在 Python 中,可以使用 `geojson` 模块来加载和创建 GeoJSON 对象。以下是一个使用 Python 合并 GeoJSON 数据的示例代码: ```python import json import geojson # 加载 GeoJSON 数据 with open('data1.geojson') as f1, open('data2.geojson') as f2: data1 = geojson.load(f1) data2 = geojson.load(f2) # 合并 feature 列表 features = data1['features'] + data2['features'] # 创建新的 GeoJSON 对象 merged_data = geojson.FeatureCollection(features) # 可以在合并后的数据中添加其他属性或元数据 # merged_data['metadata'] = { ... } print(json.dumps(merged_data)) ``` 请注意,这只是一种合并 GeoJSON 数据的通用方法。具体实现可能因数据结构和需求而异,需要根据实际情况进行调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值