ThomasGIS(1):Shapefile文件操作

零、前言

ThomasGIS是由个人基于C#开发的并原生于该语言的GIS程序集,旨在提供一定程度的GIS数据处理与分析能力,简化代码编写的复杂性。鉴于代码编写者的时间有限,ThomasGIS的初始版本着重于地理时空数据的处理与分析,并将主要的输入输出文件格式与ArcGIS保持一致,以获得更方便的运算结果可视化效果。后续开发过程中,ThomasGIS会持续集成更多本人可以实现的功能,最新的代码可以在GitHub上下载(https://github.com/ThomasZhong1997/ThomasGIS),希望大家使用愉快。

如在使用过程中发现无法解决的BUG,欢迎反馈问题至邮箱[email protected],我会尽力在第一时间修正并更新至新版本。

一、如何使用ThomasGIS

0. 于https://github.com/ThomasZhong1997/ThomasGIS网页处下载源码后,首先在新项目中添加对.dll文件的引用;

1. 将源码中位于BaseConfigure文件夹下的conf.xml文件拷贝至新项目的.exe程序所在位置;

2. 将源码中位于Coordinate文件夹下的多个.csv文件拷贝至新项目的.exe程序所在位置;

3. Github上的版本使用 VS2019 .NetStandard 2.0 框架编译,若版本不匹配请使用对应版本重新编译源代码;

二、Shapefile文件操作

2.0 Shapefile文件读写

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方法将文件另存为新的路径。

2.1 新建Shapefile

2.2.0 Shapefile的类型

ESRIShapeType.Point
ESRIShapeType.Polyline
ESRIShapefile.Polygon

2.2.1 新建Shapefile对象

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);
        }
    }
}

2.2.2 向Shapefile中加入要素

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 properties=null);

1. shapefile.AddFeature(IGeometryBase geometry, Dictionary properties=null);

2.2.3 向Shapefile添加属性字段与设置要素属性

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);

2.2.4  读取Shapefile的要素属性

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

2.2.5 设置坐标系统

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

你可能感兴趣的:(ThomasGIS,gis,opensource,shapefile)