using ESRI.ArcGIS.DataSourcesGDB; 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.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; using KGIS.Framework.Core.Services; using KGIS.Framework.Utils.ExtensionMethod; namespace kingo.Plugin.BGResultManager.Utility.MDB { public class ExportBGMDB { private string GX_VCTPath; private string GXGC_VCTPath; public ExportBGMDB(string pGX_VCTPath, string pGXGC_VCTPath) { GX_VCTPath = pGX_VCTPath; GXGC_VCTPath = pGXGC_VCTPath; } public string LayerNameFilter { get; set; } = null; 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; } CreateMdb(Path.GetDirectoryName(SavedMDBPath), Path.GetFileNameWithoutExtension(SavedMDBPath)); t_WsAPI = new WorkspaceAPI(SavedMDBPath, WorkspaceTypeEnum.MDBFile); 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(); } } } public void ExportGDB(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); ISpatialReference pSR = null; IFeatureClassAPI fcSourceAPI = s_WsAPI.OpenFeatureClass("PDTGX"); IFeatureClass fcSource = fcSourceAPI.FeatureClass; if (pSR == null) { pSR = (fcSource as IGeoDataset).SpatialReference; } GeoDBAPI.CreateFields(fcSource.Fields, out IFields fields); t_WsAPI.DeleteFeatureClass("PDTGX"); IFeatureClassAPI fcTargetAPI = t_WsAPI.CreateFeatureClass("PDTGX", pSR, fields); fcSourceAPI.FcToFc(fcTargetAPI.FeatureClass, null, false); 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(); } } } /// /// 创建数据库 /// /// /// /// public void CreateMdb(string mdbFolder, string mdbName) { try { IWorkspaceFactory pFtWsFct = new AccessWorkspaceFactory(); pFtWsFct.Create(mdbFolder, mdbName, null, 0); } catch (Exception ex) { LogAPI.Debug("创建mdb数据库失败:" + ex); } } public void CreateGDB(string mdbFolder, string mdbName) { try { IWorkspaceFactory pFtWsFct = new FileGDBWorkspaceFactory(); pFtWsFct.Create(mdbFolder, mdbName, null, 0); //IWorkspaceName workspaceName = pFtWsFct.Create(mdbFolder, mdbName, 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); } } /// /// 在指定数据集中创建要素类 /// /// 要素类名称 /// 字段集合 /// 要素数据集 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; } } 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; } } }