ThomasGIS是由个人基于C#开发的并原生于该语言的GIS程序集,旨在提供一定程度的GIS数据处理与分析能力,简化代码编写的复杂性。鉴于代码编写者的时间有限,ThomasGIS的初始版本着重于地理时空数据的处理与分析,并将主要的输入输出文件格式与ArcGIS保持一致,以获得更方便的运算结果可视化效果。后续开发过程中,ThomasGIS会持续集成更多本人可以实现的功能,最新的代码可以在GitHub上下载(https://github.com/ThomasZhong1997/ThomasGIS),希望大家使用愉快。
如在使用过程中发现无法解决的BUG,欢迎反馈问题至邮箱[email protected],我会尽力在第一时间修正并更新至新版本。
0. 于https://github.com/ThomasZhong1997/ThomasGIS网页处下载源码后,首先在新项目中添加对.dll文件的引用;
1. 将源码中位于BaseConfigure文件夹下的conf.xml文件拷贝至新项目的.exe程序所在位置;
2. 将源码中位于Coordinate文件夹下的多个.csv文件拷贝至新项目的.exe程序所在位置;
3. Github上的版本使用 VS2019 .NetStandard 2.0 框架编译,若版本不匹配请使用对应版本重新编译源代码;
using System;
using ThomasGIS.Vector;
namespace ReadShapefile
{
class Program
{
static void Main(string[] args)
{
IShapefile shapefile = VectorFactory.OpenShapefile("road.shp");
shapefile.ExportShapefile("road_new.shp");
}
}
}
上图代码展示了ThomasGIS如何读取一个Shapefile文件并将其重新输出为一个新的shapefile文件,使用VectorFactory类中的OpenShapefile静态方法获得IShapefile接口,并调用IShapefile接口的ExportShapefile方法将文件另存为新的路径。
ESRIShapeType.Point
ESRIShapeType.Polyline
ESRIShapefile.Polygon
using System;
using ThomasGIS.Vector;
namespace CreateShapefile
{
class Program
{
static void Main(string[] args)
{
// 生成点状要素Shape
IShapefile newPointShapefile = VectorFactory.CreateShapefile(ESRIShapeType.Point);
// 生成折线要素Shape
IShapefile newPolylineShapefile = VectorFactory.CreateShapefile(ESRIShapeType.Polyline);
// 生成多面要素Shape
IShapefile newPolygonShapefile = VectorFactory.CreateShapefile(ESRIShapeType.Polygon);
}
}
}
using System;
using ThomasGIS.Geometries;
using ThomasGIS.Vector;
namespace CreateShapefile
{
class Program
{
static void Main(string[] args)
{
IShapefile newShapefile = VectorFactory.CreateShapefile(ESRIShapeType.Point);
// 以WKT的形式加入点
string pointWKT = "POINT (113.4324 32.1321)";
newShapefile.AddFeature(pointWKT);
// 以Point对象的形式加入点
Point newPoint = new Point(113.4422, 32.1244);
newShapefile.AddFeature(newPoint);
newShapefile.ExportShapefile("point.shp");
}
}
}
主要函数:
0. shapefile.AddFeature(string wkt, Dictionary
1. shapefile.AddFeature(IGeometryBase geometry, Dictionary
using System;
using System.Collections.Generic;
using ThomasGIS.Vector;
namespace AddShapeField
{
class Program
{
static void Main(string[] args)
{
// 新建Shapefile对象
IShapefile newShapefile = VectorFactory.CreateShapefile(ESRIShapeType.Point);
// 加入数值类型的整形字段
newShapefile.AddField("age", DBFFieldType.Number, 8, 0);
// 加入数值类型的浮点型字段
newShapefile.AddField("height", DBFFieldType.Number, 10, 3);
// 加入文本型字段
newShapefile.AddField("name", DBFFieldType.Char, 20, 0);
// 要素的属性字典
Dictionary properties = new Dictionary();
properties.Add("age", 22);
properties.Add("height", 177.4);
// 加入要素与其对应的属性字典
newShapefile.AddFeature("POINT (114.342 32.1414)", properties);
// 使用SetValue方法设置已被加入Shapefile对象的要素的属性
newShapefile.SetValue(0, "name", "ALIBABA");
// 输出为shapefile文件
newShapefile.ExportShapefile("point.shp");
}
}
}
主要函数:
0. shapefile.AddField(string name, DBFFieldType type, int length, int precision);
1. shapefile.SetValue(int index, string fieldname, object value);
using System;
using ThomasGIS.Vector;
namespace GetFeatureProperty
{
class Program
{
static void Main(string[] args)
{
IShapefile shapefile = VectorFactory.OpenShapefile("point.shp");
int age = shapefile.GetFieldValueAsInt(0, "age");
string name = shapefile.GetFieldValueAsString(0, "name");
double height = shapefile.GetFieldValueAsDouble(0, "height");
Console.WriteLine($"Feature 0: age = {age}, name = {name}, height = {height}");
}
}
}
Output:
无投影文件,若需要请自行定义投影!
Feature 0: age = 22, name = ALIBABA, height = 177.4
using System;
using System.Collections.Generic;
using ThomasGIS.Coordinates;
using ThomasGIS.Vector;
namespace AddCoordinate
{
class Program
{
static void Main(string[] args)
{
// 新建Shapefile对象
IShapefile newShapefile = VectorFactory.CreateShapefile(ESRIShapeType.Point);
// 新建WGS_84投影坐标系,SRID遵从EPSG标准
CoordinateBase newCoordiante = CoordinateGenerator.CRSParseFromEPSG(4326);
// 设置shapefile的坐标系统
newShapefile.SetCoordinateRef(newCoordiante);
// 输出为shapefile文件
newShapefile.ExportShapefile("point.shp");
}
}
}
主要函数:
0. shapefile.SetCoordinateRef(CoordinateBase newCoordinate);
1. CoordinateBase shapefile.GetCoordinateRef(); 当shapefile无坐标系统时返回值为null;