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; } } /// /// 连接属性 /// private IPropertySet propertySet { get { if (!string.IsNullOrWhiteSpace(this.StrConn)) { IPropertySet result = new PropertySetClass(); if (_workSpaceType == WorkspaceTypeEnum.SDEConn) { Dictionary 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; } } /// /// 解析连接字符串 /// /// /// private Dictionary GetConn(string pStrConn) { Dictionary result = new Dictionary(); 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; } } /// /// 构造函数 /// 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() { } /// /// 获取当前工作空间中指定类型的所有要素类名称 /// /// /// public Dictionary GetFeatureClassName(esriDatasetType pDatasetType) { Dictionary result = new Dictionary(); 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; } /// /// 获取当前工作空间中存在的对象(要素集和要素类) /// /// /// public Dictionary GetDataSetAndFeatureClassName(esriDatasetType pDatasetType) { Dictionary result = new Dictionary(); 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; } /// /// 获取当前工作空间中存在的属性表 /// /// /// public Dictionary GetPropertyTable(esriDatasetType pDatasetType) { Dictionary result = new Dictionary(); 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; } /// /// 获取当前工作空间中指定类型的所有要素类 /// /// /// public List GetAllFeatureClass(esriDatasetType pDatasetType) { List result = new List(); 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; /// /// 当前工作空间对象 /// public IWorkspace CurrentWorkspace { get { return _CurrentWorkspace; } } ///// ///// 打开工作空间 ///// //public IWorkspace OpenWorkspace(string pStrConnection, WorkspaceTypeEnum pWorkspaceType) //{ //} ///// ///// 打开工作空间 ///// //public IWorkspace OpenWorkspace(IWorkspace pWorkspace) //{ // _CurrentWorkspace = pWorkspace; // return _CurrentWorkspace; //} /// /// 打开要素类 /// /// 要素类名称 /// 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; } } /// /// 打开要素类,如果没有则返回null /// /// 要素类名称 /// 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; } } /// /// 打开要素类 /// /// 要素类名称 /// 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; } } /// /// 关闭/释放工作空间 /// /// 关闭工作空间时是否压缩数据库,默认压缩 /// 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; } } /// /// 创建本地工作空间 /// /// /// public IWorkspace CreateLocalWorkspace(string pPath) { string gdbExtention = System.IO.Path.GetExtension(pPath).ToLower(); switch (gdbExtention) { case ".gdb": _CurrentWorkspace = CreateWorkspace(pPath); return _CurrentWorkspace; case ".mdb": _CurrentWorkspace = CreateWorkspace(pPath); return _CurrentWorkspace; default: return null; } //ESRI.ArcGIS.ConversionTools } /// /// 创建本地工作空间 /// /// 工作空间类型 /// 路径 /// IWorkspace public IWorkspace CreateWorkspace(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; } } /// /// 通过路径获取IWorkspace /// /// /// /// public IWorkspace GetWorkspace(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; } } /// /// 根据路径获得IWorkspace /// /// /// public IWorkspace GetWorkspaceByPath(string sFilePath) { string gdbExtention = System.IO.Path.GetExtension(sFilePath).ToLower(); switch (gdbExtention) { case ".gdb": return GetWorkspace(sFilePath); case ".mdb": return GetWorkspace(sFilePath); default: return null; } } /// /// 删除本地工作空间 /// /// 本地工作空间路径 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; } } /// /// 在指定数据集中创建要素类 /// /// 要素类名称 /// 字段集合 /// 要素数据集 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; } } /// /// 在当前工作空间中创建要素类 /// /// 要素类名称 /// 字段集合 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; } } /// /// 在当前工作空间中创建要素类 /// /// 要素类名称 /// 字段集合 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; } } /// /// 在当前工作空间中创建表 /// /// 表名 /// 字段集合 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; } } /// /// 删除指定要素类 /// /// /// 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; } } /// /// 是否存在要素类:此方法性能很慢,慎用 /// /// /// 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 沈超 /// /// 打开指定工作空间中的要素类,如果没有则返回null 2020-6-1 沈超 /// /// 要素类名称 /// 对应的工作空间 /// 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 /// /// 建立主要字段(OBJECTID和SHAPE) /// /// IFieldsEdit,把OBJECTID和SHAPE字段加进去 /// 空间参数 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); } } }