代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using System.IO;
using System.Windows.Forms;
using Domain.VCT.FileGDB;
using Esri.FileGDB;
using Domain.Log;
using log4net;
using Domain.VCT.Geo;
namespace Domain.VCT
{
public class GDB2VCTConvertor
{
//日志
protected ILog logger = LoggerService.GetLogger();
public GDB2VCTConvertor()
{
}
/// <summary>
/// 获取gdb文件中的所有图层节点,并按照层级结构组织成树状结构
/// </summary>
/// <param name="gdbPath">gdb文件路径</param>
/// <returns></returns>
public List<LayerNode> GetLayerNodesForGDB(string gdbPath)
{
List<LayerNode> layerNodeList = null;
IWorkspaceFactory gdbWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
IFeatureWorkspace pFeatureWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IFeatureWorkspace;
IWorkspace pWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IWorkspace;
IEnumDataset pEnumDataSets = pWorkspace.get_Datasets(esriDatasetType.esriDTAny);
pEnumDataSets.Reset();
IDataset pDataSet = pEnumDataSets.Next();
if (pDataSet != null)
{
layerNodeList = new List<LayerNode>();
}
//用于输出测试
int releasI = -1;
while (pDataSet != null)
{
if (pDataSet is IFeatureDataset)
{
IFeatureDataset pFeatureDataSet = pFeatureWorkspace.OpenFeatureDataset(pDataSet.Name);
IFeatureClassContainer pFeatureclassContainer = (IFeatureClassContainer)pFeatureDataSet;
IEnumFeatureClass pEnumFeatureClass = (IEnumFeatureClass)pFeatureclassContainer.Classes;
IFeatureClass pFeatureClass = (IFeatureClass)pEnumFeatureClass.Next();
//子节点链表
List<LayerNode> childrenNodeList = new List<LayerNode>();
TreeNode[] childrenNodes = new TreeNode[5];
while (pFeatureClass != null)
{
IDataset pFeaureClassDataSet = pFeatureClass as IDataset;
LayerNode childrenNode = new LayerNode() { name = pFeaureClassDataSet.Name, aliasName = pFeatureClass.AliasName, featureType = pFeatureClass.FeatureType, shapeType = pFeatureClass.ShapeType };
childrenNodeList.Add(childrenNode);
pFeatureClass = (IFeatureClass)pEnumFeatureClass.Next();
if (pFeaureClassDataSet != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeaureClassDataSet);
Console.WriteLine("pFeaureClassDataSet {0} - {1}", "释放", releasI);
}
}
LayerNode layerNode = new LayerNode() { name = pDataSet.Name };
if (childrenNodeList.Count > 0)
{
layerNode.childrenList = childrenNodeList;
}
layerNodeList.Add(layerNode);
if (pFeatureDataSet != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureDataSet);
Console.WriteLine("pFeatureDataSet {0} - {1}", "释放", releasI);
}
if (pFeatureclassContainer != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureclassContainer);
Console.WriteLine("pFeatureclassContainer {0} - {1}", "释放", releasI);
}
if (pEnumFeatureClass != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumFeatureClass);
Console.WriteLine("pEnumFeatureClass {0} - {1}", "释放", releasI);
}
if (pFeatureClass != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureClass);
Console.WriteLine("pFeatureClass {0} - {1}", "释放", releasI);
}
}
else if (pDataSet is IFeatureClass)
{
IFeatureClass pFeature = pDataSet as IFeatureClass;
LayerNode childrenNode = new LayerNode() { name = pDataSet.Name };
layerNodeList.Add(childrenNode);
}
else if (pDataSet is ITable)
{
ITable pTable = pDataSet as ITable;
LayerNode childrenNode = new LayerNode() { name = pDataSet.Name };
layerNodeList.Add(childrenNode);
}
pDataSet = pEnumDataSets.Next();
}
//释放workspace空间,即关闭workspace
/*pFeatureWorkspace = null;
pWorkspace = null;
gdbWorkspaceFactory = null;*/
if (pDataSet != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pDataSet);
pDataSet = null;
Console.WriteLine("pDataSet {0} - {1}", "释放", releasI);
}
if (pEnumDataSets != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumDataSets);
pEnumDataSets = null;
Console.WriteLine("pEnumDataSets {0} - {1}", "释放", releasI);
}
if (pWorkspace != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspace);
pWorkspace = null;
Console.WriteLine("pWorkspace {0} - {1}", "释放", releasI);
}
if (pFeatureWorkspace != null)
{
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureWorkspace);
pFeatureWorkspace = null;
Console.WriteLine("pFeatureWorkspace {0} - {1}", "释放", releasI);
}
if (gdbWorkspaceFactory != null)
{
//关闭资源锁定
IWorkspaceFactoryLockControl ipWsFactoryLock = (IWorkspaceFactoryLockControl)gdbWorkspaceFactory;
if (ipWsFactoryLock.SchemaLockingEnabled)
{
ipWsFactoryLock.DisableSchemaLocking();
}
GC.Collect();
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(gdbWorkspaceFactory);
releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(ipWsFactoryLock);
gdbWorkspaceFactory = null;
Console.WriteLine("gdbWorkspaceFactory {0} - {1}", "释放", releasI);
}
GC.Collect();
GC.WaitForPendingFinalizers();
return layerNodeList;
}
public bool GDB2VCTConvert(string gdbPath, string vctPath)
{
bool flag = false;
Geodatabase _geodatabase;
_geodatabase = Geodatabase.Open(gdbPath);
string[] dataSetTypes = _geodatabase.DataSetTypes;
IWorkspaceFactory gdbWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
IFeatureWorkspace pFeatureWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IFeatureWorkspace;
IWorkspace pWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IWorkspace;
IEnumDataset pEnumDataSets = pWorkspace.get_Datasets(esriDatasetType.esriDTAny);
pEnumDataSets.Reset();
//采用系统默认编码方式
/*
* FileMode.Create直接创建新的文件
* FileMode.Append追加
* FileMode.OpenOrCreate如果文件存在则打开,写的覆盖文件,如果写入文件没有原来文件长,则没有覆盖的部分仍旧存在。
*/
FileStream fWriter = new FileStream(vctPath, FileMode.Create, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fWriter, Encoding.Default);
VCT vct = new VCT();
Header header = vct.mHeader;
header.DataMark = "CNSDTF-VCT";
/*
当前版本
*/
header.Version = "GB/T 17798-2007";
/*
* C表示笛卡尔坐标系
* D表示大地坐标系
* P表示投影坐标系
* 缺省为C
*/
header.CoordinateSystemType = "C";
header.Dim = 2;
/*
* M表示米
* D表示经纬度
*/
header.XYUnit = "M";
header.Topo = 0;
header.MinX = 79.238;
header.MinY = 27.608;
header.MaxX = 89.070;
header.MaxY = 36.583;
header.Separator = ',';
vct.mHeader.write(streamWriter, vct.mHeader.Separator);
//vct.mFeatureTypes = new FeatureTypes(new PartTag { BeginTag = "FeatureCodeBegin", EndTag = "FeatureCodeEnd" });
//输出要素类型
vct.mFeatureTypes.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
pEnumDataSets.Reset();
//输出属性表结构
vct.mTableStructurePart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
IDataset pDataSet = pEnumDataSets.Next();
//输出几何要素
vct.mGeometryPart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
//输出注记
vct.mAnnotationPart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
//输出属性表
vct.mAttributePart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
/*if (pDataSet is IFeatureDataset) {
IFeatureDataset pFeatureDataSet = pFeatureWorkspace.OpenFeatureDataset(pDataSet.Name);
IFeatureClassContainer pFeatureclassContainer = (IFeatureClassContainer)pFeatureDataSet;
IEnumFeatureClass pEnumFeatureClass = (IEnumFeatureClass)pFeatureclassContainer.Classes;
IFeatureClass pFeatureClass = (IFeatureClass)pEnumFeatureClass.Next();
while (pFeatureClass != null)//在每一个数据集中遍历数据层IFeatureClass
{
IFields pFields = pFeatureClass.Fields;
int count=pFields.FieldCount;
IField pfield = pFields.get_Field(0);
string fName = pfield.Name;
int fLength=pfield.Length;
//esriFeatureType type = pfield.Type;
WriteFeatureClass(pFeatureClass);
}
int i = 0;
}
else if (pDataSet is ITable)
{
}
else if (pDataSet is IFeatureClass) {
}*/
streamWriter.Close();
fWriter.Close();
return flag;
}
/// <summary>
/// 将gdb中指定的图层转换至vct文件中
/// </summary>
/// <param name="gdbPath">gdb文件路径</param>
/// <param name="vctPath">转出的vct文件路径</param>
/// <param name="LayerlayerPaths">gdb中要转出的图层路径,如"\\Dataset\\PDT"</param>
/// <returns></returns>
public bool GDB2VCTConvert(string gdbPath, string vctPath, IList<string> LayerlayerPaths)
{
bool flag = false;
//采用系统默认编码方式
/*
* FileMode.Create直接创建新的文件
* FileMode.Append追加
* FileMode.OpenOrCreate如果文件存在则打开,写的覆盖文件,如果写入文件没有原来文件长,则没有覆盖的部分仍旧存在。
*/
FileStream fWriter = new FileStream(vctPath, FileMode.Create, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fWriter, Encoding.Default);
FileGDB_VCT vct = new FileGDB_VCT();
logger.Info("开始转换GDB到VCT");
logger.InfoFormat("-----------------------------------------------------");
Header header = vct.mHeader;
header.DataMark = "CNSDTF-VCT";
/*
当前版本
*/
header.Version = "GB/T 17798-2007";
/*
* C表示笛卡尔坐标系
* D表示大地坐标系
* P表示投影坐标系
* 缺省为C
*/
header.CoordinateSystemType = "C";
header.Dim = 2;
/*
* M表示米
* D表示经纬度
*/
header.XYUnit = "M";
header.Topo = 0;
header.Separator = ',';
//vct.mFeatureTypes = new FeatureTypes(new PartTag { BeginTag = "FeatureCodeBegin", EndTag = "FeatureCodeEnd" });
Geodatabase _geodatabase = null;
try
{
_geodatabase = Geodatabase.Open(gdbPath);
FileGDBTableHelper fGDBTableHelper = new FileGDBTableHelper();
List<Esri.FileGDB.Table> tableList = new List<Esri.FileGDB.Table>();
//元数据几何
List<TableMeta> tableMetaList = new List<TableMeta>();
List<TableInfo> tableInfoList = new List<TableInfo>();
VExtent totalExtent = new VExtent();
totalExtent.XMin = float.MaxValue;
totalExtent.YMin = float.MaxValue;
totalExtent.XMax = float.MinValue;
totalExtent.YMax = float.MinValue;
foreach (string layerPath in LayerlayerPaths)
{
// Open the Polygon test table, states.
Esri.FileGDB.Table mTable = _geodatabase.OpenTable(layerPath);
TableMeta tMeta = fGDBTableHelper.GetTableMeataFromMetaDefinition(mTable.Definition);
tableList.Add(mTable);
tableMetaList.Add(tMeta);
//数据表与其元数据组成的对象,用于文件记录输出
TableInfo tableInfo = new TableInfo() { mTable = mTable, mTableMeta = tMeta };
tableInfoList.Add(tableInfo);
//头文件赋值
totalExtent = totalExtent.ExtentMerge(tMeta.Extent);
header.CoordinateSystemType = tMeta.CoordinateSystem.CoordinateSystemType;
header.Spheroid = tMeta.CoordinateSystem.Ellipsoid.Spheroid;
header.Projection = tMeta.CoordinateSystem.Projection == null ? "" : tMeta.CoordinateSystem.Projection.Name;
header.MapScale = tMeta.CoordinateSystem.MapScale;
/*
* M表示米
* D表示经纬度
*/
header.XYUnit = tMeta.CoordinateSystem.Projection == null ? "D" : "M";
}
header.MinX = totalExtent.XMin;
header.MinY = totalExtent.YMin;
header.MaxX = totalExtent.XMax;
header.MaxY = totalExtent.YMax;
//输出文件头
vct.mHeader.write(streamWriter, vct.mHeader.Separator);
//输出要素类型
vct.mGenerallFeatureTypePart.write(streamWriter, tableMetaList, header.Separator);
//输出属性表结构
vct.mGenerallTableStructurePart.write(streamWriter, tableMetaList, header.Separator);
//输出几何要素
vct.mFileGDBGeometryPart.write(streamWriter, tableInfoList, header.Separator);
//输出注记
vct.mGenerallAnnotationPart.write(streamWriter, tableInfoList, header.Separator);
//输出属性表
vct.mGenerallAttributePart.write(streamWriter, tableInfoList, header.Separator);
/*
* 输出图形表现数据
* vct.mGenerallAnnotationPart.mAnnotationList为在输出annotation时读取到的注记信息
*
* 没有写日志
*/
vct.mGenerallRepresentationPart.write(streamWriter, vct.mGenerallAnnotationPart.mAnnotationList, header.Separator);
}
catch (FileGDBException ex)
{
Console.WriteLine("GDB2VCTConvert failed {0} - {1}", ex.Message, ex.ErrorCode);
this.logger.Error(ex.Message.ToString());
}
catch (Exception ex)
{
Console.WriteLine("GDB2VCTConvert failed General exception. " + ex.Message);
this.logger.Error(ex.Message.ToString());
}
finally
{
if (_geodatabase != null)
{
_geodatabase.Close();
}
}
streamWriter.Close();
fWriter.Close();
this.logger.Info("转换GDB到VCT结束");
this.logger.InfoFormat("-----------------------------------------------------");
return flag;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
private bool Table2VCT()
{
bool flag = false;
try
{
}
catch (FileGDBException ex)
{
Console.WriteLine("PolygonGeomTest failed {0} - {1}", ex.Message, ex.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("PolygonGeomTest failed General exception. " + ex.Message);
}
return flag;
}
public bool WriteFeatureClass(IFeatureClass myFeatureClass)
{
bool flag = false;
FeatureType fType = new FeatureType();
//获取几何要素类型
string strFeatureType = "";
switch (myFeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
strFeatureType = "Point";
break;
case esriGeometryType.esriGeometryLine:
strFeatureType = "Line";
break;
case esriGeometryType.esriGeometryPolygon:
strFeatureType = "Polygon";
break;
}
fType.mGeomtryType = strFeatureType;
//fType.mTypeName=myFeatureClass.
IFeatureCursor pFeatCursor = myFeatureClass.Search(null, false);
IFeature pFeature = pFeatCursor.NextFeature();
while (pFeature != null)
{
IGeometry pGeo;
pGeo = pFeature.Shape;
pFeature.get_Value(0);
//pFeat.Fields.get_Field(0).Type;
//esriFieldType.
pFeature.get_Value(0);
if (pGeo is IPolyline)
{
IPolyline pline = pGeo as IPolyline;
}
if (pGeo is IPoint)
{
IPoint pLabelPoint = pGeo as IPoint;
}
if (pGeo is IPolygon)
{
IPolygon pPolygon = pGeo as IPolygon;
}
pFeature = pFeatCursor.NextFeature();
}
//fType.mGeomtryType = pFeatureClass.FeatureType;
return flag;
}
}
}