You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
849 lines
31 KiB
849 lines
31 KiB
using ESRI.ArcGIS.Geodatabase; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using ESRI.ArcGIS.esriSystem; |
|
using System.Runtime.InteropServices; |
|
using ESRI.ArcGIS.DataSourcesGDB; |
|
using ESRI.ArcGIS.Geometry; |
|
using ESRI.ArcGIS.DataSourcesFile; |
|
|
|
namespace Kingo.RuleCheck.AEHelper |
|
{ |
|
public class WorkspaceAPI : IWorkspaceAPI |
|
{ |
|
private string StrConn; |
|
public IWorkspaceFactory2 wsFactory { get; private set; } |
|
private WorkspaceTypeEnum _workSpaceType; |
|
public WorkspaceTypeEnum workSpaceType |
|
{ |
|
get |
|
{ |
|
return this._workSpaceType; |
|
} |
|
set |
|
{ |
|
this._workSpaceType = value; |
|
} |
|
} |
|
/// <summary> |
|
/// 连接属性 |
|
/// </summary> |
|
private IPropertySet propertySet |
|
{ |
|
get |
|
{ |
|
if (!string.IsNullOrWhiteSpace(this.StrConn)) |
|
{ |
|
IPropertySet result = new PropertySetClass(); |
|
if (_workSpaceType == WorkspaceTypeEnum.SDEConn) |
|
{ |
|
Dictionary<string, string> dicConn = GetConn(this.StrConn); |
|
foreach (string key in dicConn.Keys) |
|
{ |
|
result.SetProperty(key, dicConn[key]); |
|
} |
|
} |
|
else if (_workSpaceType == WorkspaceTypeEnum.SDEFile) |
|
{ |
|
result = wsFactory.ReadConnectionPropertiesFromFile(this.StrConn); |
|
} |
|
else |
|
{ |
|
result.SetProperty("DATABASE", this.StrConn); |
|
} |
|
return result; |
|
} |
|
return null; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 解析连接字符串 |
|
/// </summary> |
|
/// <param name="pStrConn"></param> |
|
/// <returns></returns> |
|
private Dictionary<string, string> GetConn(string pStrConn) |
|
{ |
|
Dictionary<string, string> result = new Dictionary<string, string>(); |
|
try |
|
{ |
|
string[] arr = pStrConn.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); |
|
foreach (string item in arr) |
|
{ |
|
string[] kv = item.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); |
|
result.Add(kv[0], kv[1]); |
|
} |
|
return result; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 构造函数 |
|
/// </summary> |
|
public WorkspaceAPI(string pStrConnection, WorkspaceTypeEnum pWorkspaceType) |
|
{ |
|
try |
|
{ |
|
if (pWorkspaceType == WorkspaceTypeEnum.MDBFile) |
|
{ |
|
if (!System.IO.File.Exists(pStrConnection)) |
|
{ |
|
return; |
|
} |
|
} |
|
else if (pWorkspaceType == WorkspaceTypeEnum.GDBFile) |
|
{ |
|
if (!System.IO.Directory.Exists(pStrConnection)) |
|
{ |
|
return; |
|
} |
|
} |
|
if (string.IsNullOrWhiteSpace(pStrConnection) || pWorkspaceType == WorkspaceTypeEnum.Default) |
|
return; |
|
this.StrConn = pStrConnection; |
|
this.workSpaceType = pWorkspaceType; |
|
this.wsFactory = WorkspaceFactory.GetWorkspaceFactory(pWorkspaceType); |
|
if (wsFactory != null && !string.IsNullOrWhiteSpace(this.StrConn)) |
|
{ |
|
//if (this._CurrentWorkspace != null) |
|
//{ |
|
// while (Marshal.ReleaseComObject(this._CurrentWorkspace) > 0) { } |
|
//} |
|
_CurrentWorkspace = wsFactory.Open(propertySet, 0); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw new Exception("打开工作空间失败!" + ex.Message); |
|
} |
|
} |
|
|
|
public WorkspaceAPI(IWorkspace pWorkspace) |
|
{ |
|
_CurrentWorkspace = pWorkspace; |
|
} |
|
|
|
public WorkspaceAPI() |
|
{ |
|
|
|
} |
|
/// <summary> |
|
/// 获取当前工作空间中指定类型的所有要素类名称 |
|
/// </summary> |
|
/// <param name="pDatasetType"></param> |
|
/// <returns></returns> |
|
public Dictionary<string, string> GetFeatureClassName(esriDatasetType pDatasetType) |
|
{ |
|
Dictionary<string, string> result = new Dictionary<string, string>(); |
|
IEnumDataset pEnumDataset = _CurrentWorkspace.Datasets[pDatasetType]; |
|
if (pEnumDataset == null) |
|
return result; |
|
pEnumDataset.Reset(); |
|
IDataset pDataset = pEnumDataset.Next(); |
|
if (pDataset == null) |
|
{ |
|
switch (pDatasetType) |
|
{ |
|
case esriDatasetType.esriDTFeatureDataset: |
|
pEnumDataset = _CurrentWorkspace.Datasets[esriDatasetType.esriDTFeatureClass]; |
|
if (pEnumDataset == null) |
|
{ |
|
return result; |
|
} |
|
pEnumDataset.Reset(); |
|
pDataset = pEnumDataset.Next(); |
|
break; |
|
case esriDatasetType.esriDTFeatureClass: |
|
pEnumDataset = _CurrentWorkspace.Datasets[esriDatasetType.esriDTFeatureDataset]; |
|
if (pEnumDataset == null) |
|
{ |
|
return result; |
|
} |
|
pEnumDataset.Reset(); |
|
pDataset = pEnumDataset.Next(); |
|
break; |
|
} |
|
} |
|
//如果数据集是IFeatureDataset,则遍历它下面的子类 |
|
while (pDataset != null) |
|
{ |
|
if (pDatasetType != esriDatasetType.esriDTFeatureDataset) |
|
{ |
|
IFeatureClass pFc = pDataset as IFeatureClass; |
|
string key = pFc == null ? pDataset.BrowseName : pFc.AliasName; |
|
if (!result.Keys.Contains(key)) |
|
result.Add(key, string.IsNullOrWhiteSpace(pDataset.BrowseName) ? pDataset.Name : pDataset.BrowseName); |
|
} |
|
IEnumDataset ed = pDataset.Subsets; |
|
if (ed != null) |
|
{ |
|
IDataset ds = ed.Next(); |
|
while (ds != null) |
|
{ |
|
IFeatureClass fc = ds as IFeatureClass; |
|
if (fc != null) |
|
{ |
|
string key = fc == null ? ds.BrowseName : fc.AliasName; |
|
if (!result.Keys.Contains(key)) |
|
result.Add(key, string.IsNullOrWhiteSpace(ds.BrowseName) ? ds.Name : ds.BrowseName); |
|
} |
|
ds = ed.Next(); |
|
} |
|
} |
|
|
|
pDataset = pEnumDataset.Next(); |
|
} |
|
return result; |
|
} |
|
|
|
/// <summary> |
|
/// 获取当前工作空间中存在的对象(要素集和要素类) |
|
/// </summary> |
|
/// <param name="pDatasetType"></param> |
|
/// <returns></returns> |
|
public Dictionary<string, string> GetDataSetAndFeatureClassName(esriDatasetType pDatasetType) |
|
{ |
|
Dictionary<string, string> result = new Dictionary<string, string>(); |
|
IEnumDataset pEnumDataset = _CurrentWorkspace.Datasets[pDatasetType]; |
|
if (pEnumDataset == null) |
|
return result; |
|
pEnumDataset.Reset(); |
|
IDataset pDataset = pEnumDataset.Next(); |
|
//如果数据集是IFeatureDataset,则遍历它下面的子类 |
|
while (pDataset != null) |
|
{ |
|
if (pDatasetType != esriDatasetType.esriDTFeatureDataset) |
|
{ |
|
IFeatureClass pFc = pDataset as IFeatureClass; |
|
result.Add(pFc == null ? pDataset.BrowseName : pFc.AliasName, string.IsNullOrWhiteSpace(pDataset.BrowseName) ? pDataset.Name : pDataset.BrowseName); |
|
} |
|
result.Add(pDataset.BrowseName, pDataset.BrowseName); |
|
pDataset = pEnumDataset.Next(); |
|
} |
|
return result; |
|
} |
|
|
|
/// <summary> |
|
/// 获取当前工作空间中存在的属性表 |
|
/// </summary> |
|
/// <param name="pDatasetType"></param> |
|
/// <returns></returns> |
|
public Dictionary<string, string> GetPropertyTable(esriDatasetType pDatasetType) |
|
{ |
|
Dictionary<string, string> result = new Dictionary<string, string>(); |
|
IEnumDataset pEnumDataset = _CurrentWorkspace.Datasets[pDatasetType]; |
|
if (pEnumDataset == null) |
|
return result; |
|
pEnumDataset.Reset(); |
|
IDataset pDataset = null; |
|
//如果数据集是IFeatureDataset,则遍历它下面的子类 |
|
while ((pDataset = pEnumDataset.Next()) != null) |
|
{ |
|
if (pDatasetType != esriDatasetType.esriDTTable) |
|
{ |
|
continue; |
|
} |
|
result.Add(pDataset.BrowseName, pDataset.BrowseName); |
|
} |
|
return result; |
|
} |
|
|
|
/// <summary> |
|
/// 获取当前工作空间中指定类型的所有要素类 |
|
/// </summary> |
|
/// <param name="pDatasetType"></param> |
|
/// <returns></returns> |
|
public List<IFeatureClass> GetAllFeatureClass(esriDatasetType pDatasetType) |
|
{ |
|
List<IFeatureClass> result = new List<IFeatureClass>(); |
|
IEnumDataset pEnumDataset = _CurrentWorkspace.Datasets[pDatasetType]; |
|
if (pEnumDataset == null) |
|
return result; |
|
pEnumDataset.Reset(); |
|
IDataset pDataset = pEnumDataset.Next(); |
|
//如果数据集是IFeatureDataset,则遍历它下面的子类 |
|
while (pDataset != null) |
|
{ |
|
if (pDatasetType != esriDatasetType.esriDTFeatureDataset) |
|
{ |
|
IFeatureClass fc = pDataset as IFeatureClass; |
|
if (fc != null) |
|
result.Add(fc); |
|
} |
|
IEnumDataset ed = pDataset.Subsets; |
|
if (ed != null) |
|
{ |
|
IDataset ds = ed.Next(); |
|
while (ds != null) |
|
{ |
|
IFeatureClass fc = ds as IFeatureClass; |
|
if (fc != null) |
|
result.Add(fc); |
|
ds = ed.Next(); |
|
} |
|
} |
|
|
|
pDataset = pEnumDataset.Next(); |
|
} |
|
return result; |
|
} |
|
|
|
private IWorkspace _CurrentWorkspace; |
|
/// <summary> |
|
/// 当前工作空间对象 |
|
/// </summary> |
|
public IWorkspace CurrentWorkspace |
|
{ |
|
get |
|
{ |
|
return _CurrentWorkspace; |
|
} |
|
} |
|
|
|
///// <summary> |
|
///// 打开工作空间 |
|
///// </summary> |
|
//public IWorkspace OpenWorkspace(string pStrConnection, WorkspaceTypeEnum pWorkspaceType) |
|
//{ |
|
|
|
//} |
|
|
|
|
|
///// <summary> |
|
///// 打开工作空间 |
|
///// </summary> |
|
//public IWorkspace OpenWorkspace(IWorkspace pWorkspace) |
|
//{ |
|
// _CurrentWorkspace = pWorkspace; |
|
// return _CurrentWorkspace; |
|
//} |
|
|
|
/// <summary> |
|
/// 打开要素类 |
|
/// </summary> |
|
/// <param name="pFeatureClassName">要素类名称</param> |
|
/// <returns></returns> |
|
public IFeatureClassAPI OpenFeatureClass(string pFeatureClassName) |
|
{ |
|
try |
|
{ |
|
if (CurrentWorkspace != null) |
|
{ |
|
return new FeatureClassAPI((CurrentWorkspace as IFeatureWorkspace).OpenFeatureClass(pFeatureClassName)); |
|
} |
|
else |
|
{ |
|
throw new Exception("打开要素类前,必须先打开对应的工作空间!"); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 打开要素类,如果没有则返回null |
|
/// </summary> |
|
/// <param name="pFeatureClassName">要素类名称</param> |
|
/// <returns></returns> |
|
public IFeatureClassAPI OpenFeatureClass2(string pFeatureClassName) |
|
{ |
|
try |
|
{ |
|
if (CurrentWorkspace != null) |
|
{ |
|
return new FeatureClassAPI((CurrentWorkspace as IFeatureWorkspace).OpenFeatureClass(pFeatureClassName)); |
|
} |
|
else |
|
{ |
|
throw new Exception("打开要素类前,必须先打开对应的工作空间!"); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 打开要素类 |
|
/// </summary> |
|
/// <param name="pFeatureClassName">要素类名称</param> |
|
/// <returns></returns> |
|
public ITableAPI OpenTable(string pTableName) |
|
{ |
|
try |
|
{ |
|
if (CurrentWorkspace != null) |
|
{ |
|
return new TableAPI((CurrentWorkspace as IFeatureWorkspace).OpenTable(pTableName)); |
|
} |
|
else |
|
{ |
|
throw new Exception("打开表前,必须先打开对应的工作空间!"); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 关闭/释放工作空间 |
|
/// </summary> |
|
/// <param name="compactAccess">关闭工作空间时是否压缩数据库,默认压缩</param> |
|
/// <returns></returns> |
|
public bool CloseWorkspace(bool compactAccess = true) |
|
{ |
|
try |
|
{ |
|
if (this._CurrentWorkspace != null) |
|
{ |
|
//EngineEditorClass engineEditorClass = new EngineEditorClass(); |
|
//if (compactAccess && engineEditorClass.EditState == esriEngineEditState.esriEngineStateNotEditing) |
|
//{ |
|
// GeoDBAPI.CompactAccessDataBaseByWorkspace(this._CurrentWorkspace); |
|
//} |
|
//while (Marshal.ReleaseComObject(this._CurrentWorkspace) > 0) { } |
|
Marshal.ReleaseComObject(this._CurrentWorkspace); |
|
} |
|
if (this.wsFactory != null) |
|
{ |
|
Marshal.ReleaseComObject(this.wsFactory); |
|
} |
|
return true; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 创建本地工作空间 |
|
/// </summary> |
|
/// <param name="pPath"></param> |
|
/// <returns></returns> |
|
public IWorkspace CreateLocalWorkspace(string pPath) |
|
{ |
|
string gdbExtention = System.IO.Path.GetExtension(pPath).ToLower(); |
|
switch (gdbExtention) |
|
{ |
|
case ".gdb": |
|
_CurrentWorkspace = CreateWorkspace<FileGDBWorkspaceFactoryClass>(pPath); |
|
return _CurrentWorkspace; |
|
case ".mdb": |
|
_CurrentWorkspace = CreateWorkspace<AccessWorkspaceFactoryClass>(pPath); |
|
return _CurrentWorkspace; |
|
default: |
|
return null; |
|
} |
|
//ESRI.ArcGIS.ConversionTools |
|
} |
|
|
|
/// <summary> |
|
/// 创建本地工作空间 |
|
/// </summary> |
|
/// <typeparam name="T">工作空间类型</typeparam> |
|
/// <param name="pPath">路径</param> |
|
/// <returns>IWorkspace</returns> |
|
public IWorkspace CreateWorkspace<T>(string pPath) where T : IWorkspaceFactory, new() |
|
{ |
|
if (string.IsNullOrEmpty(pPath)) |
|
{ |
|
return null; |
|
} |
|
try |
|
{ |
|
string sDirName = System.IO.Path.GetDirectoryName(pPath); |
|
string sFileName = System.IO.Path.GetFileName(pPath); |
|
|
|
IWorkspaceName pWorkspaceName = new T().Create(sDirName, sFileName, null, 0); |
|
if (pWorkspaceName == null) |
|
{ |
|
return null; |
|
} |
|
return (pWorkspaceName as IName).Open() as IWorkspace; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 通过路径获取IWorkspace |
|
/// </summary> |
|
/// <typeparam name="T"></typeparam> |
|
/// <param name="sFilePath"></param> |
|
/// <returns></returns> |
|
public IWorkspace GetWorkspace<T>(string sFilePath) where T : ESRI.ArcGIS.Geodatabase.IWorkspaceFactory, new() |
|
{ |
|
if (string.IsNullOrEmpty(sFilePath)) |
|
{ |
|
return null; |
|
} |
|
try |
|
{ |
|
ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pWksFact = new T(); |
|
return pWksFact.OpenFromFile(sFilePath, 0); |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 根据路径获得IWorkspace |
|
/// </summary> |
|
/// <param name="sFilePath"></param> |
|
/// <returns></returns> |
|
public IWorkspace GetWorkspaceByPath(string sFilePath) |
|
{ |
|
string gdbExtention = System.IO.Path.GetExtension(sFilePath).ToLower(); |
|
switch (gdbExtention) |
|
{ |
|
case ".gdb": |
|
return GetWorkspace<FileGDBWorkspaceFactoryClass>(sFilePath); |
|
case ".mdb": |
|
return GetWorkspace<AccessWorkspaceFactoryClass>(sFilePath); |
|
default: |
|
return null; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 删除本地工作空间 |
|
/// </summary> |
|
/// <param name="pPath">本地工作空间路径</param> |
|
public bool DeleteLocalWorkspace(string pPath) |
|
{ |
|
try |
|
{ |
|
IWorkspace pWks = null; |
|
if (_CurrentWorkspace != null) |
|
pWks = _CurrentWorkspace; |
|
else |
|
pWks = GetWorkspaceByPath(pPath); |
|
if (pWks == null) |
|
{ |
|
return true; |
|
} |
|
(pWks as IDataset).Delete(); |
|
|
|
return true; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 在指定数据集中创建要素类 |
|
/// </summary> |
|
/// <param name="pFeatureClassName">要素类名称</param> |
|
/// <param name="pFields">字段集合</param> |
|
/// <param name="pFeatureDataSet">要素数据集</param> |
|
public IFeatureClassAPI CreateFeatureClass(string pFeatureClassName, IFeatureDataset pFeatureDataset, ISpatialReference pSpatialReference, esriGeometryType esriGeoType = esriGeometryType.esriGeometryPolygon, IFields pFields = null) |
|
{ |
|
try |
|
{ |
|
if (string.IsNullOrEmpty(pFeatureClassName) || pFeatureDataset == null || pSpatialReference == null) |
|
{ |
|
return null; |
|
} |
|
if (pFields == null) |
|
{ |
|
pFields = new FieldsClass(); |
|
CreateMainField(pFields as IFieldsEdit, esriGeoType, pSpatialReference); |
|
} |
|
IFeatureClass fc = pFeatureDataset.CreateFeatureClass( |
|
pFeatureClassName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); |
|
return new FeatureClassAPI(fc); |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 在当前工作空间中创建要素类 |
|
/// </summary> |
|
/// <param name="pFeatureClassName">要素类名称</param> |
|
/// <param name="pFields">字段集合</param> |
|
public IFeatureClassAPI CreateFeatureClass(string pFeatureClassName, ISpatialReference pSpatialReference, IFields pFields) |
|
{ |
|
try |
|
{ |
|
if (string.IsNullOrEmpty(pFeatureClassName) || pSpatialReference == null) |
|
{ |
|
return null; |
|
} |
|
if (pFields == null) |
|
{ |
|
pFields = new FieldsClass(); |
|
CreateMainField(pFields as IFieldsEdit, esriGeometryType.esriGeometryPolygon, pSpatialReference); |
|
} |
|
IFeatureWorkspace featureWS = this.CurrentWorkspace as IFeatureWorkspace; |
|
if (featureWS != null) |
|
{ |
|
IFeatureClass fc = featureWS.CreateFeatureClass(pFeatureClassName, pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""); |
|
return new FeatureClassAPI(fc); |
|
} |
|
return null; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
/// <summary> |
|
/// 在当前工作空间中创建要素类 |
|
/// </summary> |
|
/// <param name="pFeatureClassName">要素类名称</param> |
|
/// <param name="pFields">字段集合</param> |
|
public IFeatureClassAPI CreateFeatureClass(string pFeatureClassName, ISpatialReference pSpatialReference, esriGeometryType pGeometryType) |
|
{ |
|
try |
|
{ |
|
if (string.IsNullOrEmpty(pFeatureClassName) || pSpatialReference == null) |
|
{ |
|
return null; |
|
} |
|
IFields pFields = new FieldsClass(); |
|
CreateMainField(pFields as IFieldsEdit, pGeometryType, pSpatialReference); |
|
IFeatureWorkspace featureWS = this.CurrentWorkspace as IFeatureWorkspace; |
|
if (featureWS != null) |
|
{ |
|
IFeatureClass fc = featureWS.CreateFeatureClass(pFeatureClassName, pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""); |
|
return new FeatureClassAPI(fc); |
|
} |
|
return null; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 在当前工作空间中创建表 |
|
/// </summary> |
|
/// <param name="pTableName">表名</param> |
|
/// <param name="pFields">字段集合</param> |
|
public ITableAPI CreateTable(string pTableName, IFields pFields) |
|
{ |
|
try |
|
{ |
|
if (string.IsNullOrEmpty(pTableName)) |
|
{ |
|
return null; |
|
} |
|
IFeatureWorkspace featureWS = this.CurrentWorkspace as IFeatureWorkspace; |
|
if (featureWS != null) |
|
{ |
|
ITable tb = featureWS.CreateTable(pTableName, pFields, null, null, ""); |
|
return new TableAPI(tb); |
|
} |
|
return null; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 删除指定要素类 |
|
/// </summary> |
|
/// <param name="featureClassName"></param> |
|
/// <returns></returns> |
|
public bool DeleteFeatureClass(string featureClassName) |
|
{ |
|
if (this.CurrentWorkspace == null || string.IsNullOrEmpty(featureClassName)) |
|
{ |
|
return false; |
|
} |
|
IEnumDatasetName pEnumDatasetName; |
|
IFeatureWorkspace pFeaWorkspace; |
|
IDatasetName pDatasetName; |
|
try |
|
{ |
|
pFeaWorkspace = CurrentWorkspace as IFeatureWorkspace; |
|
pEnumDatasetName = CurrentWorkspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass ^ esriDatasetType.esriDTFeatureDataset); |
|
pEnumDatasetName.Reset(); |
|
pDatasetName = pEnumDatasetName.Next(); |
|
while (pDatasetName != null) |
|
{ |
|
if (pDatasetName.Type == esriDatasetType.esriDTFeatureDataset) |
|
{ |
|
//如果是要素集,则对要素集内的要素类进行查找 |
|
IEnumDatasetName pEnumFcName = (pDatasetName as IFeatureDatasetName).FeatureClassNames; |
|
IDatasetName pFcName = pEnumFcName.Next(); |
|
while (pFcName != null) |
|
{ |
|
if (pFcName.Name.Equals(featureClassName, StringComparison.CurrentCultureIgnoreCase)) |
|
{ |
|
DeleteByName(pFeaWorkspace, pFcName); |
|
break; |
|
} |
|
pFcName = pEnumFcName.Next(); |
|
} |
|
} |
|
else |
|
{ |
|
if (pDatasetName.Name.Equals(featureClassName, StringComparison.CurrentCultureIgnoreCase)) |
|
{ |
|
DeleteByName(pFeaWorkspace, pDatasetName); |
|
} |
|
} |
|
pDatasetName = pEnumDatasetName.Next(); |
|
} |
|
/* |
|
* 此处是为了删除GDB_GeomColumns表对应的TableName=要删除表名的记录,GDB_GeomColumns是记录当前数据库所有存在的矢量表记录 |
|
* 同时删除对应图层的SHAPE_Index表 |
|
*/ |
|
try |
|
{ |
|
CurrentWorkspace.ExecuteSQL(string.Format("DELETE FROM GDB_GeomColumns WHERE TableName='{0}'", featureClassName)); |
|
CurrentWorkspace.ExecuteSQL("Drop Table " + featureClassName + "SHAPE_Index"); |
|
CurrentWorkspace.ExecuteSQL("Drop Table " + featureClassName); |
|
} |
|
catch (Exception) |
|
{ |
|
|
|
} |
|
return true; |
|
} |
|
catch (Exception) |
|
{ |
|
return false; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 是否存在要素类:此方法性能很慢,慎用 |
|
/// </summary> |
|
/// <param name="featureClassName"></param> |
|
/// <returns></returns> |
|
public bool ExistFeatureClass(string featureClassName) |
|
{ |
|
if (this.CurrentWorkspace == null || string.IsNullOrEmpty(featureClassName)) |
|
{ |
|
return false; |
|
} |
|
IEnumDatasetName pEnumDatasetName = null; |
|
IFeatureWorkspace pFeaWorkspace = null; |
|
IDatasetName pDatasetName = null; |
|
try |
|
{ |
|
pFeaWorkspace = CurrentWorkspace as IFeatureWorkspace; |
|
pEnumDatasetName = CurrentWorkspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass ^ esriDatasetType.esriDTFeatureDataset); |
|
if (pEnumDatasetName == null) |
|
{ |
|
return false; |
|
} |
|
pEnumDatasetName.Reset(); |
|
while ((pDatasetName = pEnumDatasetName.Next()) != null) |
|
{ |
|
if (pDatasetName.Type == esriDatasetType.esriDTFeatureDataset) |
|
{ |
|
//如果是要素集,则对要素集内的要素类进行查找 |
|
IEnumDatasetName pEnumFcName = (pDatasetName as IFeatureDatasetName).FeatureClassNames; |
|
if (pEnumFcName == null) |
|
{ |
|
continue; |
|
} |
|
pEnumFcName.Reset(); |
|
IDatasetName pFcName = null; |
|
while ((pFcName = pEnumFcName.Next()) != null) |
|
{ |
|
if (featureClassName.Equals(pFcName.Name, StringComparison.CurrentCultureIgnoreCase)) |
|
{ |
|
return true; |
|
} |
|
} |
|
} |
|
else if (pDatasetName.Name.Equals(featureClassName)) |
|
{ |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
catch (Exception) |
|
{ |
|
return false; |
|
} |
|
} |
|
|
|
//删除名称对象 |
|
private void DeleteByName(IFeatureWorkspace pFeaWorkspace, IDatasetName pDatasetName) |
|
{ |
|
IFeatureWorkspaceManage pWorkspaceManager = pFeaWorkspace as IFeatureWorkspaceManage; |
|
pWorkspaceManager.DeleteByName(pDatasetName); |
|
} |
|
|
|
#region 打开指定工作空间的元素类 2020-6-1 沈超 |
|
|
|
/// <summary> |
|
/// 打开指定工作空间中的要素类,如果没有则返回null 2020-6-1 沈超 |
|
/// </summary> |
|
/// <param name="sFeatureClassName">要素类名称</param> |
|
/// <param name="iTheWorkspace">对应的工作空间</param> |
|
/// <returns></returns> |
|
public IFeatureClassAPI ToOpenFeatureClass(string sFeatureClassName, IWorkspace iTheWorkspace) |
|
{ |
|
try |
|
{ |
|
if (iTheWorkspace != null) |
|
{ |
|
return new FeatureClassAPI((iTheWorkspace as IFeatureWorkspace).OpenFeatureClass(sFeatureClassName)); |
|
} |
|
else |
|
{ |
|
throw new Exception("打开要素类前,必须先打开对应的工作空间!"); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
#endregion |
|
|
|
/// <summary> |
|
/// 建立主要字段(OBJECTID和SHAPE) |
|
/// </summary> |
|
/// <param name="pFieldsEdit">IFieldsEdit,把OBJECTID和SHAPE字段加进去</param> |
|
/// <param name="pSpatialReference">空间参数</param> |
|
public static void CreateMainField(IFieldsEdit pFieldsEdit, esriGeometryType pGeometryType, ISpatialReference pSpatialReference) |
|
{ |
|
IField pField; |
|
IFieldEdit pFieldEdit; |
|
//建立OBJECTID字段 |
|
pField = new FieldClass(); |
|
pFieldEdit = pField as IFieldEdit; |
|
pFieldEdit.Name_2 = "OBJECTID"; |
|
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID; |
|
pFieldsEdit.AddField(pField); |
|
//建立shap字段 |
|
pField = new FieldClass(); |
|
pFieldEdit = pField as IFieldEdit; |
|
pFieldEdit.Name_2 = "SHAPE"; |
|
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; |
|
IGeometryDef pGeometryDef = new GeometryDefClass(); |
|
IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit; |
|
pGeometryDefEdit.GeometryType_2 = pGeometryType; |
|
pGeometryDefEdit.SpatialReference_2 = pSpatialReference; |
|
pFieldEdit.GeometryDef_2 = pGeometryDef; |
|
pFieldsEdit.AddField(pField); |
|
} |
|
} |
|
}
|
|
|