using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.Core.Services; using KGIS.Framework.Maps; using KGIS.Framework.Utils; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using System.IO; using System.Text; using Path = System.IO.Path; namespace kingo.Plugin.BGResultManager.Utility.GDB { public class ExportBGGDB { string sourcePath; public string LayerNameFilter { get; set; } = null; private string GX_VCTPath; private string GXGC_VCTPath; public ExportBGGDB(string pGX_VCTPath, string pGXGC_VCTPath) { GX_VCTPath = pGX_VCTPath; GXGC_VCTPath = pGXGC_VCTPath; } public void Export(string SavedMDBPath) { WorkspaceAPI s_WsAPI = null; WorkspaceAPI t_WsAPI = null; try { bool IsDeleteFileFailed = false; //创建要保存的MDB文件 try { if (System.IO.File.Exists(SavedMDBPath)) { System.IO.File.Delete(SavedMDBPath); } } catch { IsDeleteFileFailed = true; } CreateGdb(Path.GetDirectoryName(SavedMDBPath), Path.GetFileNameWithoutExtension(SavedMDBPath)); t_WsAPI = new WorkspaceAPI(SavedMDBPath, WorkspaceTypeEnum.GDBFile); string currentGDBPath = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ZLDatabase; s_WsAPI = new WorkspaceAPI(currentGDBPath, WorkspaceTypeEnum.GDBFile); Dictionary s_FcList = GetExportDic(); if (s_FcList.Count > 0) { IFeatureDataset pFD = null; try { pFD = (t_WsAPI.CurrentWorkspace as IFeatureWorkspace).OpenFeatureDataset("变更数据"); } catch { } ISpatialReference pSR = null; bool isVerifyMandate = false; foreach (KeyValuePair kvp in s_FcList) { if (!string.IsNullOrWhiteSpace(LayerNameFilter)) { if (!kvp.Value.EndsWith(LayerNameFilter)) { if (kvp.Value != "GXZJ") { continue; } else { if (LayerNameFilter != "GX") { continue; } } } } IFeatureClassAPI fcSourceAPI = s_WsAPI.OpenFeatureClass(kvp.Value); IFeatureClass fcSource = fcSourceAPI.FeatureClass; if (fcSource.FeatureDataset != null && fcSource.FeatureDataset.Name == "增量更新库") { if (pSR == null) { pSR = (fcSource as IGeoDataset).SpatialReference; } if (pFD == null) { pFD = (t_WsAPI.CurrentWorkspace as IFeatureWorkspace).CreateFeatureDataset("变更数据", pSR); } GeoDBAPI.CreateFields(fcSource.Fields, out IFields fields); if (IsDeleteFileFailed) { t_WsAPI.DeleteFeatureClass(kvp.Value); } IFeatureClassAPI fcTargetAPI = CreateFeatureClass(kvp.Value, pFD, pSR, fcSource.ShapeType, fields); if (kvp.Value == "PDTGX") { //fcSourceAPI.FcToFc(fcTargetAPI.FeatureClass, new QueryFilter() { WhereClause = " 1=2 " }, false); } else { if (fcTargetAPI.FeatureClass.AliasName == "DLTBGX" || fcTargetAPI.FeatureClass.AliasName == "DLTBGXGC") { if (fcSourceAPI.FeatureClass.FeatureCount(null) > 0) { if (!isVerifyMandate) isVerifyMandate = CommonHelper.VerifyMandate(fcSourceAPI.FeatureClass); if (!isVerifyMandate) { LogAPI.Debug("验证授权失败,请先核对授权区域是否正确。"); throw new Exception("验证授权失败,请先核对授权区域是否正确。"); } else { fcSourceAPI.FcToFc(fcTargetAPI.FeatureClass, new QueryFilter() { WhereClause = " ONLYZLBG is null OR ONLYZLBG = ''" }, false); } } } else { fcSourceAPI.FcToFc(fcTargetAPI.FeatureClass, null, false); } } if (fcTargetAPI.FeatureClass.FindField("JCTBBSM") != -1) fcTargetAPI.DeleteField("JCTBBSM"); if (fcTargetAPI.FeatureClass.FindField("BGTBOID") != -1) fcTargetAPI.DeleteField("BGTBOID");//导出的原格式数据不需要BGTBOID字段 if (fcTargetAPI.FeatureClass.FindField("ONLYZLBG") != -1) fcTargetAPI.DeleteField("ONLYZLBG"); if (kvp.Value == "DLTBGXGC") { if (fcTargetAPI.FeatureClass.FindField("BGTBBH") != -1) fcTargetAPI.DeleteField("BGTBBH"); if (fcTargetAPI.FeatureClass.FindField("JCZT") != -1) fcTargetAPI.DeleteField("JCZT"); if (fcTargetAPI.FeatureClass.FindField("JCJG") != -1) fcTargetAPI.DeleteField("JCJG"); if (fcTargetAPI.FeatureClass.FindField("XMMC") != -1) fcTargetAPI.DeleteField("XMMC"); if (fcTargetAPI.FeatureClass.FindField("XMBH") != -1) fcTargetAPI.DeleteField("XMBH"); if (fcTargetAPI.FeatureClass.FindField("DKMC") != -1) fcTargetAPI.DeleteField("DKMC"); } if (kvp.Value == "DLTBGX") { if (fcTargetAPI.FeatureClass.FindField("XZQTZLX") != -1) fcTargetAPI.DeleteField("XZQTZLX"); } fcTargetAPI.CloseFeatureClass(); } } } } catch (Exception ex) { LogAPI.Debug(ex); throw ex; } finally { if (s_WsAPI != null) { s_WsAPI.CloseWorkspace(); } if (t_WsAPI != null) { t_WsAPI.CloseWorkspace(); } } } private Dictionary GetExportDic() { Dictionary dic = new Dictionary(); //string BGVCTPath = Path.Combine(SysAppPath.GetCurrentAppPath(), "VCTTemplate3ForBG.VCT"); StreamReader sr = new StreamReader(GX_VCTPath, Encoding.GetEncoding("GB18030")); string line = null; bool BeginLoad = false; while ((line = sr.ReadLine()) != null) { if (line == "FeatureCodeBegin") { BeginLoad = true; } if (BeginLoad && line != "FeatureCodeBegin") { string[] strs = line.Split(','); if (strs.Length == 4) { dic.Add(strs[1], strs[3]); } } if (line == "FeatureCodeEnd") { BeginLoad = false; break; } } sr.Close(); sr.Dispose(); //string BGVCT2Path = Path.Combine(SysAppPath.GetCurrentAppPath(), "VCTTemplate3ForBG2.VCT"); StreamReader sr2 = new StreamReader(GXGC_VCTPath, Encoding.GetEncoding("GB18030")); line = null; BeginLoad = false; while ((line = sr2.ReadLine()) != null) { if (line == "FeatureCodeBegin") { BeginLoad = true; } if (BeginLoad && line != "FeatureCodeBegin") { string[] strs = line.Split(','); if (strs.Length == 4) { dic.Add(strs[1], strs[3]); } } if (line == "FeatureCodeEnd") { BeginLoad = false; break; } } sr2.Close(); sr2.Dispose(); return dic; } //public void Export(string SaveGDBPath) //{ // IWorkspaceAPI s_WsAPI = null; // IWorkspaceAPI t_WsAPI = null; // try // { // if (System.IO.Directory.Exists(SaveGDBPath)) // { // System.IO.Directory.Delete(SaveGDBPath); // } // //创建要保存的MDB文件 // IWorkspace workspace = CreateGdb(Path.GetDirectoryName(SaveGDBPath), Path.GetFileNameWithoutExtension(SaveGDBPath)); // if (workspace == null) // { // throw new Exception("无法创建GDB文件夹,导出操作已终止"); // } // t_WsAPI = new WorkspaceAPI(workspace); // string currentGDBPath = System.IO.Path.Combine(Env.Instance.Project.ProjDir, "工程数据.gdb"); // s_WsAPI = new WorkspaceAPI(currentGDBPath, AE.Enum.WorkspaceTypeEnum.GDBFile); // Dictionary s_FcList = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset); // if (s_FcList.Count > 0) // { // IFeatureDataset pFD = null; // ISpatialReference pSR = null; // foreach (KeyValuePair kvp in s_FcList) // { // if (!string.IsNullOrWhiteSpace(LayerNameFilter)) // { // if (!kvp.Value.EndsWith(LayerNameFilter)) // { // if (kvp.Value != "GXZJ") // { // continue; // } // else // { // if (LayerNameFilter != "GX") // { // continue; // } // } // } // } // IFeatureClassAPI fcSourceAPI = s_WsAPI.OpenFeatureClass(kvp.Value); // IFeatureClass fcSource = fcSourceAPI.FeatureClass; // if (fcSource.FeatureDataset != null && fcSource.FeatureDataset.Name == "变更成果") // { // if (pSR == null) // { // pSR = (fcSource as IGeoDataset).SpatialReference; // } // if (pFD == null) // { // pFD = (t_WsAPI.CurrentWorkspace as IFeatureWorkspace).CreateFeatureDataset("变更数据", pSR); // } // GeoDBAPI.CreateFields(fcSource.Fields, out IFields fields); // IFeatureClass fcTarget = CreateFeatureClass(kvp.Value, pFD, pSR, fcSource.ShapeType, fields).FeatureClass; // fcSourceAPI.FcToFc(fcTarget, null, false); // } // } // } // } // catch (Exception ex) // { // LogAPI.Debug(ex); // throw ex; // } // finally // { // if (s_WsAPI != null) // { // s_WsAPI.CloseWorkspace(); // } // if (t_WsAPI != null) // { // t_WsAPI.CloseWorkspace(); // } // } // } public void Export_PDT(string SaveGDBPath) { if (!CheckTemplateFile_PDTGX()) { return; } IWorkspaceAPI s_WsAPI = null; IWorkspaceAPI t_WsAPI = null; try { if (System.IO.Directory.Exists(SaveGDBPath)) { System.IO.Directory.Delete(SaveGDBPath); } //创建要保存的MDB文件 IWorkspace workspace = CreateGdb(Path.GetDirectoryName(SaveGDBPath), Path.GetFileNameWithoutExtension(SaveGDBPath)); if (workspace == null) { throw new Exception("无法创建GDB文件夹,导出操作已终止"); } t_WsAPI = new WorkspaceAPI(workspace); string currentGDBPath = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath(); s_WsAPI = new WorkspaceAPI(currentGDBPath, WorkspaceTypeEnum.GDBFile); Dictionary s_FcList = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset); if (s_FcList.Count > 0) { IFeatureDataset pFD = null; ISpatialReference pSR = null; foreach (KeyValuePair kvp in s_FcList) { if (kvp.Value == "PDTGX") { IFeatureClassAPI fcSourceAPI = s_WsAPI.OpenFeatureClass(kvp.Value); IFeatureClass fcSource = fcSourceAPI.FeatureClass; if (fcSource.FeatureDataset != null && fcSource.FeatureDataset.Name == "变更成果") { pSR = (fcSource as IGeoDataset).SpatialReference; GeoDBAPI.CreateFields(fcSource.Fields, out IFields fields); IFeatureClass fc = t_WsAPI.CreateFeatureClass(kvp.Value, pSR, fields).FeatureClass; fcSourceAPI.FcToFc(fc, null, false); } } } } } catch (Exception ex) { LogAPI.Debug(ex); throw ex; } finally { if (s_WsAPI != null) { s_WsAPI.CloseWorkspace(); } if (t_WsAPI != null) { t_WsAPI.CloseWorkspace(); } } } /// /// 检查坡度图更新层模板是否存在 /// /// private bool CheckTemplateFile_PDTGX() { bool result = false; //工作空间\模板\临时文件 string str = SysAppPath.GetCurrentAppPath(); sourcePath = SysAppPath.GetCurrentAppPath() + "工作空间\\模板\\新建变更工程\\PDTGX.gdb"; if (Directory.Exists(sourcePath)) { result = true; } return result; } /// /// 创建数据库 /// /// /// /// public IWorkspace CreateGdb(string gdbFolder, string gdbName) { try { IWorkspaceFactory pFtWsFct = new FileGDBWorkspaceFactoryClass(); IWorkspaceName workspaceName = pFtWsFct.Create(gdbFolder, gdbName, null, 0); IFeatureWorkspace pFeatureWorkSpace = (workspaceName as IName).Open() as IFeatureWorkspace; IWorkspace pWorkspace = (workspaceName as IName).Open() as IWorkspace; return pWorkspace; } catch (Exception ex) { LogAPI.Debug("创建mdb数据库失败:" + ex); return null; } } /// /// 在指定数据集中创建要素类 /// /// 要素类名称 /// 字段集合 /// 要素数据集 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(); GeoDBAPI.CreateMainField(pFields as IFieldsEdit, pSpatialReference, esriGeoType); } IFeatureClass fc = pFeatureDataset.CreateFeatureClass( pFeatureClassName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); return new FeatureClassAPI(fc); } catch (Exception ex) { throw ex; } } } }