OGU4Net (OpenGIS Utils for .NET) 是基于 MaxRev.Gdal.Universal 的 .NET GIS 二次开发工具库。提供统一的图层模型和便捷的格式转换功能,简化 GIS 数据的读取、处理和导出操作。
$ dotnet add package OpenGIS.UtilsOpenGIS Utils for .NET (OGU4Net) is a comprehensive GIS development toolkit for .NET based on MaxRev.Gdal.Universal. It provides a unified layer model and convenient format conversion capabilities to simplify reading, processing, and exporting GIS data.
This project is a complete port of opengis-utils-for-java to C# .NET Standard 2.0.
OguLayer, OguFeature, and OguField abstractions that hide underlying GIS library differencesdotnet add package OpenGIS.Utils
Or via NuGet Package Manager:
Install-Package OpenGIS.Utils
using OpenGIS.Utils.Engine.Model.Layer;
using OpenGIS.Utils.Engine.Enums;
// Create a new layer
var layer = new OguLayer
{
Name = "My Layer",
GeometryType = GeometryType.POINT,
Wkid = 4326
};
// Add fields
layer.AddField(new OguField
{
Name = "ID",
DataType = FieldDataType.INTEGER
});
layer.AddField(new OguField
{
Name = "Name",
DataType = FieldDataType.STRING,
Length = 50
});
// Add features
var feature = new OguFeature
{
Fid = 1,
Wkt = "POINT (116.404 39.915)"
};
feature.SetValue("ID", 1);
feature.SetValue("Name", "Beijing");
layer.AddFeature(feature);
// Validate layer
layer.Validate();
Console.WriteLine($"Layer '{layer.Name}' has {layer.GetFeatureCount()} features");
using OpenGIS.Utils.Geometry;
// WKT to GeoJSON conversion
string wkt = "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))";
string geojson = GeometryUtil.Wkt2Geojson(wkt);
// Buffer operation
string buffered = GeometryUtil.BufferWkt(wkt, 5.0);
// Spatial relationship
string point = "POINT (5 5)";
bool contains = GeometryUtil.ContainsWkt(wkt, point);
// Area and length
double area = GeometryUtil.AreaWkt(wkt);
double length = GeometryUtil.LengthWkt(wkt);
// Topology validation
var geom = GeometryUtil.Wkt2Geometry(wkt); // Returns OSGeo.OGR.Geometry
var validationResult = GeometryUtil.IsValid(geom);
if (!validationResult.IsValid)
{
Console.WriteLine($"Geometry is invalid: {validationResult.ErrorMessage}");
}
// Note: Direct GeoJSON string parsing is not supported
// Use WKT format or load GeoJSON from files using GdalReader
using OpenGIS.Utils.DataSource;
using OpenGIS.Utils.Engine.Enums;
// Read from Shapefile
var layer = OguLayerUtil.ReadLayer(
DataFormatType.SHP,
"data/cities.shp"
);
// Write to GeoJSON
OguLayerUtil.WriteLayer(
DataFormatType.GEOJSON,
layer,
"output/cities.geojson"
);
// Read with spatial filter
var filtered = OguLayerUtil.ReadLayer(
DataFormatType.SHP,
"data/cities.shp",
spatialFilterWkt: "POLYGON ((...))"
);
using OpenGIS.Utils.Engine.Util;
// Transform coordinates from WGS84 to CGCS2000
string wkt = "POINT (116.404 39.915)";
string transformed = CrsUtil.Transform(wkt, 4326, 4490);
// Get zone number from longitude
int zone = CrsUtil.GetDh(116.404); // 3-degree zone
int zone6 = CrsUtil.GetDh6(116.404); // 6-degree zone
// Get projected coordinate system WKID
int wkid = CrsUtil.GetProjectedWkid(39); // CGCS2000 3-degree zone 39
using OpenGIS.Utils.Utils;
// Encoding detection
var encoding = EncodingUtil.GetFileEncoding("data.txt");
var content = File.ReadAllText("data.txt", encoding);
// Natural sorting
var files = new[] { "file1.txt", "file10.txt", "file2.txt" };
var sorted = SortUtil.NaturalSort(files, f => f);
// Result: file1.txt, file2.txt, file10.txt
// Number formatting (avoid scientific notation)
string formatted = NumUtil.GetPlainString(0.00000123);
// ZIP compression
ZipUtil.Zip("folder/", "output.zip");
ZipUtil.Unzip("output.zip", "extracted/");
GDAL is automatically configured on first use:
using OpenGIS.Utils.Configuration;
// Get GDAL version
string version = GdalConfiguration.GetGdalVersion();
Console.WriteLine($"GDAL Version: {version}");
// Check driver availability
bool hasFileGDB = GdalConfiguration.IsDriverAvailable("FileGDB");
Console.WriteLine($"FileGDB Support: {hasFileGDB}");
// List all supported drivers
var drivers = GdalConfiguration.GetSupportedDrivers();
foreach (var driver in drivers)
{
Console.WriteLine($"- {driver}");
}
All public APIs are fully documented with XML documentation comments including:
OguLayer - Unified GIS layer with fields and featuresOguFeature - Feature with geometry (WKT) and attributesOguField - Field definition with data type and constraintsOguFieldValue - Type-safe field value container with conversion methodsGeometryUtil - Comprehensive spatial operations:
OguLayerUtil - High-level data reading/writingGdalReader / GdalWriter - GDAL-based I/O operationsShpUtil - Shapefile-specific utilities (encoding, repair)CrsUtil - Coordinate transformation and zone calculations
EncodingUtil - Automatic encoding detection (UTF-8, GBK, GB2312)ZipUtil - ZIP compression and extractionSortUtil - Natural sorting for filenames with numbersNumUtil - Number formatting without scientific notationOpenGIS.Utils/
├── Engine/
│ ├── Enums/ # Geometry types, field types, format types
│ ├── IO/ # Reader/Writer interfaces
│ ├── Model/
│ │ └── Layer/ # OguLayer, OguFeature, OguField, etc.
│ └── Util/ # CrsUtil, ShpUtil, OgrUtil, etc.
├── Exception/ # Custom exception types
├── Geometry/ # GeometryUtil for spatial operations
├── Utils/ # ZipUtil, EncodingUtil, SortUtil, NumUtil
├── DataSource/ # OguLayerUtil for unified data access
└── Configuration/ # GdalConfiguration, LibrarySettings
All public APIs include comprehensive XML documentation with:
IntelliSense in Visual Studio and other IDEs will display this documentation automatically.
Licensed under LGPL-2.1-or-later, consistent with the Java version.
Contributions are welcome! Please feel free to submit a Pull Request.
OpenGIS Utils for .NET (OGU4Net) 是基于 MaxRev.Gdal.Universal 的 .NET GIS 二次开发工具库。提供统一的图层模型和便捷的格式转换功能,简化 GIS 数据的读取、处理和导出操作。
本项目是 opengis-utils-for-java 的完整 C# .NET Standard 2.0 移植版本。
OguLayer、OguFeature、OguField 抽象,屏蔽底层 GIS 库差异dotnet add package OpenGIS.Utils
或通过 NuGet 包管理器:
Install-Package OpenGIS.Utils
using OpenGIS.Utils.Engine.Model.Layer;
using OpenGIS.Utils.Engine.Enums;
// 创建新图层
var layer = new OguLayer
{
Name = "我的图层",
GeometryType = GeometryType.POINT,
Wkid = 4326
};
// 添加字段
layer.AddField(new OguField
{
Name = "ID",
DataType = FieldDataType.INTEGER
});
layer.AddField(new OguField
{
Name = "名称",
DataType = FieldDataType.STRING,
Length = 50
});
// 添加要素
var feature = new OguFeature
{
Fid = 1,
Wkt = "POINT (116.404 39.915)"
};
feature.SetValue("ID", 1);
feature.SetValue("名称", "北京");
layer.AddFeature(feature);
// 验证图层
layer.Validate();
Console.WriteLine($"图层 '{layer.Name}' 有 {layer.GetFeatureCount()} 个要素");
using OpenGIS.Utils.Geometry;
// WKT 转 GeoJSON
string wkt = "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))";
string geojson = GeometryUtil.Wkt2Geojson(wkt);
// 缓冲区分析
string buffered = GeometryUtil.BufferWkt(wkt, 5.0);
// 空间关系判断
string point = "POINT (5 5)";
bool contains = GeometryUtil.ContainsWkt(wkt, point);
// 面积和长度
double area = GeometryUtil.AreaWkt(wkt);
double length = GeometryUtil.LengthWkt(wkt);
// 拓扑验证
var geom = GeometryUtil.Wkt2Geometry(wkt); // 返回 OSGeo.OGR.Geometry
var validationResult = GeometryUtil.IsValid(geom);
if (!validationResult.IsValid)
{
Console.WriteLine($"几何对象无效: {validationResult.ErrorMessage}");
}
// 注意:不支持直接解析 GeoJSON 字符串
// 请使用 WKT 格式或通过 GdalReader 从文件加载 GeoJSON
using OpenGIS.Utils.DataSource;
using OpenGIS.Utils.Engine.Enums;
// 从 Shapefile 读取
var layer = OguLayerUtil.ReadLayer(
DataFormatType.SHP,
"data/cities.shp"
);
// 写入到 GeoJSON
OguLayerUtil.WriteLayer(
DataFormatType.GEOJSON,
layer,
"output/cities.geojson"
);
// 使用空间过滤读取
var filtered = OguLayerUtil.ReadLayer(
DataFormatType.SHP,
"data/cities.shp",
spatialFilterWkt: "POLYGON ((...))"
);
using OpenGIS.Utils.Engine.Util;
// WGS84 转 CGCS2000
string wkt = "POINT (116.404 39.915)";
string transformed = CrsUtil.Transform(wkt, 4326, 4490);
// 根据经度获取带号
int zone = CrsUtil.GetDh(116.404); // 3度带
int zone6 = CrsUtil.GetDh6(116.404); // 6度带
// 获取投影坐标系 WKID
int wkid = CrsUtil.GetProjectedWkid(39); // CGCS2000 3度带第39带
using OpenGIS.Utils.Utils;
// 编码检测
var encoding = EncodingUtil.GetFileEncoding("data.txt");
var content = File.ReadAllText("data.txt", encoding);
// 自然排序
var files = new[] { "file1.txt", "file10.txt", "file2.txt" };
var sorted = SortUtil.NaturalSort(files, f => f);
// 结果: file1.txt, file2.txt, file10.txt
// 数字格式化(避免科学计数法)
string formatted = NumUtil.GetPlainString(0.00000123);
// ZIP 压缩
ZipUtil.Zip("folder/", "output.zip");
ZipUtil.Unzip("output.zip", "extracted/");
GDAL 在首次使用时自动配置:
using OpenGIS.Utils.Configuration;
// 获取 GDAL 版本
string version = GdalConfiguration.GetGdalVersion();
Console.WriteLine($"GDAL 版本: {version}");
// 检查驱动可用性
bool hasFileGDB = GdalConfiguration.IsDriverAvailable("FileGDB");
Console.WriteLine($"FileGDB 支持: {hasFileGDB}");
// 列出所有支持的驱动
var drivers = GdalConfiguration.GetSupportedDrivers();
foreach (var driver in drivers)
{
Console.WriteLine($"- {driver}");
}
所有公共 API 都包含完整的 XML 文档注释,包括:
OguLayer - 统一的 GIS 图层,包含字段和要素OguFeature - 要素,包含几何(WKT)和属性OguField - 字段定义,包含数据类型和约束OguFieldValue - 类型安全的字段值容器,提供转换方法GeometryUtil - 全面的空间操作:
OguLayerUtil - 高级数据读写GdalReader / GdalWriter - 基于 GDAL 的 I/O 操作ShpUtil - Shapefile 专用工具(编码、修复)CrsUtil - 坐标转换和分带计算
EncodingUtil - 自动编码检测(UTF-8、GBK、GB2312)ZipUtil - ZIP 压缩和解压SortUtil - 文件名自然排序(支持数字)NumUtil - 数字格式化(避免科学计数法)OpenGIS.Utils/
├── Engine/
│ ├── Enums/ # 几何类型、字段类型、格式类型
│ ├── IO/ # 读写器接口
│ ├── Model/
│ │ └── Layer/ # OguLayer、OguFeature、OguField 等
│ └── Util/ # CrsUtil、ShpUtil、OgrUtil 等
├── Exception/ # 自定义异常类型
├── Geometry/ # GeometryUtil 空间操作
├── Utils/ # ZipUtil、EncodingUtil、SortUtil、NumUtil
├── DataSource/ # OguLayerUtil 统一数据访问
└── Configuration/ # GdalConfiguration、LibrarySettings
所有公共 API 都包含完整的 XML 文档注释:
在 Visual Studio 和其他 IDE 中,IntelliSense 会自动显示这些文档。
采用 LGPL-2.1-or-later 许可证,与 Java 版本保持一致。
欢迎贡献!请随时提交 Pull Request。