当前位置: 首页 > news >正文

【NetTopologySuite类库】geojson和shp互转,和自定义对象互转

geojson介绍

1. 示例

在visual studio中使用NuGet中安装了三个库(.net4.7.2环境):

  • NetTopologySuite 2.5
  • NetTopologySuite.IO.Esri.Shapefile 1.2
  • NetTopologySuite.IO.GeoJSON 4.0

1.1 shp数据转geojson

先创建一个shp文件作为例子:

using NetTopologySuite.Geometries;
using NetTopologySuite.IO;
using NetTopologySuite.IO.Esri;
using NetTopologySuite.Features;
using System.Collections.Generic;
using System.IO;

//创建一个用于测试的shp文件
var r = new WKTReader();
var geo1 = r.Read("polygon((0 0,0 10,10 10,10 0,0 0))");
var geo2 = r.Read("polygon((10 0,10 10,20 10,20 0,10 0))");
Save("./Tmp/data.shp", geo1, geo2);
    
//工具方法
public static void Save(string shpPath, params Geometry[] geos)
{
    Directory.CreateDirectory(Path.GetDirectoryName(shpPath));
    var features = geos.Select(x => new Feature(x, null)).ToList();
    Shapefile.WriteAllFeatures(features, shpPath);
}

再读取shp,将其转为geojson:

public void TestMethod1()
{
	//读取shp文件,转geojson
    var features = Shapefile.ReadAllFeatures("./Tmp/data.shp");
    var modifiedJson = new GeoJsonWriter().Write(features);
    File.WriteAllText("./Tmp/output.geojson", modifiedJson);
}

生成的geojson:

[
  {
    "type": "Feature",
    "bbox": [0.0, 0.0, 10.0, 10.0],
    "geometry": {
      "type": "MultiPolygon",
      "coordinates": [
        [
          [
            [0.0, 0.0],
            [10.0, 0.0],
            [10.0, 10.0],
            [0.0, 10.0],
            [0.0, 0.0]
          ]
        ]
      ]
    },
    "properties": {
      "Id": 1
    }
  },
  {
    "type": "Feature",
    "bbox": [10.0, 0.0, 20.0, 10.0],
    "geometry": {
      "type": "MultiPolygon",
      "coordinates": [
        [
          [
            [10.0, 0.0],
            [20.0, 0.0],
            [20.0, 10.0],
            [10.0, 10.0],
            [10.0, 0.0]
          ]
        ]
      ]
    },
    "properties": {
      "Id": 1
    }
  }
]

1.2 geojson转shp数据

public void TestMethod2()
{
    var json = File.ReadAllText("./Tmp/output.geojson");
    var reader = new GeoJsonReader();
    var features = reader.Read<Feature[]>(json);
    Shapefile.WriteAllFeatures(features, "./Tmp/data2.shp");
}

1.2 自定义对象转geojson

自定义一个类(里面有属性,有几何Geometry ):

 public class Item
 {
     public string Name { get; set; } = "Layer";
     public Geometry Geo { get; set; }
     public Dictionary<string, object> Attrs { get; set; }

     public Item(string name, Geometry geo, Dictionary<string, object> attrs)
     {
         Name = name;
         Geo = geo;
         Attrs = attrs;
     }
 }

为该类创建对象数组,并将其转为geojson:

public void TestMethod3()
{
    var r = new WKTReader();
    var geo1 = r.Read("polygon((0 0,0 10,10 10,10 0,0 0))");
    var geo2 = r.Read("polygon((10 0,10 10,20 10,20 0,10 0))");

    var item1 = new Item("A", geo1, new Dictionary<string, object>()
    {
        { "key", 1}, { "value", 2} 
    });
    var item2 = new Item("A", geo1, new Dictionary<string, object>()
    {
        { "key", 1}, { "value", 2}
    });
    var items = new Item[] {item1, item2 };
    var modifiedJson = new GeoJsonWriter().Write(items);
    File.WriteAllText("./Tmp/output2.geojson", modifiedJson);      
}

转成的geojson:

[
  {
    "Name": "A",
    "Geo": {
      "type": "Polygon",
      "coordinates": [
        [
          [0.0, 0.0],
          [10.0, 0.0],
          [10.0, 10.0],
          [0.0, 10.0],
          [0.0, 0.0]
        ]
      ]
    },
    "Attrs": {
      "key": 1,
      "value": 2
    }
  },
  {
    "Name": "A",
    "Geo": {
      "type": "Polygon",
      "coordinates": [
        [
          [0.0, 0.0],
          [10.0, 0.0],
          [10.0, 10.0],
          [0.0, 10.0],
          [0.0, 0.0]
        ]
      ]
    },
    "Attrs": {
      "key": 1,
      "value": 2
    }
  }
]

1.3 geojson转自定义对象

public void TestMethod4()
{
    var json = File.ReadAllText("./Tmp/output2.geojson");
    var reader = new GeoJsonReader();
    var obj = reader.Read<Item[]>(json);
}

相关文章:

  • Minikube+HyperV 踩坑记
  • 2025-03-06 学习记录--C/C++-PTA 习题6-6 使用函数输出一个整数的逆序数
  • linux应用:文件描述符、lseek
  • RAGflow 无法加载Embedding模型
  • Java阻塞队列深度解析:高并发场景下的安全卫士
  • AI绘画软件Stable Diffusion详解教程(7):图生图基础篇
  • 数字电路基础——逻辑门
  • 获取视频第一帧兼容ios
  • 数据库复习(第五版)- 第八章 存储过程
  • Docker save命令怎么用
  • 大型WLAN组网部署(Large scale WLAN network deployment)
  • PDF转JPG(并去除多余的白边)
  • Linux开启命令审计功能记录用户的每一步操作
  • python基础课程整理--元组的基础
  • 期望、方差和协方差
  • 【VTK】三种面切片数据 加载模型 scalars设置颜色透明度 加载raw 医学数据
  • QT——线程
  • SQL_语法
  • 逐行拆解 C 语言:数据类型、变量
  • 【初探数据结构】线性表——链表(二)带头双向循环链表(详解与实现)
  • 做哪些网站比较好/长安seo排名优化培训
  • 还有专门给别人做性奴的网站/做小程序要多少钱
  • 如何在网站上做免费广告/百度热搜榜在哪里看
  • 网站公安网备案什么意思/百度做推广一般要多少钱
  • 内部网站建设app/营销软文是什么意思
  • 黄冈网站建设/百度站长链接提交