https://github.com/zxyao145/corespatial
Based on .Net Standard v2.1, for reading and writing esri shapefile files. 基于.Net Standard v2.1, 用于shapefile文件读写。
https://github.com/zxyao145/corespatial
csharp dotnet-core dotnet-library dotnet-standard gis shapefile
Last synced: 5 months ago
JSON representation
Based on .Net Standard v2.1, for reading and writing esri shapefile files. 基于.Net Standard v2.1, 用于shapefile文件读写。
- Host: GitHub
- URL: https://github.com/zxyao145/corespatial
- Owner: zxyao145
- License: mit
- Created: 2020-03-25T14:56:17.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-04-02T06:57:48.000Z (over 4 years ago)
- Last Synced: 2025-03-31T21:28:09.602Z (6 months ago)
- Topics: csharp, dotnet-core, dotnet-library, dotnet-standard, gis, shapefile
- Language: C#
- Homepage:
- Size: 1.29 MB
- Stars: 6
- Watchers: 1
- Forks: 4
- Open Issues: 2
-
Metadata Files:
- Readme: README-en.md
- License: LICENSE
Awesome Lists containing this project
README
# CoreSpatial
[中文](./README.md)
### Purpose
CoreSpatial is a class library based on .Net Standard v2.1 to read and write shapefiles. It supports the reading and writing of projection file .prj (support by ProjNet).### nuget
| Library | nuget |
| ---- | ---- |
| CoreSpatial | [](https://www.nuget.org/packages/CoreSpatial) |
| CoreSpatial.Converter | [](https://www.nuget.org/packages/CoreSpatial.Converter) |### Project information
+ .NET Standard v2.1
+ Supports the reading and writing of shapefile
+ Using **ProjNet** to support reading and writing .prj files### Usage
read:
```c#
IFeatureSet fs = FeatureSet.Open(shpPath);
...
```write:
```c#
fs.Save(shpPath);
```create new shapefile:
```c#
void CreatePoint()
{
IFeatureSet fs = new FeatureSet(FeatureType.Point);
var point1 = new GeoPoint(133, 30);
var point2 = new GeoPoint(133, 32);
var point3 = new GeoPoint(134, 30);var feature1 = new Feature(new Geometry(point1));
var feature2 = new Feature(new Geometry(point2));
var feature3 = new Feature(new Geometry(point3));fs.Features.Add(feature1);
fs.Features.Add(feature2);
fs.Features.Add(feature3);
fs.Crs = Crs.Wgs84Gcs;var dataTable = new DataTable();
dataTable.Columns.Add("名称", typeof(string));
dataTable.Columns.Add("id", typeof(int));
var row1 = dataTable.NewRow();
var row2 = dataTable.NewRow();
var row3 = dataTable.NewRow();row1[0] = "点1";
row1[1] = 1;row2[0] = "点2";
row2[1] = 2;
row3[0] = "点3";
row3[1] = 3;dataTable.Rows.Add(row1);
dataTable.Rows.Add(row2);
dataTable.Rows.Add(row3);fs.AttrTable = dataTable;
fs.Save("../createNew/point.shp");
}void CreateMultiPoint()
{
IFeatureSet fs = new FeatureSet(FeatureType.MultiPoint);var point1 = new GeoPoint(133, 30);
var point2 = new GeoPoint(133, 32);
var point3 = new GeoPoint(134, 30);var point4 = new GeoPoint(134, 34);
var point5 = new GeoPoint(135, 35);var multiPoint1 = new MultiPoint(new List()
{
point1,point2,point3
});var multiPoint2 = new MultiPoint();
multiPoint2.Points.Add(point4);
multiPoint2.Points.Add(point5);
var feature1 = new Feature(new Geometry(multiPoint1));
var feature2 = new Feature(new Geometry(multiPoint2));fs.Features.Add(feature1);
fs.Features.Add(feature2);
fs.Crs = Crs.Wgs84Gcs;var dataTable = new DataTable();
dataTable.Columns.Add("名称", typeof(string));
dataTable.Columns.Add("id", typeof(int));
var row1 = dataTable.NewRow();
var row2 = dataTable.NewRow();row1[0] = "多点1";
row1[1] = 1;row2[0] = "多点2";
row2[1] = 2;dataTable.Rows.Add(row1);
dataTable.Rows.Add(row2);fs.AttrTable = dataTable;
fs.Save("../createNew/multipoint.shp");
}void CreatePolyLine()
{
IFeatureSet fs = new FeatureSet(FeatureType.PolyLine);var point1 = new GeoPoint(133, 30);
var point2 = new GeoPoint(133, 32);
var point3 = new GeoPoint(134, 30);var point4 = new GeoPoint(134, 34);
var point5 = new GeoPoint(135, 35);//line ring
var polyLine1 = new PolyLine(new List()
{
point1,point2,point3,point1
});
var isLineRing = polyLine1.IsLineRing;var polyLine2 = new PolyLine(new List()
{
point4,point5
});
var feature1 = new Feature(new Geometry(polyLine1));
var feature2 = new Feature(new Geometry(polyLine2));fs.Features.Add(feature1);
fs.Features.Add(feature2);
fs.Crs = Crs.Wgs84Gcs;var dataTable = new DataTable();
dataTable.Columns.Add("名称", typeof(string));
dataTable.Columns.Add("id", typeof(int));
var row1 = dataTable.NewRow();
var row2 = dataTable.NewRow();row1[0] = "线1";
row1[1] = 1;row2[0] = "线2";
row2[1] = 2;dataTable.Rows.Add(row1);
dataTable.Rows.Add(row2);fs.AttrTable = dataTable;
fs.Save("../createNew/polyline.shp");
}void CreateMultiPolyLine()
{
IFeatureSet fs = new FeatureSet(FeatureType.PolyLine);var point1 = new GeoPoint(132, 30);
var point2 = new GeoPoint(136, 30);
var point3 = new GeoPoint(134, 28);
var point4 = new GeoPoint(134, 32);var polyLine1 = new PolyLine(new List()
{
point1,point2
});var polyLine2 = new PolyLine(new List()
{
point3,point4
});var multiPolyLine1 = new MultiPolyLine(new List()
{
polyLine1,polyLine2
});
var feature1 = new Feature(new Geometry(multiPolyLine1));fs.Features.Add(feature1);
fs.Crs = Crs.Wgs84Gcs;var dataTable = new DataTable();
dataTable.Columns.Add("名称", typeof(string));
dataTable.Columns.Add("id", typeof(int));
var row1 = dataTable.NewRow();row1[0] = "十字多线";
row1[1] = 1;dataTable.Rows.Add(row1);
fs.AttrTable = dataTable;
fs.Save("../createNew/multiPolyLine.shp");
}void CreatePolygon()
{
IFeatureSet fs = new FeatureSet(FeatureType.Polygon);var point1 = new GeoPoint(132, 30);
var point2 = new GeoPoint(136, 30);
var point3 = new GeoPoint(132, 35);
var edge = new PolyLine(new List()
{
point1, point2, point3, point1
});
var polygon = new Polygon(edge);//edge,Clockwise
var point4 = new GeoPoint(140, 30);
var point5 = new GeoPoint(140, 35);
var point6 = new GeoPoint(150, 35);
var point7 = new GeoPoint(150, 30);
var edge2 = new PolyLine(new List()
{
point4, point5, point6, point7, point4
});//points sketch
// .(point9)
//
// .(point8) .(point10)
//
var point8 = new GeoPoint(142, 31);
var point9 = new GeoPoint(145, 33);
var point10 = new GeoPoint(148, 31);//hole, need Counterclockwise,
//if Counterclockwise, sequence should be:
//point8, point10, point9
//It will be handled inside the library.
//It will be a line ring inside the library too
var hole = new PolyLine(new List()
{
point8,point9,point10
});
var polygon2 = new Polygon(edge2, hole);var feature1 = new Feature(new Geometry(polygon));
var feature2 = new Feature(new Geometry(polygon2));fs.Features.Set(new List()
{
feature1,
feature2
});
fs.Crs = Crs.Wgs84Gcs;var dataTable = new DataTable();
dataTable.Columns.Add("名称", typeof(string));
dataTable.Columns.Add("id", typeof(int));
var row1 = dataTable.NewRow();
var row2 = dataTable.NewRow();row1[0] = "简单面";
row1[1] = 1;row2[0] = "带洞面";
row2[1] = 2;dataTable.Rows.Add(row1);
dataTable.Rows.Add(row2);fs.AttrTable = dataTable;
fs.Save("../createNew/polygon.shp");
}//for using GB2312
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);CreatePoint();
CreateMultiPoint();
CreatePolyLine();
CreateMultiPolyLine();
CreatePolygon();
```
Corespatial refers to **DotSpatial**. Some of its usage is similar. See CoreSpatial.Test for details.Convert to GeoJSON (You need to add reference **CoreSpatial.Converter** first):
```c#
fs.ToGeoJSON();
```Convert to KML/KMZ (You need to add reference **CoreSpatial.Converter** first):
```c#
fs.ToKML(kmlName);
fs.ToKMZ(kmlName, KmzSavePath);
```See CoreSpatial.Converter.Test for usage, Geojson can be verified at http://geojson.io/.
### Attention
+ Cannot read SHP file of M value and Z value### Reference
[DotSpatial](https://github.com/DotSpatial/DotSpatial "DotSpatial")[NetTopologySuite.IO.ShapeFile](https://github.com/NetTopologySuite/NetTopologySuite.IO.ShapeFile "NetTopologySuite.IO.ShapeFile")
### Developer
zxyao145### License
See LICENSE.txt