年度变更建库软件5.0版本
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.
 
 

837 lines
44 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
using KGIS.Framework.AE.GPHelper;
using KGIS.Framework.Commands;
using KGIS.Framework.DBOperator;
using KGIS.Framework.Maps;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using kingo.Plugin.BGResultManager.Helper;
using Kingo.PluginServiceInterface;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using KUI.Windows;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.DataSourcesGDB;
using KGIS.Framework.Utils.ExtensionMethod;
namespace Kingo.Plugin.BGResultManager.Commands
{
/// <summary>
/// 变更后年末库导出
/// </summary>
public class BGENDNMKExportCommand : BaseMenuCommand
{
private IHookHelper m_hookHelper = null;
public override void OnCreate(object hook)
{
if (hook == null)
{
return;
}
try
{
if (m_hookHelper == null)
{
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
}
}
catch
{
m_hookHelper = null;
return;
}
}
public override void OnClick()
{
try
{
ProjectInfo projectInfo = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo);
string Code_Name = GetXZQDic(projectInfo.CODE);
#region 定义变量
IWorkspaceAPI wsAPI = null;
IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG");
IFeatureLayer dltbgx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBGX");
IFeatureLayer JCdltb_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑");
IFeatureLayer xzqgx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("XZQGX");
IFeatureLayer xzqjxgx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("XZQJXGX");
IFeatureLayer jcxzq_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("行政区");
IFeatureLayer czcdydgx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYDGX");
IFeatureLayer czcdydgxzj_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYDGXZJ");
IFeatureLayer czcdydgxgc_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYDGXGC");
IFeatureLayer cjdcqgx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("CJDCQGX");
IFeatureLayer cjdcqjxgx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("CJDCQJXGX");
IFeatureLayer jccjdcq_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("村级调查区");
IFeatureLayer gxzj_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("ZJGX");
IFeatureLayer jcczcdyd_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地");
IFeatureLayer jccjdcqjx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("村级调查区界线");
IFeatureLayer jcxzqjx_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("行政区界线");
IFeatureLayer XZQNMKLayer = null;
IFeatureLayer CJDCQNMKLayer = null;
IFeatureLayer XZQJXNMKLayer = null;
IFeatureLayer CJDCQJXNMKLayer = null;
ISpatialReference pSR = null;
GPParamClass gPParamClass = new GPParamClass();
IFeatureClassAPI fcAPI = null;
IFeatureClass featureClass_Temps = null;
IFeatureClassAPI t_FcAPIs = null;
#endregion
string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite";
pSR = (JCdltb_Layer.FeatureClass as IGeoDataset).SpatialReference;
string saveFile = "";
//弹出文件选择对话框
var saveFileDialog = new Microsoft.Win32.SaveFileDialog
{
FileName = "年末库导出_" + projectInfo.CODE + Code_Name,
Filter = "GDB文件(*.gdb)|*.gdb|MDB文件(*.mdb)|*.mdb"
};
var result = saveFileDialog.ShowDialog();
if (result.Value)
{
string gdbFileName = saveFileDialog.SafeFileName;// projectInfo.CODE + Code_Name + ".gdb";//创建年末库储存的GDB文件
string path = string.Empty;
string MDBpath = string.Empty;
path = saveFileDialog.FileName;
if (saveFileDialog.FileName.EndsWith(".mdb"))
{
saveFile = saveFileDialog.FileName.Split('.')[0].ToString();
if (Directory.Exists(saveFile)) { MessageHelper.ShowTips("该文件已存在!"); return; }
gdbFileName = projectInfo.CODE + Code_Name + Guid.NewGuid().ToString() + ".gdb";
MDBpath = System.IO.Path.Combine(saveFile, projectInfo.CODE + Code_Name + ".mdb");//MDB生成路径
if (!Directory.Exists(saveFile))
Directory.CreateDirectory(saveFile);
saveFile = SysAppPath.GetTempPath() + @"NMKTemp\";//临时GDB数据
if (!Directory.Exists(saveFile))
Directory.CreateDirectory(saveFile);
//删除saveFile当前路径下,所有的文件和目录
PluginServiceInterface.CommonHelper.DelectDir(saveFile);
path = System.IO.Path.Combine(saveFile, gdbFileName);
}
this.ShowLoading("进行年末库数据导出……", 0, 0);
//workspaceName = pSaveFct.Create(saveFile, gdbFileName, null, 0);//创建数据库
wsAPI = GeoDBAPI.CreateLocalWorkspace(path);
//wsAPI = new WorkspaceAPI(path, Framework.AE.Enum.WorkspaceTypeEnum.GDBFile, false);
IFeatureWorkspace targetWorkspac = wsAPI.CurrentWorkspace as IFeatureWorkspace;
IDataset newDataset = targetWorkspac.CreateFeatureDataset("TDDC", pSR);
this.UpdateMsg("进行地类图斑年末库数据导出……");
IFeatureClass sd = BGNMKHelper.BgDLTBNMKData(wsAPI, newDataset);
if (sd == null)
{
this.CloseLoading();
return;
}
#region 村级调查区年末库
if (cjdcqgx_Layer != null && cjdcqgx_Layer.FeatureClass.FeatureCount(null) != 0)
{
this.UpdateMsg("进行村级调查区年末库数据导出……");
gPParamClass = new GPParamClass();
gPParamClass.FirstFeatureLayer = jccjdcq_Layer;
gPParamClass.SecondFeatureLayer = cjdcqgx_Layer;
gPParamClass.OutFeatureClassPath = path + "\\" + "CJDCQs";
gPParamClass.IsGetOutPutFeature = true;
GeoprocessorHelper.EraseAnalysis(gPParamClass, ref CJDCQNMKLayer);
fcAPI = new FeatureClassAPI(cjdcqgx_Layer.FeatureClass);
fcAPI.FcToFc(CJDCQNMKLayer.FeatureClass, null, false);
featureClass_Temps = wsAPI.CreateFeatureClass("CJDCQ", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, CJDCQNMKLayer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(CJDCQNMKLayer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
wsAPI.DeleteFeatureClass("CJDCQs");
}
else if (jccjdcq_Layer != null && jccjdcq_Layer.FeatureClass.FeatureCount(null) != 0)
{
featureClass_Temps = wsAPI.CreateFeatureClass("CJDCQ", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, jccjdcq_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(jccjdcq_Layer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
}
else
{
if (cjdcqgx_Layer != null)
featureClass_Temps = wsAPI.CreateFeatureClass("CJDCQ", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, cjdcqgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
}
#endregion
#region 村级调查区界限年末库
if (cjdcqjxgx_Layer != null && cjdcqjxgx_Layer.FeatureClass.FeatureCount(null) != 0)
{
this.UpdateMsg("进行村级调查区界限年末库数据导出……");
IFeatureClass Temp_featureClass = wsAPI.CreateFeatureClass("KPCZCCK_Temp", pSR, cjdcqjxgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
fcAPI = new FeatureClassAPI(cjdcqjxgx_Layer.FeatureClass);
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = " BGXW<>'3' ";
fcAPI.FcToFc(Temp_featureClass, queryFilter, false);
IFeatureClass Temps_featureClass = wsAPI.CreateFeatureClass("KPCZCCKs_Temp", pSR, cjdcqjxgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
fcAPI = new FeatureClassAPI(cjdcqjxgx_Layer.FeatureClass);
IQueryFilter queryFilters = new QueryFilterClass();
queryFilter.WhereClause = " BGXW<>'0' ";
fcAPI.FcToFc(Temps_featureClass, queryFilter, false);
gPParamClass = new GPParamClass();
gPParamClass.FirstFeatureLayer = jccjdcqjx_Layer;
gPParamClass.SecondFeatureLayer = new FeatureLayerClass() { FeatureClass = Temp_featureClass, Name = Temp_featureClass.AliasName };
gPParamClass.OutFeatureClassPath = path + "\\" + "CJDCQJXs";
gPParamClass.IsGetOutPutFeature = true;
GeoprocessorHelper.EraseAnalysis(gPParamClass, ref CJDCQJXNMKLayer);
fcAPI = new FeatureClassAPI(Temps_featureClass);
fcAPI.FcToFc(CJDCQJXNMKLayer.FeatureClass, null, false);
wsAPI.DeleteFeatureClass("KPCZCCK_Temp");
wsAPI.DeleteFeatureClass("KPCZCCKs_Temp");
featureClass_Temps = wsAPI.CreateFeatureClass("CJDCQJX", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, CJDCQJXNMKLayer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(CJDCQJXNMKLayer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
wsAPI.DeleteFeatureClass("CJDCQJXs");
}
else if (jccjdcqjx_Layer != null && jccjdcqjx_Layer.FeatureClass.FeatureCount(null) != 0)
{
featureClass_Temps = wsAPI.CreateFeatureClass("CJDCQJX", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, jccjdcqjx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(jccjdcqjx_Layer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
}
else
{
if (cjdcqjxgx_Layer != null)
featureClass_Temps = wsAPI.CreateFeatureClass("CJDCQJX", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, cjdcqjxgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
}
#endregion
#region 行政区年末库
if (xzqgx_Layer != null && xzqgx_Layer.FeatureClass.FeatureCount(null) != 0)
{
this.UpdateMsg("进行行政区年末库数据导出……");
gPParamClass = new GPParamClass();
gPParamClass.FirstFeatureLayer = jcxzq_Layer;
gPParamClass.SecondFeatureLayer = xzqgx_Layer;
gPParamClass.OutFeatureClassPath = path + "\\" + "XZQs";
gPParamClass.IsGetOutPutFeature = true;
GeoprocessorHelper.EraseAnalysis(gPParamClass, ref XZQNMKLayer);
fcAPI = new FeatureClassAPI(xzqgx_Layer.FeatureClass);
fcAPI.FcToFc(XZQNMKLayer.FeatureClass, null, false);
featureClass_Temps = wsAPI.CreateFeatureClass("XZQ", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, XZQNMKLayer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(XZQNMKLayer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
wsAPI.DeleteFeatureClass("XZQs");
}
else if (jcxzq_Layer != null && jcxzq_Layer.FeatureClass.FeatureCount(null) != 0)
{
featureClass_Temps = wsAPI.CreateFeatureClass("XZQ", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, jcxzq_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(jcxzq_Layer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
}
else
{
if (xzqgx_Layer != null)
featureClass_Temps = wsAPI.CreateFeatureClass("XZQ", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, xzqgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
}
#endregion
#region 行政区界线年末库
if (xzqjxgx_Layer != null && xzqjxgx_Layer.FeatureClass.FeatureCount(null) != 0)
{
this.UpdateMsg("进行行政区界线年末库数据导出……");
IFeatureClass Temp_featureClassw = wsAPI.CreateFeatureClass("KPCZCCK_Temsp", pSR, xzqjxgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
fcAPI = new FeatureClassAPI(xzqjxgx_Layer.FeatureClass);
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = " BGXW<>'3' ";
fcAPI.FcToFc(Temp_featureClassw, queryFilter, false);
IFeatureClass Temps_featureClassw = wsAPI.CreateFeatureClass("KPCZCCKs_Temps", pSR, xzqjxgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
fcAPI = new FeatureClassAPI(xzqjxgx_Layer.FeatureClass);
IQueryFilter queryFilters = new QueryFilterClass();
queryFilter.WhereClause = " BGXW<>'0' ";
fcAPI.FcToFc(Temps_featureClassw, queryFilter, false);
gPParamClass = new GPParamClass();
gPParamClass.FirstFeatureLayer = jcxzqjx_Layer;
gPParamClass.SecondFeatureLayer = new FeatureLayerClass() { FeatureClass = Temp_featureClassw, Name = Temp_featureClassw.AliasName };
gPParamClass.OutFeatureClassPath = path + "\\" + "XZQJXs";
gPParamClass.IsGetOutPutFeature = true;
GeoprocessorHelper.EraseAnalysis(gPParamClass, ref XZQJXNMKLayer);
fcAPI = new FeatureClassAPI(Temps_featureClassw);
fcAPI.FcToFc(XZQJXNMKLayer.FeatureClass, null, false);
wsAPI.DeleteFeatureClass("KPCZCCK_Temsp");
wsAPI.DeleteFeatureClass("KPCZCCKs_Temps");
featureClass_Temps = wsAPI.CreateFeatureClass("XZQJX", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, XZQJXNMKLayer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(XZQJXNMKLayer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
wsAPI.DeleteFeatureClass("XZQJXs");
}
else if (jcxzqjx_Layer != null && jcxzqjx_Layer.FeatureClass.FeatureCount(null) != 0)
{
featureClass_Temps = wsAPI.CreateFeatureClass("XZQJX", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, jcxzqjx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
t_FcAPIs = new FeatureClassAPI(jcxzqjx_Layer.FeatureClass);
t_FcAPIs.FcToFc(featureClass_Temps, null, false);
}
else
{
if (xzqjxgx_Layer != null)
featureClass_Temps = wsAPI.CreateFeatureClass("XZQJX", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, xzqjxgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
}
#endregion
#region 城镇村年末库
if (czcdydgx_Layer != null && czcdydgx_Layer.FeatureClass.FeatureCount(null) != 0)
{
this.UpdateMsg("进行城镇村年末库数据导出……");
#region MyRegion
IFeatureClass featureClass_CZCDYD = wsAPI.CreateFeatureClass("CZCDYD", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, jcczcdyd_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
fcAPI = new FeatureClassAPI(jcczcdyd_Layer.FeatureClass);
fcAPI.FcToFc(featureClass_CZCDYD, null, false);
IFeatureCursor _cursor = czcdydgxgc_Layer.FeatureClass.Search(new QueryFilterClass() { SubFields = "BGQBSM" }, true);
Dictionary<string, int> DicJcBSMs = new Dictionary<string, int>();
IFeature fCZC = null;
int idx = czcdydgxgc_Layer.FeatureClass.FindField("BGQBSM");
if (idx != -1)
{
while ((fCZC = _cursor.NextFeature()) != null)
{
string jcbsm = fCZC.Value[idx].ToTrim();
if (!DicJcBSMs.ContainsKey(jcbsm))
DicJcBSMs.Add(jcbsm, 0);
}
_cursor = featureClass_CZCDYD.Update(null, true);
idx = featureClass_CZCDYD.FindField("BSM");
if (idx != -1)
{
while ((fCZC = _cursor.NextFeature()) != null)
{
string bsm = fCZC.Value[idx].ToTrim();
if (DicJcBSMs.ContainsKey(bsm))
{
fCZC.Value[idx] = "-1";
_cursor.UpdateFeature(fCZC);
}
}
_cursor.Flush();
}
(featureClass_CZCDYD as ITable).DeleteSearchedRows(new QueryFilterClass() { WhereClause = "BSM = '-1'" });
}
fcAPI = new FeatureClassAPI(czcdydgx_Layer.FeatureClass);
fcAPI.FcToFc(featureClass_CZCDYD, null, false);
IFeatureClassAPI classAPICZC = new FeatureClassAPI(featureClass_CZCDYD);
if (classAPICZC.FeatureClass.FindField("XZQTZLX") != -1)
classAPICZC.DeleteField("XZQTZLX");
Marshal.ReleaseComObject(featureClass_CZCDYD);
#endregion
}
else
{
if (czcdydgx_Layer != null)
featureClass_Temps = wsAPI.CreateFeatureClass("CZCDYD", newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, czcdydgx_Layer.FeatureClass.Fields).FeatureClass;//创建数据集
}
IFeatureClassAPI classAPI = new FeatureClassAPI(featureClass_Temps);
if (classAPI.FeatureClass.FindField("XZQTZLX") != -1)
classAPI.DeleteField("XZQTZLX");
#endregion
#region 单独图层年末库-当前已建议移除整层更新的年末图斑
//this.UpdateMsg("进行单独图层年末库数据导出……");
//XDocument xDoc = XDocument.Load(SysAppPath.BG_GetMappingConfigPath());
//foreach (XElement item in xDoc.Descendants("Table"))
//{
// if (item.Attributes("TableName") == null || item.Attributes("TableName").Single().Value.ToUpper().EndsWith("GXGC") || item.Attributes("TableName").Single().Value.ToUpper().Equals("PDTGX") || item.Attributes("TableName").Single().Value.ToUpper().Equals("DLTBGX") || item.Attributes("TableName").Single().Value.ToUpper().Equals("XZQGX") || item.Attributes("TableName").Single().Value.ToUpper().Equals("CJDCQGX") || item.Attributes("TableName").Single().Value.ToUpper().Equals("CZCDYDGX") || item.Attributes("TableName").Single().Value.ToUpper().Equals("XZQJXGX") || item.Attributes("TableName").Single().Value.ToUpper().Equals("CJDCQJXGX"))
// {
// continue;
// }
// if (item.Attributes("Visiable").SingleOrDefault() == null || item.Attributes("Visiable").SingleOrDefault().Value.Equals("True"))
// {
// IFeatureLayer featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(item.Attributes("TableName").Single().Value);
// if (featureLayer == null) continue;
// GeoDBAPI.CreateFields(featureLayer.FeatureClass.Fields, out IFields fields);//创建字段
// int v = item.Attributes("TableName").Single().Value.Count();
// string tempFLName = item.Attributes("TableName").Single().Value.Substring(0, v - 2);
// IFeatureClass featureClass_Temp = wsAPI.CreateFeatureClass(tempFLName, newDataset as IFeatureDataset, pSR, esriGeometryType.esriGeometryPolygon, fields).FeatureClass;//创建数据集
// IFeatureClassAPI t_FcAPI = new FeatureClassAPI(featureLayer.FeatureClass);
// t_FcAPI.FcToFc(featureClass_Temp, null, false);
// t_FcAPI = new FeatureClassAPI(featureClass_Temp);
// t_FcAPI.DeleteField("GXSJ");
// Marshal.ReleaseComObject(featureLayer);
// Marshal.ReleaseComObject(featureClass_Temp);
// tempFLName = "";
// }
//}
#endregion
if (saveFileDialog.FileName.EndsWith(".mdb"))
{
this.UpdateMsg("进行年末库MDB数据导出中~");
UpDataFileAttribute(path);
ExportMDB(MDBpath, path, false);
}
this.CloseLoading();
MessageHelper.ShowTips("年末库数据导出成功!");
}
}
catch (Exception ex)
{
this.CloseLoading();
MessageHelper.ShowError("年末库导出失败!");
LogAPI.Debug(ex.Message);
LogAPI.Debug(ex);
}
}
/// <summary>
/// GDB转换为MDB
/// </summary>
/// <param name="t_targetPath">MDB绝对路径</param>
/// <param name="s_GDBFullPath">GDB绝对路径</param>
/// <param name="isTest">测试项</param>
private void ExportMDB(string t_targetPath, string s_GDBFullPath, bool isTest = false)
{
WorkspaceAPI t_WsAPI = null;
WorkspaceAPI s_WsAPI = null;
IEnumDataset pEnumDataset = null;
try
{
if (File.Exists(t_targetPath))
File.Delete(t_targetPath);
s_WsAPI = new WorkspaceAPI(s_GDBFullPath, WorkspaceTypeEnum.GDBFile);
//创建mdb
CreateFileMDB(t_targetPath, System.IO.Path.GetFileName(t_targetPath));
t_WsAPI = new WorkspaceAPI(t_targetPath, WorkspaceTypeEnum.MDBFile);
pEnumDataset = s_WsAPI.CurrentWorkspace.Datasets[esriDatasetType.esriDTFeatureDataset];
if (pEnumDataset != null)
{
pEnumDataset.Reset();
IDataset pDataset = null;
//如果数据集是IFeatureDataset,则遍历它下面的子类
while ((pDataset = pEnumDataset.Next()) != null)
{
IDataset newDataset = null;
newDataset = CreateFeatureDataset(pDataset, t_WsAPI);
if (newDataset == null)
{
continue;
}
List<string> listFeatureClass = new List<string>();
List<string> listFeatureClassNameList = new List<string>();
IEnumDataset ed = pDataset.Subsets;
if (ed != null)
{
IDataset dataset = ed.Next();
while (dataset != null)
{
if ((dataset as IFeatureClass) != null)
{
string featureClassName = dataset.BrowseName;
if (!string.IsNullOrWhiteSpace(featureClassName) && !listFeatureClass.Contains(featureClassName))
{
listFeatureClass.Add(System.IO.Path.Combine(pDataset.Workspace.PathName.ToString(), pDataset.BrowseName, featureClassName));
listFeatureClassNameList.Add(featureClassName);
}
}
Marshal.FinalReleaseComObject(dataset);
dataset = ed.Next();
}
}
if (listFeatureClass.Count > 0)
{
//GeoprocessorHelper iGeoprocessorHelper = new GeoprocessorHelper();
InsertMDBFeatureClassFromGDBFeatureClass(s_GDBFullPath, listFeatureClassNameList, t_targetPath, newDataset.BrowseName, null);
}
if (newDataset != null)
Marshal.FinalReleaseComObject(newDataset);
}
}
if (t_WsAPI.ExistFeatureClass("MJHZJCTJB_YJJBNTTB"))
t_WsAPI.DeleteFeatureClass("MJHZJCTJB_YJJBNTTB");//删除多余的表结构数据
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
finally
{
if (t_WsAPI != null)
{
t_WsAPI.CloseWorkspace();
}
if (s_WsAPI != null)
{
s_WsAPI.CloseWorkspace();
}
if (pEnumDataset != null)
{
Marshal.ReleaseComObject(pEnumDataset);
}
}
}
/// <summary>
/// 创建要素集
/// </summary>
/// <param name="pDataset"></param>
/// <param name="workspaceAPI"></param>
/// <returns></returns>
private IFeatureDataset CreateFeatureDataset(IDataset pDataset, WorkspaceAPI workspaceAPI)
{
try
{
IFeatureWorkspace targetWorkspac = workspaceAPI.CurrentWorkspace as IFeatureWorkspace;
object tst = workspaceAPI.CurrentWorkspace;
ISpatialReference SpatialReference = new UnknownCoordinateSystemClass();
IControlPrecision2 pCP = SpatialReference as IControlPrecision2;
//要素分辨率
ISpatialReferenceResolution spatialReferenceResolution = SpatialReference as ISpatialReferenceResolution;
spatialReferenceResolution.set_XYResolution(false, 0.000005);
spatialReferenceResolution.set_ZResolution(false, 0.000005);
//要素数据集容差
ISpatialReferenceTolerance spatialReferenceTolerance = SpatialReference as ISpatialReferenceTolerance;
double tolerance = 0;
if (double.TryParse(SysConfigsOprator.GetAppsetingValueByKey("Tolerance"), out tolerance))
{
spatialReferenceTolerance.XYTolerance = tolerance;
spatialReferenceTolerance.ZTolerance = tolerance;
spatialReferenceTolerance.MTolerance = tolerance;
}
else
{
spatialReferenceTolerance.XYTolerance = 0.0001;
spatialReferenceTolerance.ZTolerance = 0.0001;
spatialReferenceTolerance.MTolerance = 0.0001;
}
SpatialReference.SetDomain(0, 45035996273.705, 0, 45035996273.705);
return targetWorkspac.CreateFeatureDataset("TDDC", SpatialReference);
}
catch (Exception ex)
{
LogAPI.Debug("异常原因: " + ex + " ; ");
throw ex;
}
}
/// <summary>
/// 创建FileMDB
/// </summary>
/// <param name="fullPath">路径名</param>
public static void CreateFileMDB(string fullPath, string gdbName)
{
string temp = SysAppPath.GetTemplatePath() + "Temp.mdb";
if (File.Exists(temp))
{
File.Copy(temp, fullPath);
}
}
/// <summary>
/// 从GDB中拷贝要素类插入到MDB中 2020-6-1 沈超
/// </summary>
/// <param name="sFromGDBPath">GDB地址</param>
/// <param name="iFeatureClassNameList">GDB中要拷贝的要素类名称列表</param>
/// <param name="iOutPutMDBPath">要插入到的MDB的地址路径</param>
/// <param name="sOutPutDataSetName">输出的数据集的名字</param>
/// <param name="sSpatialReference">输出坐标参考:如果不是要素集下的图层,则要赋坐标参考</param>
public void InsertMDBFeatureClassFromGDBFeatureClass(string sFromGDBPath, List<string> iFeatureClassNameList, string iOutPutMDBPath, string sOutPutDataSetName, string sSpatialReference = null)
{
IFeatureWorkspace fws_gdb = null;
IWorkspace ws_gdb = null;
WorkspaceAPI wsapi_gdb = null;
IFeatureClassAPI fcapi_gdb = null;
IFeatureClass fc_gdb = null;
IFeatureClass newFeatureClass = null;
IFeatureWorkspace fws_mdb = null;
int iAddSuccessCount = 0;
int iAddFailCount = 0;
bool bFC2FCResult_Temp = false;
int iFCToFCType = 0;//fc2fc类型(0不涉及到数据集的方式 1涉及到数据集的方式)
try
{
iFCToFCType = string.IsNullOrWhiteSpace(sOutPutDataSetName) == true ? 0 : 1;
if (string.IsNullOrWhiteSpace(sFromGDBPath) == true)
{
LogAPI.Debug("从GDB中拷贝要素类插入到MDB中 时失败,原因: GDB地址 为空 ; ");
throw new Exception("GDB地址 不能为空");
}
if (iFeatureClassNameList == null || iFeatureClassNameList.Count <= 0)
{
LogAPI.Debug("从GDB中拷贝要素类插入到MDB中 时失败,原因: GDB中要拷贝的要素类名称列表 为空 ; ");
throw new Exception("要转换的要素类 不能为空");
}
IWorkspaceFactory factoryAce = new AccessWorkspaceFactoryClass();
IPropertySet pset = new PropertySetClass();
pset.SetProperty("DATABASE", iOutPutMDBPath);
fws_mdb = factoryAce.Open(pset, 0) as IFeatureWorkspace;
if (fws_mdb == null)
{
throw new Exception("MDB地址 不能为空");
}
wsapi_gdb = new WorkspaceAPI(sFromGDBPath, WorkspaceTypeEnum.GDBFile);
fws_gdb = wsapi_gdb.CurrentWorkspace as IFeatureWorkspace;
ws_gdb = fws_gdb as IWorkspace;
for (int i = 0; i < iFeatureClassNameList.Count; i++)
{
fcapi_gdb = wsapi_gdb.OpenFeatureClass(iFeatureClassNameList[i]);
if (fcapi_gdb != null)
{
fc_gdb = fcapi_gdb.FeatureClass;
IGeoDataset geoDataset = fc_gdb as IGeoDataset;
if (iFCToFCType == 1)//fc2fc类型:1涉及到数据集的方式;
{
bFC2FCResult_Temp = Fc2Fc(fc_gdb, fws_mdb as IWorkspace, iFeatureClassNameList[i], sOutPutDataSetName, null);
#region 处理坐标参考系
IFeatureDataset dataSet = fws_mdb.OpenFeatureDataset(sOutPutDataSetName);
ISpatialReference sp = geoDataset.SpatialReference;
IGeoDataset pGeoDataset = dataSet as IGeoDataset;
IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;
if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)
{
pGeoDatasetSchemaEdit.AlterSpatialReference(sp);
}
Marshal.ReleaseComObject(dataSet);
Marshal.ReleaseComObject(pGeoDataset);
#endregion
}
else//fc2fc类型:0不涉及到数据集的方式;
{
bFC2FCResult_Temp = Fc2Fc(fc_gdb, fws_mdb as IWorkspace, iFeatureClassNameList[i], null);
#region 处理坐标参考系
newFeatureClass = fws_mdb.OpenFeatureClass(iFeatureClassNameList[i]);
IGeoDataset gdataset = newFeatureClass as IGeoDataset;
if (gdataset != null)
{
IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = gdataset as IGeoDatasetSchemaEdit;
if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)
{
pGeoDatasetSchemaEdit.AlterSpatialReference(geoDataset.SpatialReference);
}
}
#endregion
Marshal.ReleaseComObject(gdataset);
}
Marshal.ReleaseComObject(geoDataset);
if (bFC2FCResult_Temp == true)
{
iAddSuccessCount += 1;
}
else
{
iAddFailCount += 1;
}
}
}
return;
}
catch (Exception ex)
{
LogAPI.Debug("将要素类拷贝至MDB中失败,异常原因: " + ex + " ; ");
throw new Exception("GDB转化成MDB地址失败");
}
finally
{
if (fws_gdb != null)
{
Marshal.ReleaseComObject(fws_gdb);
fws_gdb = null;
}
if (ws_gdb != null)
{
ws_gdb = null;
}
if (wsapi_gdb != null)
{
wsapi_gdb.CloseWorkspace();
}
if (fcapi_gdb != null)
{
fcapi_gdb.CloseFeatureClass();
}
if (fc_gdb != null)
{
Marshal.ReleaseComObject(fc_gdb);
fc_gdb = null;
}
if (fws_mdb != null)
{
Marshal.ReleaseComObject(fws_mdb);
fws_mdb = null;
}
if (newFeatureClass != null)
{
Marshal.ReleaseComObject(newFeatureClass);
newFeatureClass = null;
}
}
}
public bool Fc2Fc(IFeatureClass pInFeatureClass, IWorkspace pOutWorkspace, string poutFatureName, string pOutDataSetName = null, IQueryFilter queryFilter = null)
{
try
{
if (pInFeatureClass == null || pOutWorkspace == null || string.IsNullOrEmpty(poutFatureName)) return false;
IFeatureClassName pInFeatureclassName;
IDataset pIndataset;
pIndataset = (IDataset)pInFeatureClass;
pInFeatureclassName = (IFeatureClassName)pIndataset.FullName;
IFeatureClassName pOutFeatureClassName;
IDatasetName pOutDatasetName;
IDataset pOutDataset;
pOutDataset = (IDataset)pOutWorkspace;
IEnumDatasetName dataset = pOutWorkspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
while ((pOutDatasetName = dataset.Next()) != null)
{
if (pOutDatasetName.Name == pOutDataSetName)
{
break;
}
}
pOutFeatureClassName = new FeatureClassNameClass() { Name = poutFatureName };
if (pOutDatasetName == null)
{
pOutDatasetName = (IDatasetName)pOutFeatureClassName;
pOutDatasetName.WorkspaceName = (IWorkspaceName)pOutDataset.FullName;
pOutDatasetName.Name = poutFatureName;
}
pOutFeatureClassName.FeatureDatasetName = pOutDatasetName;
IFields pInFields, pOutFields;
IFieldChecker pFieldChecker = new FieldCheckerClass();
IEnumFieldError pError;
pInFields = pInFeatureClass.Fields;
//pOutFields
pFieldChecker.Validate(pInFields, out pError, out pOutFields);
Console.WriteLine(pError);
IFeatureDataConverter one2another = new FeatureDataConverterClass();
try
{
if (pOutWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
{
one2another.ConvertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, null,
pOutFields, "", 1000, 0);
}
else
{
one2another.ConvertFeatureClass(pInFeatureclassName, queryFilter, pOutDatasetName as IFeatureDatasetName, pOutFeatureClassName, null, pOutFields, "", 1000, 0);
}
}
finally
{
Marshal.ReleaseComObject(one2another);
}
return true;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 修改文件的可读写
/// </summary>
/// <param name="T_Path"></param>
private void UpDataFileAttribute(string T_Path)
{
try
{
DirectoryInfo dirInfo = new DirectoryInfo(T_Path);
dirInfo.Attributes = FileAttributes.Normal | FileAttributes.Directory;
FileInfo fileInfo = new FileInfo(T_Path);
if (fileInfo.IsReadOnly)
{
File.SetAttributes(T_Path, FileAttributes.Normal);
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
}
/// <summary>
/// 根据区划代码获取县级名称
/// </summary>
/// <param name="Codes"></param>
/// <returns></returns>
public string GetXZQDic(string Codes)
{
IRDBHelper rdbHelper = null;
string CodeName = string.Empty;
try
{
string systemPath = SysAppPath.GetDataBasePath() + "System.mdb";
if (File.Exists(systemPath))
{
string connStr = SysConfigsOprator.GetDBConnectionByName("MDBOledbConnection");
connStr = string.Format(connStr, systemPath);
rdbHelper = RDBFactory.CreateDbHelper(connStr, DatabaseType.MSAccess);
string strSQL = "select OBJECTID AS ID, XZQ AS CODE,XZQMC AS NAME from XZQ Where XZQ LIKE '" + Codes + "%'";
DataTable dt = rdbHelper.ExecuteDatatable("Dic", strSQL, true);
if (dt != null)
{
CodeName = dt.Rows[0]["NAME"].ToString();
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
finally
{
if (rdbHelper != null)
{
rdbHelper.DisConnect();
}
}
return CodeName;
}
/// <summary>
/// 是否功能展示
/// </summary>
public override bool Enabled
{
get
{
ProjectInfo pTemp = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo);
if (pTemp == null)
{
return false;
}
else
{
if (string.IsNullOrWhiteSpace(pTemp.GetProjFilePath()))
{
return false;
}
else
{
return true;
}
}
}
}
}
}