基于node-gdal的矢量数据编辑

admin基于node-gdal的矢量数据编辑已关闭评论条评论 268 次浏览

此前我参考了两篇node-gdal的软文,目前国内对node-gdal的案例并不多,在此我参考前人的软文以及结合了自己的实践经验记录下node-gdal的矢量数据(shp文件)入门操作。希望对使用node、gis技术栈的朋友有所帮助。

node-gdal于2020年9月底才支持了node12。如果安装不成功,请查看是不是node版本的问题。
教程环境 node:12.16.3 npm:6.14.8

一 node-gdal安装
Github地址:https://github.com/naturalatlas/node-gdal
使用nodejs安装:
npm install gdal –save / cnpm install gdal –save

一个读取shp文件信息的helloword 程序

const gdal = require("gdal");

// 查看所有支持的驱动程序

gdal.drivers.forEach(function (drive, i) {

  console.log(drive.description);

});

//r只读  r+读取修改增加  w可写(创建)

const dataset = gdal.open("./shp/jiance.shp", "r+", "ESRI Shapefile");

const layer = dataset.layers.get(0);

// 获取图层的的数据长度

console.log("number of features: " + layer.features.count());

// 获取图层字段ID

console.log("fields: " + layer.fields.getNames());

dataset.layers.get(0).features.forEach(function (feature) {

  console.log(feature.getGeometry().toJSON());

  console.log(feature.fields.toJSON());

});

// 获取图层的四至

console.log("extent: " + JSON.stringify(layer.extent));

// 获取图层坐标系

console.log("srs: " + (layer.srs ? layer.srs.toWKT() : "null"));
往SHP文件增加数据
/* 新增数据 */

//构造一个feature

var feature = new gdal.Feature(layer);

//给字段赋值

feature.fields.set("类型", "不知道");

feature.fields.set("名称", "Grand Teton");

feature.fields.set("经度", -110.802414);

feature.fields.set("纬度", 43.741208);

feature.fields.set("高程", 35.248);

feature.setGeometry(new gdal.Point(43.741208, -110.802414, 35.248));

layer.features.add(feature);

// //将对shp图层的更改写入磁盘文件

layer.flush();

dataset.layers.get(0).features.forEach(function (feature) {

  console.log(feature.getGeometry().toJSON());

  console.log(feature.fields.toJSON());

});

根据逻辑  字段属性或者ID 删除shp矢量数据
/* 删除数据 */

layer.features.forEach((Feature) => {

  console.log(Feature.fid);

  console.log(Feature.fields);

  // console.log(typeof Feature.fields.toJSON());

  let filesJson = JSON.parse(Feature.fields.toJSON());

  if (filesJson["名称"] === "Grand Teton") {

    layer.features.remove(Feature.fid);

  }

});

dataset.layers.get(0).features.forEach(function (feature) {

  // console.log(feature);

  console.log(feature.getGeometry().toJSON());

  console.log(feature.fields.toJSON());

});

根据逻辑  字段属性或者ID 修改shp矢量数据

/* 修改数据 */

layer.features.forEach((Feature) => {

  console.log(Feature.fid);

  console.log(Feature.fields);

  // console.log(typeof Feature.fields.toJSON());

  let filesJson = JSON.parse(Feature.fields.toJSON());

  if (filesJson["名称"] === "Grand Teton") {

    // layer.features.remove(Feature.fid);

    let updateFeature = new gdal.Feature(layer);

    updateFeature.fields.set("类型", "不知道");

    updateFeature.fields.set("名称", "Grand Teton");

    updateFeature.fields.set("经度", -110.802414);

    updateFeature.fields.set("纬度", 43.741208);

    updateFeature.fields.set("高程", 65.248);

    updateFeature.setGeometry(new gdal.Point(43.741208, -114.802414, 65.248));

    layer.features.set(8, updateFeature); // 修改数据 指定ID修改

  }

});

dataset.layers.get(0).features.forEach(function (feature) {

  console.log(feature.fid);

  console.log(feature.getGeometry().toJSON());

  console.log(feature.fields.toJSON());

});