.NET C# 使用GDAL读取FileGDB要素类
目录
- .NET C# 使用GDAL读取FileGDB要素类
- 1 环境
- 2 Nuget
- 3 Code
1 环境
VisualStudio2022 + .NET6 + GDAL 3.7.5
2 Nuget
3 Code
using OSGeo.OGR;
using OSGeo.OSR;
namespace TestGDAL
{
internal class Program
{
static void Main(string[] args)
{
string strDataPath = @".\Data\Default.gdb";
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
// 打开 FileGDB
using (var driver = Ogr.GetDriverByName("OpenFileGDB"))
using (var dataSource = driver.Open(strDataPath, 0))
{
if (dataSource == null)
{
Console.WriteLine("Failed to open FileGDB.");
return;
}
List<Layer> layers = new List<Layer>();
int layerCount = dataSource.GetLayerCount();
for (int i = 0; i < layerCount; i++)
{
// 读取要素类
Layer layer = dataSource.GetLayerByIndex(i);
layers.Add(layer);
}
Console.WriteLine("GDB Layers: ");
foreach (var layer in layers)
{
string layerName = layer.GetName();
// 要素类集合类型
wkbGeometryType wkbGeometryType = layer.GetGeomType();
// 空间引用(坐标系)
SpatialReference spatialReference = layer.GetSpatialRef();
Console.WriteLine($"LayerName: {layerName}\tGeometryType: {wkbGeometryType}\tSpatialReference: {spatialReference.GetName()}");
}
Console.WriteLine();
Console.WriteLine("Geometry: ");
foreach (var layer in layers)
{
Console.WriteLine(layer.GetName());
Console.WriteLine("Geometry Wkt");
// 将读指针设置初始位置
layer.ResetReading();
Feature feature;
while ((feature = layer.GetNextFeature()) != null)
{
try
{
// 几何图形
Geometry geometry = feature.GetGeometryRef();
int v = geometry.ExportToWkt(out string wkt);
Console.WriteLine(wkt);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
feature.Dispose();
}
}
}
Console.WriteLine();
Console.WriteLine("Attribute Table: ");
foreach (var layer in layers)
{
Console.WriteLine(layer.GetName());
FeatureDefn featureDefn = layer.GetLayerDefn();
List<FieldDefn> fieldDefns = new List<FieldDefn>();
int fieldCount = featureDefn.GetFieldCount();
for (int i = 0; i < fieldCount; i++)
{
// 获取字段
FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
fieldDefns.Add(fieldDefn);
}
Console.WriteLine(string.Join(",", fieldDefns.Select(f => f.GetName())));
layer.ResetReading();
Feature feature;
while ((feature = layer.GetNextFeature()) != null)
{
try
{
List<string> values = new List<string>();
for (int i = 0; i < fieldDefns.Count; i++)
{
FieldDefn fieldDefn = fieldDefns[i];
string fieldName = fieldDefn.GetName();
// 字段类型
FieldType fieldType = fieldDefn.GetFieldType();
// 获取字段值
switch (fieldType)
{
case FieldType.OFTInteger:
int valInt = feature.GetFieldAsInteger(fieldName);
values.Add(valInt + "");
break;
case FieldType.OFTString:
string valStr = feature.GetFieldAsString(fieldName);
values.Add(valStr);
break;
case FieldType.OFTWideString:
string valWidStr = feature.GetFieldAsString(fieldName);
values.Add(valWidStr);
break;
case FieldType.OFTDate:
feature.GetFieldAsDateTime(
fieldName,
out int dyear,
out int dmonth,
out int dday,
out int dhour,
out int dminute,
out float dsecond,
out int dtzFlag);
DateTime valDate = new DateTime(dyear, dmonth, dday, dhour, dminute, Convert.ToInt32(dsecond));
values.Add(valDate.ToString());
break;
case FieldType.OFTTime:
feature.GetFieldAsDateTime(
fieldName,
out int tyear,
out int tmonth,
out int tday,
out int thour,
out int tminute,
out float tsecond,
out int ttzFlag);
DateTime valTime = new DateTime(tyear, tmonth, tday, thour, tminute, Convert.ToInt32(tsecond));
values.Add(valTime.ToString());
break;
case FieldType.OFTDateTime:
feature.GetFieldAsDateTime(
fieldName,
out int dtyear,
out int dtmonth,
out int dtday,
out int dthour,
out int dtminute,
out float dtsecond,
out int dttzFlag);
DateTime valDateTime = new DateTime(dtyear, dtmonth, dtday, dthour, dtminute, Convert.ToInt32(dtsecond));
values.Add(valDateTime.ToString());
break;
case FieldType.OFTInteger64:
long valLon = feature.GetFieldAsInteger64(fieldName);
values.Add(valLon + "");
break;
default:
break;
}
}
Console.WriteLine(string.Join(",", values));
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
feature.Dispose();
}
}
}
}
}
}
}