using System; using System.Collections.Generic; using System.Linq; using System.Windows; using ESRI.ArcGIS.Geodatabase; using KGIS.Framework.Utils; using KGIS.Framework.Platform; using KGIS.Framework.Utils.Helper; using KGIS.Framework.Platform.Helper; using System.IO; using ESRI.ArcGIS.ADF; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using KGIS.Framework.Maps; using System.ComponentModel; using KGIS.Framework.OpenData.Control; using KGIS.Framework.OpenData.Filter; using Kingo.OpenData.Filter; using KGIS.Framework.OpenData.InterFace; using ESRI.ArcGIS.DataSourcesFile; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using System.Windows.Forms; using Kingo.PluginServiceInterface; using System.Runtime.InteropServices; using Kingo.Plugin.DataLoad.Model; using System.Xml; using UIShell.OSGi; using Kingo.PluginServiceInterface.Helper.VCT; using Kingo.PluginServiceInterface.Model; namespace Kingo.Plugin.DataLoad.View { /// /// FrmLoadDDTC.xaml 的交互逻辑 /// public partial class FrmLoadDDTCData : BaseWindow { public event EventHandler Set_BtnLoad_Activated; public event EventHandler Set_BtnLoad_UnActivated; public event EventHandler Close_FrmBaseDataLoad; public bool shutDown = false; private string ImportDataType { get; set; } private string layerTargetName = string.Empty; private List pSourceFeatureClasses = null; private string SourceMDBPath = null; private string pTargetGDBPath = string.Empty; public IMap pMap { get; set; } private IDataCatalogService _DataCatalog = null; private DDTCDataMapping _selectedDDTCData; /// /// 选择的变更数据 /// public DDTCDataMapping SelectedDDTCData { get { return _selectedDDTCData; } set { _selectedDDTCData = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedDDTCData")); } } protected internal virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public new event PropertyChangedEventHandler PropertyChanged; public FrmLoadDDTCData() { InitializeComponent(); if (MapsManager.Instance.MapService.GetProjectInfo() is ProjectInfo prj) { pTargetGDBPath = prj.ZLDatabase; } pMap = MapsManager.Instance.MapService.getAxMapControl().ActiveView.FocusMap; if (_DataCatalog == null) _DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService(); } /// /// 选择单独图层数据 /// /// /// private void btnSelectedDDTCData_Click(object sender, RoutedEventArgs e) { try { using (ComReleaser com = new ComReleaser()) { IWorkspaceFactory pWorkspaceFactory = null; IWorkspace pWorkspace = null; IFeatureWorkspace pFeatureWorkspace = null; IFeatureClass pSourceFeatureClass = null; OpenDataDialog pDialog = new OpenDataDialog(); ISpatialDataObjectFilter pOFilter = new FilterShapefiles();//Shape文件模式 pDialog.AddFilter(pOFilter, true); pOFilter = new FilterGeoDatabasePersonal();//MDB格式 pDialog.AddFilter(pOFilter, true); pOFilter = new FilterVCTFile();///VCT文件模式 pDialog.AddFilter(pOFilter, true); pOFilter = new FilterGeoDatabaseFile();//GDB格式 pDialog.AddFilter(pOFilter, true); pDialog.AllowMultiSelect = false; pDialog.Title = "选择单独图层数据"; pDialog.RestoreLocation = true; pDialog.StartLocation = pDialog.FinalLocation; DialogResult dialogResult = pDialog.ShowDialog(); if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) { ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart(); if (string.IsNullOrWhiteSpace(ImportDataType) || (ImportDataType != "VCT" && ImportDataType != "GDB" && ImportDataType != "MDB" && ImportDataType != "SHP")) { MessageHelper.Show("选择的数据路径有误,请根据过滤条件,重新选择数据库!!"); return; } if (ImportDataType == "SHP") { ImportDataType = "Shape"; } ProgressHelper.ShowProcessBar("正在打开数据文件..."); string fileName = string.Empty; if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape")) { pSourceFeatureClasses = new List(); for (int i = 0; i < pDialog.Selection.Count; i++) { pWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); pWorkspace = pWorkspaceFactory.OpenFromFile(Path.GetDirectoryName(pDialog.Selection[i].FullName), 0); pFeatureWorkspace = pWorkspace as IFeatureWorkspace; pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(pDialog.Selection[i].Name); pSourceFeatureClasses.Add(pSourceFeatureClass); fileName += pDialog.Selection[i].Name + ";"; } btnImportDataPath.EditValue = fileName; if (pSourceFeatureClasses.Count > 0) { SetShapeTableMapping(); } } else if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("VCT")) { btnImportDataPath.EditValue = pDialog.FinalLocation; string TempMDBFolderPath = Path.GetTempPath(); string TempMDBPath = Path.Combine(TempMDBFolderPath, string.Format("{0}.mdb", Path.GetFileNameWithoutExtension(pDialog.FinalLocation))); if (File.Exists(TempMDBPath)) { File.Delete(TempMDBPath); } ProgressHelper.ShowProcessBar("正在解析VCT文件... ..."); VCTToMDBHelper3 vcttomdb = new VCTToMDBHelper3(); vcttomdb.RootPath = TempMDBFolderPath; vcttomdb.VCTToMDB(pDialog.FinalLocation); ProgressHelper.CloseProcessBar(); if (!File.Exists(TempMDBPath)) { MessageHelper.ShowError("VCT文件解析失败"); return; } SourceMDBPath = TempMDBPath; SetTableMapping(); } else { btnImportDataPath.EditValue = pDialog.FinalLocation; SetTableMapping(); } ProgressHelper.CloseProcessBar(); } com.ManageLifetime(pWorkspaceFactory); com.ManageLifetime(pWorkspace); com.ManageLifetime(pFeatureWorkspace); } } catch (Exception ex) { LogAPI.Debug("选择单独图层数据失败:" + ex); ProgressHelper.CloseProcessBar(); MessageHelper.ShowTips("选择单独图层数据失败:" + ex); } } private void SetShapeTableMapping() { IWorkspaceAPI t_WsAPI = null; IFeatureClassAPI t_FCAPI = null; try { dgTableMapping.ItemsSource = null; string t_GdbPath = pTargetGDBPath; if (t_GdbPath == string.Empty) { MessageHelper.ShowTips("未找到工程数据文件,请检查工程数据文件是否与工程文件处于同一目录下!"); return; } if (t_GdbPath.ToLower().EndsWith(".gdb")) { t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } Dictionary t_TbList = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset); Dictionary t_TbList2 = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass); #region 将目标图层作为字典项可进行下拉选择 List dicTable = new List(); dicTable.Add(new DataDicTionary() { NAME = "Null", CODE = "null" }); dicTable.Add(new DataDicTionary() { NAME = "追加图层", CODE = "Add" }); foreach (string item in t_TbList.Keys) { t_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList[item]); dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList[item], REMARK = t_FCAPI.FeatureClass.ShapeType.ToString() }); t_FCAPI.CloseFeatureClass(); } foreach (string item in t_TbList2.Keys) { t_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList2[item]); dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList2[item], REMARK = t_FCAPI.FeatureClass.ShapeType.ToString() }); t_FCAPI.CloseFeatureClass(); } #endregion List MappingList = new List(); foreach (IFeatureClass pSourceFeatureClass in pSourceFeatureClasses) { // pSourceFeatureClass.CheckArea(); DDTCDataMapping mapping = new DDTCDataMapping(); mapping.State = TBState.Waiting; mapping.S_TableName = (pSourceFeatureClass as FeatureClass).Name; mapping.S_TableAliasName = pSourceFeatureClass.AliasName; mapping.PropertyChanged2 += mapping_PropertyShapeChanged2; mapping.S_Spatial = (pSourceFeatureClass as IGeoDataset).SpatialReference.Name; mapping.S_TableType = pSourceFeatureClass.ShapeType.ToString(); DataDicTionary dic = dicTable.FirstOrDefault(f => f.NAME == (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName) || f.CODE == (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName)); if (dic != null) { mapping.T_TableAliasName = dic.NAME; mapping.T_TableName = dic.CODE; mapping.T_TableType = dic.REMARK; } else { dic = dicTable.Find(f => f.NAME == string.Format("基础_{0}", (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName)) || f.CODE == string.Format("JC_{0}", (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName))); if (dic != null) { mapping.T_TableAliasName = dic.NAME; mapping.T_TableName = dic.CODE; mapping.T_TableType = dic.REMARK; } } mapping.T_TableList = dicTable.Where(w => w.REMARK == mapping.S_TableType || w.CODE == "null" || w.CODE == "Add").ToList(); SetShapeDefaultFieldMapping(mapping, t_WsAPI); MappingList.Add(mapping); } dgTableMapping.ItemsSource = MappingList; JudgeIsTheSameSpatialReference(); } catch (Exception ex) { LogAPI.Debug("获取单独图层列表数据失败:" + ex); MessageHelper.Show("获取单独图层列表数据失败:" + ex); } finally { if (t_WsAPI != null) t_WsAPI.CloseWorkspace(); } } private void SetTableMapping() { IWorkspaceAPI t_WsAPI = null; IWorkspaceAPI s_WsAPI = null; IFeatureClassAPI s_FCAPI = null; try { dgTableMapping.ItemsSource = null; string s_MdbPath = null; if (ImportDataType == "VCT") { s_MdbPath = SourceMDBPath; } else { s_MdbPath = btnImportDataPath.EditValue.ToString(); } if ((ImportDataType == "MDB" || ImportDataType == "VCT") && !File.Exists(s_MdbPath)) { ProgressHelper.CloseProcessBar(); MessageHelper.ShowTips("请确保文件存在,并且为mdb文件!"); return; } else if (ImportDataType == "GDB" && !Directory.Exists(s_MdbPath)) { ProgressHelper.CloseProcessBar(); MessageHelper.ShowTips("请确保GDB文件夹存在!"); return; } if (ImportDataType == "MDB" || ImportDataType == "VCT") { FileInfo s_MdbPathInfo = new FileInfo(s_MdbPath); if (!s_MdbPathInfo.Extension.Equals(".mdb")) { ProgressHelper.CloseProcessBar(); MessageHelper.ShowTips("必须为mdb文件才能进行导入!"); return; } } string t_GdbPath = pTargetGDBPath; if (ImportDataType == "MDB" || ImportDataType == "VCT") { s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile); } else { s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile); } if (t_GdbPath.ToLower().EndsWith(".gdb")) { t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } Dictionary t_TbList = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset).Where(X => !X.Value.StartsWith("TDQSQ") && !X.Value.StartsWith("JC_CZCDYD")).ToDictionary(X => X.Key, Y => Y.Value);//周旺华 0424 排除TDQSQ导致的导入问题 Dictionary t_TbList2 = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass); List dicTable = new List(); dicTable.Add(new DataDicTionary() { NAME = "Null", CODE = "null" }); dicTable.Add(new DataDicTionary() { NAME = "追加图层", CODE = "Add" }); List excludeList = new List() { "地类图斑更新", "DLTBGX", "地类图斑更新过程", "DLTBGXGC", "行政区更新", "XZQGX", "行政区更新过程", "XZQGXGC", "村级调查区更新", "CJDCQGX", "村级调查区更新过程", "CJDCQGXGC", "行政区界线更新", "XZQJXGX", "村级调查区界线更新", "CJDCQJXGX", "城镇村等用地更新", "CZCDYDGX", "城镇村等用地更新过程", "CZCDYDGXGC" }; List OnlyLoadList = new List() { "工厂化种植更新","GCHZZGX", "坡度图更新", "PDTGX", "拆除未尽区更新", "CCWJQGX", "耕地等别更新", "GDDBGX", "光伏板区更新", "GFBQGX", "路面范围更新", "LMFWGX", "推土区更新", "TTQGX" }; foreach (string item in t_TbList.Keys) { if (!OnlyLoadList.Contains(item)) continue; s_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList[item]); dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList[item], REMARK = s_FCAPI.FeatureClass.ShapeType.ToString() }); } foreach (string item in t_TbList2.Keys) { s_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList2[item]); dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList2[item], REMARK = s_FCAPI.FeatureClass.ShapeType.ToString() }); } List s_TbList = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset).Where(x => !x.Value.StartsWith("TDQSQ")).Select(x => new KeyAndValue() { S_Key = x.Key, S_Value = x.Value }).ToList();//周旺华 0424 排除TDQSQ导致的导入问题 Dictionary s_TbList2 = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass); Dictionary s_TbList3 = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTTable); foreach (string item in s_TbList2.Keys) { if (!s_TbList.Select(x => x.S_Value).Contains(item)) s_TbList.Add(new KeyAndValue() { S_Key = item, S_Value = s_TbList2[item] }); } bool appzj = false; if (t_TbList != null && s_TbList != null) { List MappingList = new List(); var zjlist = s_TbList.Where(x => x.S_Value.EndsWith("ZJ")).ToList(); var zjcount = zjlist.Count(); if (zjcount == 1)//补充不足的注记图层 { appzj = true; var appzjcount = t_TbList.Values.Where(x => x.EndsWith("ZJ")).Count() - 1; var ofindex = s_TbList.IndexOf(s_TbList.SingleOrDefault(x => x.S_Value == "ZJ")); var templist = new List(); for (var i = 0; i < appzjcount; i++) { templist.Add(new KeyAndValue() { S_Key = zjlist[0].S_Key, S_Value = zjlist[0].S_Value }); } s_TbList.InsertRange(ofindex, templist); } var zjindex = 0; var tzjlist = dicTable.Where(x => x.CODE.EndsWith("ZJ")).ToList(); foreach (string key in s_TbList.Select(x => x.S_Key)) { var keyvalue = s_TbList.FirstOrDefault(x => x.S_Key == key).S_Value; //if (excludeList.Contains(key)) continue; if (!OnlyLoadList.Contains(key)) continue; DDTCDataMapping mapping = new DDTCDataMapping(); mapping.PropertyChanged2 += mapping_PropertyChanged2; mapping.State = TBState.Waiting; mapping.S_TableName = keyvalue; mapping.S_TableAliasName = key; if (s_TbList3.Values.Contains(mapping.S_TableName)) { mapping.S_TableType = "Table"; } else { s_FCAPI = s_WsAPI.OpenFeatureClass(keyvalue); mapping.S_Spatial = (s_FCAPI.FeatureClass as IGeoDataset).SpatialReference.Name; mapping.S_TableType = s_FCAPI.FeatureClass.ShapeType.ToString(); s_FCAPI.CloseFeatureClass(); } DataDicTionary dic = dicTable.Find(f => f.NAME == key || f.CODE == keyvalue); if (appzj && keyvalue == "ZJ" && tzjlist.Count > 0) { dic = tzjlist[zjindex]; mapping.S_YSDM_SQL = "YSDM='" + GetRuleTableEntityByTableName(dic.CODE).YSDM + "'"; zjindex++; } if (dic != null) { mapping.T_TableAliasName = dic.NAME; mapping.T_TableName = dic.CODE; mapping.T_TableType = dic.REMARK; } mapping.T_TableList = dicTable.Where(w => w.REMARK == mapping.S_TableType || w.CODE == "null" || w.CODE == "Add").ToList(); SetDefaultFieldMapping(mapping, s_WsAPI, t_WsAPI); MappingList.Add(mapping); } dgTableMapping.ItemsSource = MappingList; } JudgeIsTheSameSpatialReference(); } catch (Exception ex) { LogAPI.Debug("获取单独图层列表数据失败:" + ex); MessageHelper.Show("获取单独图层列表数据失败:" + ex); } finally { if (s_WsAPI != null) s_WsAPI.CloseWorkspace(); if (t_WsAPI != null) t_WsAPI.CloseWorkspace(); if (s_FCAPI != null) { s_FCAPI.CloseFeatureClass(); s_FCAPI = null; } } } private void mapping_PropertyChanged2(object sender, PropertyChangedEventArgs e) { DDTCDataMapping maping = dgTableMapping.SelectedItem as DDTCDataMapping; if (maping != null) { maping.T_TableType = maping.S_TableType; SetDefaultFieldMapping(maping, null, null); dgFieldMapping.ItemsSource = maping.FieldMapping; } } private void mapping_PropertyShapeChanged2(object sender, PropertyChangedEventArgs e) { DDTCDataMapping maping = dgTableMapping.SelectedItem as DDTCDataMapping; if (maping != null) { maping.T_TableType = maping.S_TableType; SetShapeDefaultFieldMapping(maping, null); dgFieldMapping.ItemsSource = maping.FieldMapping; } } public void SetShapeDefaultFieldMapping(DDTCDataMapping tbMapping, IWorkspaceAPI pTargetWsAPI) { if (tbMapping.T_TableName == "Add") { return; } if (pTargetWsAPI == null) { string t_GdbPath = pTargetGDBPath; if (t_GdbPath.ToLower().EndsWith(".gdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } else { pTargetWsAPI = null; MessageHelper.ShowTips("无法识别的工程数据类型"); return; } } IFeatureClassAPI t_FcAPI = null; ITableAPI t_TBAPI = null; IFeatureClassAPI s_FcAPI = null; ITableAPI s_TBAPI = null; try { if (!string.IsNullOrWhiteSpace(tbMapping.S_TableName) && !string.IsNullOrWhiteSpace(tbMapping.T_TableName) && !tbMapping.T_TableName.Equals("NULL", StringComparison.OrdinalIgnoreCase)) { if (tbMapping.T_TableType.Equals("TABLE", StringComparison.OrdinalIgnoreCase)) { t_TBAPI = pTargetWsAPI.OpenTable(tbMapping.T_TableName); } else { t_FcAPI = pTargetWsAPI.OpenFeatureClass(tbMapping.T_TableName); } s_FcAPI = new FeatureClassAPI(pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(tbMapping.S_TableName) || p.AliasName.Equals(tbMapping.S_TableName)).Single()); List dicData = new List(); dicData.Add(new DataDicTionary() { DisplayName = "Null", NAME = "Null", CODE = "-1", REMARK = "" }); dicData.Add(new DataDicTionary() { DisplayName = "追加字段", NAME = "Add", CODE = "-2", REMARK = "" }); if (t_FcAPI != null) { for (int i = 0; i < t_FcAPI.FeatureClass.Fields.FieldCount; i++) { IField field = t_FcAPI.FeatureClass.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() }); } } else if (t_TBAPI != null) { for (int i = 0; i < t_TBAPI.ITable.Fields.FieldCount; i++) { IField field = t_TBAPI.ITable.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() }); } } if (s_FcAPI != null && s_FcAPI.FeatureClass != null) { List data = new List(); for (int i = 0; i < s_FcAPI.FeatureClass.Fields.FieldCount; i++) { IField field = s_FcAPI.FeatureClass.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; FieldMapping item = new FieldMapping(); item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName; item.S_FieldIndex = i; DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName)); if (dic != null) { item.T_FieldName = dic.DisplayName; item.T_FieldIndex = Convert.ToInt16(dic.CODE); } else { item.T_FieldIndex = -1; } item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.REMARK.Contains("Double") || f.REMARK.Contains("Integer") || f.CODE == "-1" || f.CODE == "-2"); data.Add(item); } tbMapping.FieldMapping = data; } else if (s_TBAPI != null && s_TBAPI.ITable != null) { List data = new List(); for (int i = 0; i < s_TBAPI.ITable.Fields.FieldCount; i++) { IField field = s_TBAPI.ITable.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; FieldMapping item = new FieldMapping(); item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName; item.S_FieldIndex = i; DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName)); if (dic != null) { item.T_FieldName = dic.DisplayName; item.T_FieldIndex = Convert.ToInt16(dic.CODE); } else { item.T_FieldIndex = -1; } item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.CODE == "-1" || f.CODE == "-2"); data.Add(item); } tbMapping.FieldMapping = data; } } } catch (Exception ex) { MessageHelper.ShowTips("操作异常!" + ex.Message); LogAPI.Debug(ex); } } #region 判断是否是一样的坐标参考系 /// /// 判断选中的数据参考坐标系是否和目标数据库一致 /// public void JudgeIsTheSameSpatialReference() { try { #region 判断参考坐标系是否一致 int iIsShape = 0; if (ImportDataType == "VCT") { iIsShape = 0; } else { if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape")) { iIsShape = 1; } else { if (ImportDataType == "GDB") { iIsShape = 0; } else { iIsShape = 0; } } } if (iIsShape == 0) { JudgeIsTheSameSpatialReference_UnShape(); } else { JudgeIsTheSameSpatialReference_Shape(); } string s_MdbPath_T = null; if (ImportDataType == "VCT") { s_MdbPath_T = SourceMDBPath; } else { s_MdbPath_T = btnImportDataPath.EditValue.ToString(); } if (string.IsNullOrWhiteSpace(s_MdbPath_T) == false) { if (this.Set_BtnLoad_Activated != null) { this.Set_BtnLoad_Activated(null, null); } } else { if (this.Set_BtnLoad_UnActivated != null) { this.Set_BtnLoad_UnActivated(null, null); } } #endregion } catch (Exception ex) { LogAPI.Debug("判断选中的数据参考坐标系是否和目标数据库一致 时失败,异常原因: " + ex + " ; "); } } /// /// 判断选中的数据参考坐标系是否和目标数据库一致-非Shape时 /// public void JudgeIsTheSameSpatialReference_UnShape() { List mapping = dgTableMapping.ItemsSource as List; IWorkspaceAPI pSourceWsAPI = null; IWorkspaceAPI pTargetWsAPI = null; try { if (shutDown) { MessageHelper.Show("当前状态是 shutDown,故无法导入!"); ResetImport(); return; } string s_MdbPath = null; if (ImportDataType == "VCT") { s_MdbPath = SourceMDBPath; } else { s_MdbPath = btnImportDataPath.EditValue.ToString(); } string t_GdbPath = pTargetGDBPath; if (string.IsNullOrWhiteSpace(s_MdbPath) || string.IsNullOrWhiteSpace(t_GdbPath)) { MessageHelper.Show("导入数据或工程数据获取失败,故无法导入!"); ResetImport(); return; } if (ImportDataType == "MDB" || ImportDataType == "VCT" || ImportDataType == "DCSJ") { if (!File.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath)) { MessageHelper.Show("导入数据或工程数据获取失败,故无法导入!"); ResetImport(); return; } pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile); } else { if (!Directory.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath)) { MessageHelper.Show("导入数据或工程数据获取失败,故无法导入!"); ResetImport(); return; } pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile); } if (t_GdbPath.ToLower().EndsWith(".gdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } if (mapping != null) { //循环导入要素类 string message = string.Empty; string errorMessage = string.Empty; //设置图层验证成功,失败变量 int SuccessJudgeLayerCount = 0; int FailJudgeLayerCount = 0; foreach (DDTCDataMapping table in mapping) { if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null") { //LogAPI.Debug("为空的不处理的 表源名称: " + table.S_TableName + " ; "); //LogAPI.Debug("为空的不处理的 表源类型: " + table.S_TableType + " ; "); continue; } if (JudgeData_UnShape(table, pSourceWsAPI, pTargetWsAPI, ref message, ref errorMessage, ref FailJudgeLayerCount) == true) { SuccessJudgeLayerCount += 1; } } string sErrorShowMsg = ""; if (string.IsNullOrWhiteSpace(message) == false) { message = message.Substring(0, message.Length - 1); sErrorShowMsg += "表名为: " + message + "的数据 坐标系与工程坐标系不一致,故无法导入!"; } if (FailJudgeLayerCount > 0 || string.IsNullOrWhiteSpace(errorMessage) == false) { sErrorShowMsg += "验证失败的表数量: " + FailJudgeLayerCount + " 个; "; sErrorShowMsg += "失败原因如下: " + errorMessage + " ; "; } if (!string.IsNullOrWhiteSpace(sErrorShowMsg)) { MessageHelper.Show(sErrorShowMsg, false); ResetImport(); } } return; } catch (Exception ex) { LogAPI.Debug("验证 " + ImportDataType + " 数据时失败,异常原因: " + ex + " ; "); throw ex; } finally { if (pSourceWsAPI != null) { pSourceWsAPI.CloseWorkspace(); } if (pTargetWsAPI != null) { pTargetWsAPI.CloseWorkspace(); } if (mapping != null && mapping.Count() > 0) { mapping = null; } } } /// /// 判断选中的数据参考坐标系是否和目标数据库一致-非Shape时---主方法 /// /// /// /// /// /// /// /// private bool JudgeData_UnShape( DDTCDataMapping pTbMaping, IWorkspaceAPI pSourceWsAPI, IWorkspaceAPI pTargetWsAPI, ref string message, ref string errorMessage, ref int FailJudgeLayerCount) { if (pSourceWsAPI == null || pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null) { FailJudgeLayerCount++; errorMessage += (pTbMaping.S_TableName + "表失败原因: 导入数据或工程数据 工作空间获取失败 ; "); return false; } IFeatureClassAPI t_FcAPI = null; IFeatureClassAPI s_FcAPI = null; try { if (pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI.CurrentWorkspace == null) { FailJudgeLayerCount++; errorMessage += (pTbMaping.S_TableName + "表失败原因: 导入数据或工程数据 工作空间获取失败 ; "); return false; } if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName)) { if (pTbMaping.S_TableType.ToUpper() != "TABLE") { s_FcAPI = pSourceWsAPI.OpenFeatureClass(pTbMaping.S_TableName); } if (pTbMaping.T_TableName != "Add") { if (pTbMaping.T_TableType.ToUpper() != "TABLE") { t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName); } } //判断坐标参考是否一致 if (t_FcAPI != null && s_FcAPI != null && (t_FcAPI.FeatureClass as IGeoDataset) != null && (s_FcAPI.FeatureClass as IGeoDataset) != null) { bool isEqual = KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare( (t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (s_FcAPI.FeatureClass as IGeoDataset).SpatialReference ); if (!isEqual) { message += pTbMaping.S_TableAliasName + ","; return false; } } return true; } else { FailJudgeLayerCount++; errorMessage += (pTbMaping.S_TableName + "表失败原因:此导入数据表表名或者工程目标数据表表名 获取失败 ; "); return false; } } catch (Exception ex) { FailJudgeLayerCount++; errorMessage += (pTbMaping.S_TableName + "表验证是否坐标参考系一致 时失败,异常原因: " + ex + " ; "); return false; } finally { if (t_FcAPI != null) t_FcAPI.CloseFeatureClass(); if (s_FcAPI != null) s_FcAPI.CloseFeatureClass(); } } /// /// 判断选中的数据参考坐标系是否和目标数据库一致-Shape时 /// public void JudgeIsTheSameSpatialReference_Shape() { IWorkspaceAPI pTargetWsAPI = null; try { if (shutDown) { MessageHelper.Show("当前状态是 shutDown,故无法导入!"); ResetImport(); return; } string t_GdbPath = pTargetGDBPath; if (string.IsNullOrWhiteSpace(t_GdbPath) || !Directory.Exists(t_GdbPath)) { //MessageHelper.ShowTips("未找到当前工程数据库"); MessageHelper.Show("未找到当前工程数据库,故无法导入!"); ResetImport(); return; } if (t_GdbPath.ToLower().EndsWith(".gdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } List mapping = dgTableMapping.ItemsSource as List; if (mapping != null) { //循环判断要素类 string message = string.Empty; string erroeMessage = string.Empty; //设置图层验证成功,失败变量 int SuccessJudgeLayerCount = 0; int FailJudgeLayerCount = 0; foreach (DDTCDataMapping table in mapping) { if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null") { continue; } if (JudgeData_Shape(table, pTargetWsAPI, ref message, ref erroeMessage, ref FailJudgeLayerCount) == true) { SuccessJudgeLayerCount += 1; } } string sErrorShowMsg = ""; if (string.IsNullOrWhiteSpace(message) == false) { message = message.Substring(0, message.Length - 1); sErrorShowMsg += "表名为: " + message + "的数据 坐标系与工程坐标系不一致,故无法导入!"; } if (FailJudgeLayerCount > 0 || string.IsNullOrWhiteSpace(erroeMessage) == false) { sErrorShowMsg += "验证失败的表数量: " + FailJudgeLayerCount + " 个; "; sErrorShowMsg += "失败原因如下: " + erroeMessage + " ; "; } if (!string.IsNullOrWhiteSpace(sErrorShowMsg)) { MessageHelper.Show(sErrorShowMsg, false); ResetImport(); } } return; } catch (Exception ex) { LogAPI.Debug("验证 " + ImportDataType + " 数据时失败,异常原因: " + ex + " ; "); throw ex; } finally { if (pTargetWsAPI != null) { pTargetWsAPI.CloseWorkspace(); } } } /// /// 判断选中的数据参考坐标系是否和目标数据库一致-Shape时---主方法 /// /// /// /// /// /// /// private bool JudgeData_Shape( DDTCDataMapping pTbMaping, IWorkspaceAPI pTargetWsAPI, ref string message, ref string erroeMessage, ref int FailJudgeLayerCount) { if (pSourceFeatureClasses == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null) { FailJudgeLayerCount++; erroeMessage += (pTbMaping.S_TableName + "表失败原因:此导入数据表表名或者工程目标数据表表名 获取失败 ; "); return false; } IFeatureClassAPI t_FcAPI = null; IFeatureClass pSourceFeatureClass = null; string currentFiled = string.Empty; try { if (pTargetWsAPI.CurrentWorkspace == null) { FailJudgeLayerCount++; erroeMessage += (pTbMaping.S_TableName + "表失败原因:当前工程工作空间 获取失败 ; "); return false; } if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName)) { pSourceFeatureClass = pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(pTbMaping.S_TableName) || p.AliasName.Equals(pTbMaping.S_TableName)).Single(); if (pSourceFeatureClass == null) { FailJudgeLayerCount++; erroeMessage += (pTbMaping.S_TableName + "表失败原因:表元素 获取失败 ; "); return false; } if (pTbMaping.T_TableName != "Add") { t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName); } //判断坐标参考是否一致 if (t_FcAPI != null && (t_FcAPI.FeatureClass as IGeoDataset) != null && (pSourceFeatureClass as IGeoDataset) != null) { bool isEqual = KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare( (t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (pSourceFeatureClass as IGeoDataset).SpatialReference ); if (!isEqual) { message += pTbMaping.S_TableAliasName + ","; return false; } } return true; } else { FailJudgeLayerCount++; erroeMessage += (pTbMaping.S_TableName + "表失败原因:此导入数据表表名或者工程目标数据表表名 获取失败 ; "); return false; } } catch (Exception ex) { FailJudgeLayerCount++; erroeMessage += (pTbMaping.S_TableName + "表验证是否坐标参考系一致 时失败,异常原因: " + ex + " ; "); return false; } finally { if (t_FcAPI != null) t_FcAPI.CloseFeatureClass(); } } /// /// 重置导入 /// public void ResetImport() { try { //将选中的数据源地址清空 btnImportDataPath.EditValue = ""; //将映射关系置空 if (dgTableMapping != null) { if (dgTableMapping.ItemsSource != null) { dgTableMapping.ItemsSource = null; } dgTableMapping.UnselectAll(); dgTableMapping.RefreshData(); } if (dgFieldMapping != null) { if (dgFieldMapping.ItemsSource != null) { dgFieldMapping.ItemsSource = null; } } } catch (Exception ex) { LogAPI.Debug("重置 " + ImportDataType + " 的导入失败,异常原因: " + ex + " ; "); } } #endregion private void btnOK_Click(object sender, RoutedEventArgs e) { try { if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape")) { ExeSHP(); } else { Exe(); } } catch (Exception ex) { LogAPI.Debug("单独图层加载失败:" + ex); MessageHelper.Show("单独图层加载失败:" + ex); } } #region 导入GDB、MDB、Vct格式的数据 public void Exe() { List mapping = dgTableMapping.ItemsSource as List; this.btnOK.IsEnabled = false; IWorkspaceAPI pSourceWsAPI = null; IWorkspaceAPI pTargetWsAPI = null; try { if (btnImportDataPath.EditValue == null) { MessageHelper.ShowTips("请先选择要导入的 " + ImportDataType + " 数据"); return; } else { if (ImportDataType == "GDB") { if (Directory.Exists(btnImportDataPath.EditValue.ToString()) == false) { MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源"); btnImportDataPath.EditValue = ""; return; } else { if (btnImportDataPath.EditValue.ToString().ToLower().EndsWith(".gdb") == false) { MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源"); btnImportDataPath.EditValue = ""; return; } } } else//MDB/VCT/DCSJ { if (File.Exists(btnImportDataPath.EditValue.ToString()) == false) { MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源"); btnImportDataPath.EditValue = ""; return; } } } string s_MdbPath = null; if (ImportDataType == "VCT") { s_MdbPath = SourceMDBPath; } else { s_MdbPath = btnImportDataPath.EditValue.ToString(); } string t_GdbPath = pTargetGDBPath; if (string.IsNullOrWhiteSpace(s_MdbPath) || string.IsNullOrWhiteSpace(t_GdbPath)) { return; } if (ImportDataType == "MDB" || ImportDataType == "VCT" || ImportDataType == "DCSJ") { if (!File.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath)) { return; } pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile); } else { if (!Directory.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath)) { return; } pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile); } if (t_GdbPath.ToLower().EndsWith(".gdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } if (mapping != null) { //ILayer zltcGroup = MapsManager.Instance.MapService.GetGroupLayer("ZLTC");//获取增量图层组 //ILayer zltcGroup = MapsManager.Instance.MapService.GetGroupLayer("ZLCG");//获取增量图层组 //循环导入要素类 string message = string.Empty; string errorMessage = string.Empty; int SuccessImportLayerCount = 0; int DeletedImportLayerCount = 0; int FailImportLayerCount = 0; foreach (DDTCDataMapping table in mapping) { if (shutDown) { return; } if (table.State == TBState.Delete) continue; if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null") continue; dgTableMapping.SelectedItem = table; dgTableMapping.View.ScrollIntoView(dgTableMapping.SelectedItem); System.Windows.Forms.Application.DoEvents(); table.State = TBState.BeingImport; if (ImportData(table, pSourceWsAPI, pTargetWsAPI, ref message, ref errorMessage, ref FailImportLayerCount)) { table.State = TBState.EndImport; SuccessImportLayerCount++; //已存在图层,仅仅加入数据即可; //AddLayerToMap(pSourceWsAPI, zltcGroup, table); } else { table.State = TBState.Delete; DeletedImportLayerCount++; } } MapsManager.Instance.MapService.getAxMapControl().ActiveView.ContentsChanged(); MapsManager.Instance.MapService.getAxMapControl().ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground | esriViewDrawPhase.esriViewForeground | esriViewDrawPhase.esriViewGeography | esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGraphics | esriViewDrawPhase.esriViewGraphicSelection, null, MapsManager.Instance.MapService.getAxMapControl().ActiveView.Extent); MapsManager.Instance.MapService.getAxMapControl().Refresh(); Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "RefreshLayer" }); try { SaveProject(); } catch (Exception ex) { LogAPI.Debug("添加图层到地图时发生异常:" + ex); } this.btnOK.IsEnabled = true; if (!string.IsNullOrWhiteSpace(message)) { message = message.Substring(0, message.Length - 1); MessageHelper.ShowTips(message + "坐标系与工程坐标系不一致,无法导入!"); } if (!string.IsNullOrWhiteSpace(errorMessage)) { int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount; errorMessage = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount, DeletedImportLayerCount, FailImportLayerCount) + errorMessage; MessageHelper.Show(errorMessage, true); } else { int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount; message = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount, DeletedImportLayerCount, FailImportLayerCount) + message; MessageHelper.Show(message, true); } //这里设置关闭 if (this.Close_FrmBaseDataLoad != null) { this.Close_FrmBaseDataLoad(null, null); } } } catch (Exception ex) { LogAPI.Debug(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex)); MessageHelper.Show(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex)); } finally { this.btnOK.IsEnabled = true; if (pSourceWsAPI != null) { pSourceWsAPI.CloseWorkspace(); } if (pTargetWsAPI != null) { pTargetWsAPI.CloseWorkspace(); } if (mapping != null && mapping.Count() > 0) { mapping = null; } } } private bool ImportData(DDTCDataMapping pTbMaping, IWorkspaceAPI pSourceWsAPI, IWorkspaceAPI pTargetWsAPI, ref string message, ref string errorMessage, ref int FailImportLayerCount) { if (pSourceWsAPI == null || pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null) return false; IFeatureClassAPI t_FcAPI = null; ITableAPI t_TbAPI = null; IFeatureClassAPI s_FcAPI = null; ITableAPI s_TbAPI = null; EngineEditor editor = null; string currentFiled = string.Empty; try { if (pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI.CurrentWorkspace == null) return false; if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName)) { if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor = new EngineEditorClass(); if (editor.EditState != esriEngineEditState.esriEngineStateEditing) { editor.StartEditing(pTargetWsAPI.CurrentWorkspace, pMap); } } if (pTbMaping.S_TableType.ToUpper() == "TABLE") { s_TbAPI = pSourceWsAPI.OpenTable(pTbMaping.S_TableName); } else { s_FcAPI = pSourceWsAPI.OpenFeatureClass(pTbMaping.S_TableName); } if (pTbMaping.T_TableName == "Add") { if (s_FcAPI != null) { IFields fields = null; GeoDBAPI.CreateFields(s_FcAPI.FeatureClass.Fields, out fields); IGeoDataset ds = s_FcAPI.FeatureClass as IGeoDataset; if (fields != null && ds != null) { t_FcAPI = pTargetWsAPI.CreateFeatureClass(pTbMaping.S_TableName, ds.SpatialReference, fields); pTbMaping.T_TableName = pTbMaping.S_TableName; pTbMaping.T_TableType = pTbMaping.S_TableType; SetDefaultFieldMapping(pTbMaping, pSourceWsAPI, pTargetWsAPI); } } else if (s_TbAPI != null) { IFields fields = null; GeoDBAPI.CreateFields(s_TbAPI.ITable.Fields, out fields); IGeoDataset ds = s_FcAPI.FeatureClass as IGeoDataset; if (fields != null && ds != null) { t_TbAPI = pTargetWsAPI.CreateTable(pTbMaping.S_TableName, fields); pTbMaping.T_TableType = pTbMaping.S_TableType; SetDefaultFieldMapping(pTbMaping, pSourceWsAPI, pTargetWsAPI); } } } else { if (pTbMaping.T_TableType.ToUpper() == "TABLE") { t_TbAPI = pTargetWsAPI.OpenTable(pTbMaping.T_TableName); } else { t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName); } } //判断坐标参考是否一致 if (t_FcAPI != null && s_FcAPI != null && (t_FcAPI.FeatureClass as IGeoDataset) != null && (s_FcAPI.FeatureClass as IGeoDataset) != null) { bool isEqual = KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare((t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (s_FcAPI.FeatureClass as IGeoDataset).SpatialReference); if (!isEqual) { message += pTbMaping.S_TableAliasName + ","; return false; } } #region 如果替换已有数据,则将已有数据删除 if (cbReplace.IsChecked == true) { if (t_FcAPI != null && t_FcAPI.FeatureClass != null) { //优化代码,提高效率29s左右 王欢 2019-03-25 //(t_FcAPI.FeatureClass as ITable).DeleteSearchedRows(null); IDataset pDataset = t_FcAPI.FeatureClass as IDataset; pDataset.Workspace.ExecuteSQL("delete from " + pDataset.BrowseName); } else if (t_TbAPI != null && t_TbAPI.ITable != null) { t_TbAPI.ITable.DeleteSearchedRows(null); } } #endregion ICursor s_Cursor = null; IQueryFilter queryFilter = new QueryFilterClass(); var counstwhere = false; if (string.IsNullOrWhiteSpace(pTbMaping.S_YSDM_SQL) == false) { counstwhere = true; queryFilter.WhereClause = pTbMaping.S_YSDM_SQL; } if (s_FcAPI != null) { s_Cursor = (ICursor)s_FcAPI.FeatureClass.Search(counstwhere ? queryFilter : null, true);//判断条件查询 int DataCount = s_FcAPI.FeatureClass.FeatureCount(null); pTbMaping.Count = DataCount; } else { s_Cursor = s_TbAPI.ITable.Search(counstwhere ? queryFilter : null, true);//判断条件查询 int DataCount = s_TbAPI.ITable.RowCount(null); pTbMaping.Count = DataCount; } int i = 0; if (t_FcAPI != null && t_FcAPI.FeatureClass != null) { IFeature feature = null; #region IFeatureClass #region 新增字段 List addFieldIndexs = new List(); if (pTbMaping.FieldMapping != null) { List addFields = pTbMaping.FieldMapping.FindAll(f => f.T_FieldIndex == -2); foreach (FieldMapping item in addFields) { IField f = s_FcAPI.FeatureClass.Fields.get_Field(item.S_FieldIndex); if (t_FcAPI.FeatureClass.FindField(f.Name) > -1) { t_FcAPI.AddField(f.Name + "_a", f.Type, f.AliasName); item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name + "_a"); } else { t_FcAPI.AddField(f.Name, f.Type, f.AliasName); item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name); } addFieldIndexs.Add(item.T_FieldIndex); } } #endregion IFeatureClass t_FC = t_FcAPI.FeatureClass; IDataset pDataset = t_FC as IDataset; IWorkspace pWs = pDataset.Workspace; IWorkspaceEdit pWsEdit = pWs as IWorkspaceEdit; //pWsEdit.StartEditing(true); pWsEdit.StartEditOperation(); IFeatureCursor t_FeatureCursor = t_FC.Insert(true); IFeatureBuffer newFeature = null; while ((feature = (s_Cursor as IFeatureCursor).NextFeature()) != null) { using (ComReleaser comReleaser = new ComReleaser()) { //if (newFeature == null) newFeature = t_FC.CreateFeatureBuffer(); newFeature.Shape = feature.ShapeCopy; if (pTbMaping.FieldMapping != null) { foreach (FieldMapping item in pTbMaping.FieldMapping) { if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0) continue; object val = feature.get_Value(item.S_FieldIndex); currentFiled = item.S_FieldName; bool canSetValue = false; switch (newFeature.Fields.get_Field(item.T_FieldIndex).Type) { case esriFieldType.esriFieldTypeSmallInteger: int intValue = 0; if (int.TryParse(val.ToString(), out intValue)) { canSetValue = true; //修改人:高山 修改时间:2018.12.4 修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度 val = intValue; } break; case esriFieldType.esriFieldTypeDouble: double doubleValue = 0; if (double.TryParse(val.ToString(), out doubleValue)) { canSetValue = true; //修改人:高山 修改时间:2018.12.4 修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度 val = doubleValue; } break; case esriFieldType.esriFieldTypeInteger: int integerValue = 0; if (int.TryParse(val.ToString(), out integerValue)) { canSetValue = true; //修改人:高山 修改时间:2018.12.4 修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度 val = integerValue; } break; case esriFieldType.esriFieldTypeDate: DateTime dateTimeValue; if (DateTime.TryParse(val.ToString(), out dateTimeValue)) { canSetValue = true; //修改人:高山 修改时间:2018.12.4 修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度 val = dateTimeValue; } break; case esriFieldType.esriFieldTypeString: canSetValue = true; if (string.IsNullOrWhiteSpace(val.ToString())) { val = DBNull.Value; } break; default: canSetValue = true; break; } if (canSetValue) { if (val is int) { if ((int)val == 0) continue; } if (val is double) { if ((currentFiled == "扣除地类系数" || currentFiled == "扣除地类面积") && (double)val == 0)//解决禅道问题 25839 扣除地类系数与扣除地类面积字段为0,导入表中也要为0 { newFeature.set_Value(item.T_FieldIndex, val); } else if ((double)val == 0) continue; } newFeature.set_Value(item.T_FieldIndex, val); } else //20190123 周旺华 未处理数据直接赋为DBNull.Value { newFeature.set_Value(item.T_FieldIndex, DBNull.Value); } } } t_FeatureCursor.InsertFeature(newFeature); comReleaser.ManageLifetime(feature); } i++; if (i % 1000 == 0 || i == pTbMaping.Count) { pTbMaping.Progress = i; System.Windows.Forms.Application.DoEvents(); } } if (newFeature != null) { t_FeatureCursor.Flush(); Marshal.ReleaseComObject(newFeature); } Marshal.ReleaseComObject(t_FeatureCursor); pWsEdit.StopEditOperation(); #endregion } else if (t_TbAPI != null && t_TbAPI.ITable != null) { #region ITable IRow s_Row = null; ICursor t_Cursor = t_TbAPI.ITable.Insert(true); IRowBuffer t_RowBuffer = null; while ((s_Row = s_Cursor.NextRow()) != null) { using (ComReleaser comReleaser = new ComReleaser()) { if (t_RowBuffer == null) t_RowBuffer = t_TbAPI.ITable.CreateRowBuffer(); foreach (FieldMapping item in pTbMaping.FieldMapping) { if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0) { continue; } t_RowBuffer.set_Value(item.T_FieldIndex, s_Row.get_Value(item.S_FieldIndex)); } t_Cursor.InsertRow(t_RowBuffer); ComReleaser.ReleaseCOMObject(s_Row); } i++; if (i % 100 == 0 || i == pTbMaping.Count) { pTbMaping.Progress = i; System.Windows.Forms.Application.DoEvents(); } } if (t_RowBuffer != null) { t_Cursor.Flush(); Marshal.ReleaseComObject(t_RowBuffer); } Marshal.ReleaseComObject(t_Cursor); #endregion } Marshal.ReleaseComObject(s_Cursor); return true; } return false; } catch (Exception ex) { if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor.AbortOperation(); } FailImportLayerCount++; errorMessage += (pTbMaping.S_TableName + "表,字段" + currentFiled + "数据导入异常!" + ex.Message); return false; } finally { if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor.StopEditing(true); } if (t_TbAPI != null) t_TbAPI.CloseTable(); if (t_FcAPI != null) t_FcAPI.CloseFeatureClass(); if (s_TbAPI != null) s_TbAPI.CloseTable(); if (s_FcAPI != null) s_FcAPI.CloseFeatureClass(); } } private void AddLayerToMap(IWorkspaceAPI pSourceWsAPI, ILayer zltcGroup, DDTCDataMapping table) { try { if (pSourceWsAPI != null) { bool displayLayer = true; if (zltcGroup != null) { ICompositeLayer pComLayer = zltcGroup as ICompositeLayer; for (int i = 0; i < pComLayer.Count; i++) { ILayer layer = pComLayer.Layer[i]; if ((layer as IDataset).BrowseName == table.S_TableName) { displayLayer = false; continue; } } } IFeatureClassAPI s_FcAPI = pSourceWsAPI.OpenFeatureClass(table.S_TableName); if (s_FcAPI != null && s_FcAPI.FeatureClass != null && displayLayer == true) { IFeatureLayer pTargetLayer = new FeatureLayer(); pTargetLayer.FeatureClass = s_FcAPI.FeatureClass; pTargetLayer.Name = table.T_TableAliasName; ILegendInfo pLegendInfo = pTargetLayer as ILegendInfo; int legendGroupCount = pLegendInfo.LegendGroupCount; ILegendGroup pLGroup; for (int i = 0; i < legendGroupCount; i++) { pLGroup = pLegendInfo.get_LegendGroup(i); pLGroup.Visible = false; } (zltcGroup as IGroupLayer).Add(pTargetLayer); } } } catch (Exception ex) { LogAPI.Debug("图层添加至mxd失败" + ex); } } #endregion #region 导入shp格式的数据 public void ExeSHP() { IWorkspaceAPI pTargetWsAPI = null; this.btnOK.IsEnabled = false; try { string str = "1234567890"; string t_GdbPath = pTargetGDBPath; if (string.IsNullOrWhiteSpace(t_GdbPath) || !Directory.Exists(t_GdbPath)) { MessageHelper.ShowTips("未找到当前工程数据库"); return; } if (t_GdbPath.ToLower().EndsWith(".gdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } List mapping = dgTableMapping.ItemsSource as List; if (mapping != null) { //ILayer zltcGroups = MapsManager.Instance.MapService.GetGroupLayer("ZLCG");//获取增量图层组 //LayerCfg GroupLayerInfo = null; //if (_DataCatalog != null) //{ // _DataCatalog.GetNodeByLayer(zltcGroups); // LayerCfg rootLayer = _DataCatalog.CurrentLayers as LayerCfg; // List AllLayers = rootLayer.GetAllItem(); // GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == "增量图层"); //} //循环导入要素类 string message = string.Empty; string erroeMessage = string.Empty; foreach (DDTCDataMapping table in mapping) { //增加控制,以数字开头的图层不能追加到当前工程。对应bug11125 if (str.Contains(table.S_TableName.Substring(0, 1)) && table.T_TableName == "Add") { MessageHelper.ShowTips("以数字开头的图层不能追加到当前工程!"); return; } if (shutDown) { break; } if (table.State == TBState.Delete) continue; if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null") continue; dgTableMapping.SelectedItem = table; dgTableMapping.View.ScrollIntoView(dgTableMapping.SelectedItem); System.Windows.Forms.Application.DoEvents(); table.State = TBState.BeingImport; if (ImportData(table, pTargetWsAPI, ref message, ref erroeMessage)) { table.State = TBState.EndImport; //当前的变更/增量数据中的单独图层都已经存在的,不需要重新添加,导入数据即可; //AddShpLayerToMap(GroupLayerInfo, table, pTargetWsAPI); } else { table.State = TBState.Delete; } } //目录刷新 展开 试图刷新 //if (_DataCatalog != null) //{ // if (GroupLayerInfo.Layers.Count > 0) // GroupLayerInfo.Expanded = true; // _DataCatalog.UpdateTree(); //} MapsManager.Instance.MapService.getAxMapControl().Refresh(); try { SaveProject();//保存加载的图斑 } catch (Exception ex) { LogAPI.Debug("添加图层到地图时发生异常:" + ex); } this.btnOK.IsEnabled = true; if (!string.IsNullOrWhiteSpace(message)) { message = message.Substring(0, message.Length - 1); MessageHelper.ShowTips(message + "坐标系与工程坐标系不一致,无法导入!"); } if (!string.IsNullOrWhiteSpace(erroeMessage)) { MessageHelper.ShowTips(erroeMessage); } if (string.IsNullOrWhiteSpace(message) && string.IsNullOrWhiteSpace(erroeMessage)) { MessageHelper.ShowTips("导入完成!"); } //这里设置关闭 this.Close_FrmBaseDataLoad?.Invoke(null, null); } else { if (btnImportDataPath.EditValue == null) { MessageHelper.ShowTips("请先选择 Shape 数据源"); } else { string s_MdbPath_T2 = btnImportDataPath.EditValue.ToString(); if (string.IsNullOrWhiteSpace(s_MdbPath_T2) == true) { MessageHelper.ShowTips("请先选择 Shape 数据源"); } else { if (Directory.Exists(s_MdbPath_T2) == false) { MessageHelper.ShowTips("选择的 Shape 数据源不存在"); btnImportDataPath.EditValue = ""; } else { //判断目录下有没有shape文件 string[] strFiles = Directory.GetFiles(s_MdbPath_T2); int iFileDirs = strFiles.Count(); List ShapeFileNameList = strFiles.ToList(); if (ShapeFileNameList == null || ShapeFileNameList.Count <= 0) { MessageHelper.ShowTips("Shape 数据源不能为空"); btnImportDataPath.EditValue = ""; } else { bool bHaveShp = false; foreach (string strFile in strFiles) { if (strFile.ToLower().EndsWith(".shp") == true) { bHaveShp = true; break; } } if (bHaveShp == false) { MessageHelper.ShowTips("Shape 数据源不能为空"); btnImportDataPath.EditValue = ""; } } } } } } } catch (Exception ex) { LogAPI.Debug(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex)); MessageHelper.Show(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex)); } finally { this.btnOK.IsEnabled = true; if (pSourceFeatureClasses != null && pSourceFeatureClasses.Count > 0) { using (ComReleaser com = new ComReleaser()) { foreach (IFeatureClass item in pSourceFeatureClasses) { com.ManageLifetime(item); } } } if (pTargetWsAPI != null) { pTargetWsAPI.CloseWorkspace(); } } } private bool ImportData(DDTCDataMapping pTbMaping, IWorkspaceAPI pTargetWsAPI, ref string message, ref string erroeMessage) { if (pSourceFeatureClasses == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null) return false; IFeatureClassAPI t_FcAPI = null; IFeatureClass pSourceFeatureClass = null; EngineEditor editor = null; string currentFiled = string.Empty; try { if (pTargetWsAPI.CurrentWorkspace == null) return false; if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName)) { if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor = new EngineEditorClass(); if (editor.EditState != esriEngineEditState.esriEngineStateEditing) { editor.StartEditing(pTargetWsAPI.CurrentWorkspace, pMap); } } pSourceFeatureClass = pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(pTbMaping.S_TableName) || p.AliasName.Equals(pTbMaping.S_TableName)).Single(); if (pSourceFeatureClass == null) { return false; } if (pTbMaping.T_TableName == "Add") { IFields fields = null; GeoDBAPI.CreateFields(pSourceFeatureClass.Fields, out fields); IGeoDataset ds = pSourceFeatureClass as IGeoDataset; if (fields != null && ds != null) { t_FcAPI = pTargetWsAPI.CreateFeatureClass(pTbMaping.S_TableName, ds.SpatialReference, fields); pTbMaping.T_TableName = pTbMaping.S_TableName; pTbMaping.T_TableType = pTbMaping.S_TableType; SetShapeDefaultFieldMapping(pTbMaping, pTargetWsAPI); } } else { t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName); } //判断坐标参考是否一致 if (t_FcAPI != null && (t_FcAPI.FeatureClass as IGeoDataset) != null && (pSourceFeatureClass as IGeoDataset) != null) { //bool isEqual = GeoDBAPI.SpatialReferenceCompare((t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (pSourceFeatureClass as IGeoDataset).SpatialReference); if (!GeoDBAPI.SpatialReferenceCompare((t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (pSourceFeatureClass as IGeoDataset).SpatialReference)) { message += pTbMaping.S_TableAliasName + ","; return false; } } #region 如果替换已有数据,则将已有数据删除 if (cbReplace.IsChecked == true && t_FcAPI != null && t_FcAPI.FeatureClass != null) { (t_FcAPI.FeatureClass as ITable).DeleteSearchedRows(null); } #endregion ICursor s_Cursor = null; s_Cursor = (ICursor)pSourceFeatureClass.Search(null, true); int DataCount = pSourceFeatureClass.FeatureCount(null); pTbMaping.Count = DataCount; int i = 0; if (t_FcAPI != null && t_FcAPI.FeatureClass != null) { IFeature feature = null; #region IFeatureClass #region 新增字段 List addFieldIndexs = new List(); if (pTbMaping.FieldMapping != null) { List addFields = pTbMaping.FieldMapping.FindAll(f => f.T_FieldIndex == -2); foreach (FieldMapping item in addFields) { IField f = pSourceFeatureClass.Fields.get_Field(item.S_FieldIndex); if (t_FcAPI.FeatureClass.FindField(f.Name) > -1) { t_FcAPI.AddField(f.Name + "_a", f.Type, f.AliasName); item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name + "_a"); } else { t_FcAPI.AddField(f.Name, f.Type, f.AliasName); item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name); } addFieldIndexs.Add(item.T_FieldIndex); } } #endregion IFeatureClass t_FC = t_FcAPI.FeatureClass; IFeatureCursor t_FeatureCursor = t_FC.Insert(true); IFeatureBuffer newFeature = null; while ((feature = (s_Cursor as IFeatureCursor).NextFeature()) != null) { using (ComReleaser comReleaser = new ComReleaser()) { if (newFeature == null) newFeature = t_FC.CreateFeatureBuffer(); newFeature.Shape = feature.ShapeCopy; if (pTbMaping.FieldMapping != null) { foreach (FieldMapping item in pTbMaping.FieldMapping) { if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0) continue; object val = feature.get_Value(item.S_FieldIndex); currentFiled = item.S_FieldName; bool canSetValue = false; switch (newFeature.Fields.get_Field(item.T_FieldIndex).Type) { case esriFieldType.esriFieldTypeSmallInteger: int intValue = 0; if (int.TryParse(val.ToString(), out intValue)) { canSetValue = true; } break; case esriFieldType.esriFieldTypeDouble: double doubleValue = 0; if (double.TryParse(val.ToString(), out doubleValue)) { canSetValue = true; } break; case esriFieldType.esriFieldTypeInteger: int integerValue = 0; if (int.TryParse(val.ToString(), out integerValue)) { canSetValue = true; } break; case esriFieldType.esriFieldTypeDate: DateTime dateTimeValue; if (DateTime.TryParse(val.ToString(), out dateTimeValue)) { canSetValue = true; } break; case esriFieldType.esriFieldTypeString: canSetValue = true; if (string.IsNullOrWhiteSpace(val.ToString())) { val = DBNull.Value; } break; default: canSetValue = true; break; } if (canSetValue) { newFeature.set_Value(item.T_FieldIndex, val); } else { newFeature.set_Value(item.T_FieldIndex, null); } } } t_FeatureCursor.InsertFeature(newFeature); comReleaser.ManageLifetime(feature); } i++; if (i % 100 == 0 || i == pTbMaping.Count) { pTbMaping.Progress = i; System.Windows.Forms.Application.DoEvents(); } } if (newFeature != null) { t_FeatureCursor.Flush(); Marshal.ReleaseComObject(newFeature); } Marshal.ReleaseComObject(t_FeatureCursor); #endregion } Marshal.ReleaseComObject(s_Cursor); if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor.StopEditing(true); } return true; } return false; } catch (Exception ex) { if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor.AbortOperation(); } erroeMessage += (pTbMaping.S_TableName + "表,字段" + currentFiled + "数据导入异常!" + ex.Message); return false; } finally { if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { editor.StopEditing(true); } if (t_FcAPI != null) t_FcAPI.CloseFeatureClass(); } } private void AddShpLayerToMap(LayerCfg zltcGroup, DDTCDataMapping table, IWorkspaceAPI pTargetWsAPI) { try { if (pSourceFeatureClasses != null && pSourceFeatureClasses.Count != 0) { bool displayLayer = true; if (zltcGroup != null) { foreach (LayerCfg item in zltcGroup.Layers) { if (item.FcName == table.S_TableName) { displayLayer = false;//已存在不添加; break; } } } // IFeatureClass pSourceFeatureClass = pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(table.S_TableName) || p.AliasName.Equals(table.S_TableName)).Single(); //IFeatureClassAPI pSourceFeatureClass = pTargetWsAPI.OpenFeatureClass(table.T_TableName); if (pSourceFeatureClass != null && displayLayer == true) { IFeatureLayer pTargetLayer = new FeatureLayer { FeatureClass = pSourceFeatureClass, Name = table.T_TableAliasName }; ILegendInfo pLegendInfo = pTargetLayer as ILegendInfo; int legendGroupCount = pLegendInfo.LegendGroupCount; ILegendGroup pLGroup; for (int i = 0; i < legendGroupCount; i++) { pLGroup = pLegendInfo.get_LegendGroup(i); pLGroup.Visible = false; } _DataCatalog.AddLayer(pTargetLayer, zltcGroup); } } } catch (Exception ex) { LogAPI.Debug("图层添加至图层目录失败" + ex.Message); } } #endregion private void SaveProject() { try { Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" }); } catch (Exception ex) { LogAPI.Debug("添加图层到地图时发生异常,异常信息如下:"); LogAPI.Debug(ex); } } public void SetDefaultFieldMapping(DDTCDataMapping tbMapping, IWorkspaceAPI pSourceWsAPI, IWorkspaceAPI pTargetWsAPI) { if (tbMapping.T_TableName == "Add") { return; } if (pSourceWsAPI == null) { string s_MdbPath = null; if (ImportDataType == "VCT") { s_MdbPath = SourceMDBPath; } else { s_MdbPath = btnImportDataPath.EditValue.ToString(); } if (ImportDataType == "MDB" || ImportDataType == "VCT") { pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile); } else { pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile); } } if (pTargetWsAPI == null) { IFeatureClass pFeatureClass = null; if (pFeatureClass == null) { string t_GdbPath = pTargetGDBPath; if (t_GdbPath.ToLower().EndsWith(".gdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile); } else if (t_GdbPath.ToLower().EndsWith(".mdb")) { pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile); } } else { pTargetWsAPI = new WorkspaceAPI((pFeatureClass as FeatureClass).Workspace); } } IFeatureClassAPI t_FcAPI = null; ITableAPI t_TBAPI = null; IFeatureClassAPI s_FcAPI = null; ITableAPI s_TBAPI = null; try { if (!string.IsNullOrWhiteSpace(tbMapping.S_TableName) && !string.IsNullOrWhiteSpace(tbMapping.T_TableName) && !tbMapping.T_TableName.ToUpper().Equals("NULL")) { if (tbMapping.T_TableType.ToUpper() == "TABLE") { t_TBAPI = pTargetWsAPI.OpenTable(tbMapping.T_TableName); } else { t_FcAPI = pTargetWsAPI.OpenFeatureClass(tbMapping.T_TableName); } if (tbMapping.S_TableType.ToUpper() == "TABLE") { s_TBAPI = pTargetWsAPI.OpenTable(tbMapping.S_TableName); } else { s_FcAPI = pSourceWsAPI.OpenFeatureClass(tbMapping.S_TableName); } List dicData = new List(); dicData.Add(new DataDicTionary() { DisplayName = "Null", NAME = "Null", CODE = "-1", REMARK = "" }); dicData.Add(new DataDicTionary() { DisplayName = "追加字段", NAME = "Add", CODE = "-2", REMARK = "" }); if (t_FcAPI != null) { for (int i = 0; i < t_FcAPI.FeatureClass.Fields.FieldCount; i++) { IField field = t_FcAPI.FeatureClass.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() }); } } else if (t_TBAPI != null) { for (int i = 0; i < t_TBAPI.ITable.Fields.FieldCount; i++) { IField field = t_TBAPI.ITable.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() }); } } if (s_FcAPI != null && s_FcAPI.FeatureClass != null) { List data = new List(); for (int i = 0; i < s_FcAPI.FeatureClass.Fields.FieldCount; i++) { IField field = s_FcAPI.FeatureClass.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; FieldMapping item = new FieldMapping(); item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName; item.S_FieldIndex = i; DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName));//&& f.REMARK == field.Type.ToString() if (dic != null) { item.T_FieldName = dic.DisplayName; item.T_FieldIndex = Convert.ToInt16(dic.CODE); } else { item.T_FieldIndex = -1; } //item.PropertyType = enumPropertyType.ComboBox; item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.REMARK.Contains("Double") || f.REMARK.Contains("Integer") || f.CODE == "-1" || f.CODE == "-2"); data.Add(item); } tbMapping.FieldMapping = data; } else if (s_TBAPI != null && s_TBAPI.ITable != null) { List data = new List(); for (int i = 0; i < s_TBAPI.ITable.Fields.FieldCount; i++) { IField field = s_TBAPI.ITable.Fields.get_Field(i); if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; FieldMapping item = new FieldMapping(); item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName; item.S_FieldIndex = i; DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName));//&& f.REMARK == field.Type.ToString() if (dic != null) { item.T_FieldName = dic.DisplayName; item.T_FieldIndex = Convert.ToInt16(dic.CODE); } else { item.T_FieldIndex = -1; } //item.PropertyType = enumPropertyType.ComboBox; item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.CODE == "-1" || f.CODE == "-2"); data.Add(item); } tbMapping.FieldMapping = data; } } } catch (Exception ex) { MessageHelper.ShowTips("操作异常!" + ex.Message); LogAPI.Debug(ex); } } private void DgTableMapping_SelectedItemChanged(object sender, DevExpress.Xpf.Grid.SelectedItemChangedEventArgs e) { if (e.NewItem is TableMapping) { if ((e.NewItem as TableMapping).T_TableName == null || (e.NewItem as TableMapping).T_TableName.ToUpper().Equals("NULL")) { dgFieldMapping.ItemsSource = null; } else { dgFieldMapping.ItemsSource = (e.NewItem as TableMapping).FieldMapping; } } } /// /// 取消 /// /// /// private void btnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } private void chkSelectedAll_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e) { try { if (this.dgTableMapping == null || (dgTableMapping.ItemsSource as List) == null) { return; } List listTableMapping = (dgTableMapping.ItemsSource as List); bool check = (sender as DevExpress.Xpf.Editors.CheckEdit).IsChecked == null ? false : bool.Parse((sender as DevExpress.Xpf.Editors.CheckEdit).IsChecked.Value.ToString()); if (check) { listTableMapping.ForEach(x => x.State = TBState.Waiting); } else { listTableMapping.ForEach(x => x.State = TBState.Delete); } dgTableMapping.RefreshData(); } catch (Exception ex) { MessageHelper.ShowTips("全选发生异常:" + ex.Message); } } private void CheckBox_Click(object sender, RoutedEventArgs e) { DDTCDataMapping tbm = dgTableMapping.SelectedItem as DDTCDataMapping; if (tbm != null) { switch (tbm.State) { case TBState.Waiting: tbm.State = TBState.Delete; break; case TBState.Delete: tbm.State = TBState.Waiting; break; case TBState.BeingImport: break; case TBState.EndImport: break; default: break; } dgTableMapping.RefreshData(); } } /// /// 根据TableName获取表 /// /// public static RuleTableEntity GetRuleTableEntityByTableName(string tableName) { RuleTableEntity ruleTableEntity = null; try { XmlDocument doc = new XmlDocument(); string strPath = KGIS.Framework.Utils.SysAppPath.GetDataCheckTableMappingConfigPath(); doc.Load(strPath); if (doc != null) { #region 获取规则检查TableMapping XmlNodeList nodeTableMappingList = doc.SelectNodes("CheckTableMapping"); if (nodeTableMappingList != null && nodeTableMappingList.Count > 0) { foreach (XmlNode checkTableNode in nodeTableMappingList) { foreach (XmlNode tableNode in checkTableNode.ChildNodes) { if (tableNode.Attributes["TableName"] != null && tableNode.Attributes["TableName"].Value.Trim().Replace(" ", "") != tableName) { continue; } RuleTableEntity pRuleTableEntity = new RuleTableEntity(); pRuleTableEntity.Columns = new List(); pRuleTableEntity.TableName = tableNode.Attributes["TableName"].Value; if (tableNode.Attributes["Name"] != null) { pRuleTableEntity.TableAliasName = tableNode.Attributes["Name"].Value.Trim().Replace(" ", ""); } if (tableNode.Attributes["Type"] != null) { pRuleTableEntity.Type = tableNode.Attributes["Type"].Value.Trim().Replace(" ", ""); } if (tableNode.Attributes["YSDM"] != null) { pRuleTableEntity.YSDM = tableNode.Attributes["YSDM"].Value.Trim().Replace(" ", ""); } if (tableNode.Attributes["CDM"] != null) { pRuleTableEntity.CDM = tableNode.Attributes["CDM"].Value; } if (tableNode.Attributes["IsNecessary"] != null) { bool b = false; if (bool.TryParse(tableNode.Attributes["IsNecessary"].Value, out b)) { } pRuleTableEntity.IsNecessary = b; } foreach (XmlNode columnNode in tableNode.ChildNodes) { RuleColumnEntity pRuleColumnEntity = new RuleColumnEntity(); if (columnNode.Attributes["Name"] != null) { pRuleColumnEntity.ColumnName = columnNode.Attributes["Name"].Value.Trim().Replace(" ", ""); } if (columnNode.Attributes["AliasName"] != null) { pRuleColumnEntity.AliasName = columnNode.Attributes["AliasName"].Value.Trim().Replace(" ", ""); } if (columnNode.Attributes["Range"] != null) { pRuleColumnEntity.Range = columnNode.Attributes["Range"].Value.Trim().Replace(" ", ""); } if (columnNode.Attributes["ToolTip"] != null) { pRuleColumnEntity.ToolTip = columnNode.Attributes["ToolTip"].Value.Trim().Replace(" ", ""); } if (columnNode.Attributes["Pic"] != null) { pRuleColumnEntity.Pic = columnNode.Attributes["Pic"].Value.Trim().Replace(" ", ""); } pRuleColumnEntity.AllowDBNull = false; //字段是否可为空:如果未配置则默认为false:标识当前字段为必填项,不可为空 if (columnNode.Attributes["AllowDBNull"] != null) { bool b = false; if (bool.TryParse(columnNode.Attributes["AllowDBNull"].Value, out b)) { } pRuleColumnEntity.AllowDBNull = b; } pRuleColumnEntity.IsUnique = false; //字段值是否必须唯一:如果未配置则默认为false:表示当前字段不是必须唯一,可重复 if (columnNode.Attributes["IsUnique"] != null) { bool b = false; if (bool.TryParse(columnNode.Attributes["IsUnique"].Value, out b)) { } pRuleColumnEntity.IsUnique = b; } if (columnNode.Attributes["DataType"] != null) { pRuleColumnEntity.DataType = columnNode.Attributes["DataType"].Value.Trim().Replace(" ", "").ToLower(); } pRuleColumnEntity.IllegalityCheck = true; //如果不是字符串类型的字段则不检查 //字段值非法字符检查:如果未配置则默认为false:表示需要检查非法字符 if (pRuleColumnEntity.DataType != "esriFieldTypeString") { pRuleColumnEntity.IllegalityCheck = false; } else { pRuleColumnEntity.IllegalityCheck = true; } if (columnNode.Attributes["IllegalityNotCheck"] != null) { bool b = false; if (bool.TryParse(columnNode.Attributes["IllegalityNotCheck"].Value, out b)) { } pRuleColumnEntity.IllegalityCheck = b; } int max = 0; if (columnNode.Attributes["MaxLength"] != null && int.TryParse(columnNode.Attributes["MaxLength"].Value, out max)) { } pRuleColumnEntity.MaxLength = max; if (columnNode.Attributes["Precision"] != null) { int precision = 0; if (int.TryParse(columnNode.Attributes["Precision"].Value, out precision)) { } pRuleColumnEntity.Precision = precision; } if (columnNode.Attributes["Dic"] != null) { pRuleColumnEntity.DIC = columnNode.Attributes["Dic"].Value.Trim().Replace(" ", ""); } pRuleColumnEntity.IsEllipsoidArea = false; if (columnNode.Attributes["IsEllipsoidArea"] != null) { bool b = false; if (bool.TryParse(columnNode.Attributes["IsEllipsoidArea"].Value, out b)) { } pRuleColumnEntity.IsEllipsoidArea = b; } pRuleColumnEntity.ExtendField = false; if (columnNode.Attributes["ExtendField"] != null) { bool b = false; if (bool.TryParse(columnNode.Attributes["ExtendField"].Value, out b)) { } pRuleColumnEntity.ExtendField = b; } pRuleTableEntity.Columns.Add(pRuleColumnEntity); } ruleTableEntity = pRuleTableEntity; } } } #endregion } if (ruleTableEntity == null) { throw new Exception("未找到" + tableName + "表配置"); } return ruleTableEntity; } catch (Exception ex) { LogAPI.Debug("根据TableName获取表 时异常,异常信息如下:"); LogAPI.Debug(ex); LogAPI.Debug("根据TableName获取表 时异常信息结束"); throw new Exception("获取表结构异常:" + ex.Message); } } /// /// 表映射关系 /// public class DDTCDataMapping : INotifyPropertyChanged { /// /// 源数据表名 /// public string S_TableName { get; set; } /// /// 源数据表名 /// public string S_TableAliasName { get; set; } /// /// 数据源表类型 /// public string S_TableType { get; set; } /// /// 坐标系 /// public string S_Spatial { get; set; } ///// ///// 数据源要素类型 ///// //public string S_ShapeType { get; set; } ///// ///// 目标要素类型 ///// //public string T_ShapeType { get; set; } private string _T_TableName; /// /// 目标数据表名 /// public string T_TableName { get { return _T_TableName; } set { _T_TableName = value; if (PropertyChanged2 != null) { PropertyChanged2(this, new PropertyChangedEventArgs("T_TableName")); } } } /// /// 目标数据表名 /// public string T_TableAliasName { get; set; } /// /// 目标表类型 /// public string T_TableType { get; set; } /// /// 条件sql语句 /// private string _S_YSDM_SQL; public string S_YSDM_SQL { get { return _S_YSDM_SQL; } set { _S_YSDM_SQL = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("S_YSDM_SQL")); } } } private List _FieldMapping; /// /// 字段映射信息 /// public List FieldMapping { get { return _FieldMapping; } set { _FieldMapping = value; int count = _FieldMapping.FindAll(f => f.S_FieldIndex == -1).Count; if (count == 0) { FieldMappingMsg = "所有字段已匹配"; } else { FieldMappingMsg = string.Format("{0} 个字段未匹配", count); } } } /// /// 目标数据表值域 /// public List T_TableList { get; set; } private string _FieldMappingMsg; public string FieldMappingMsg { get { return _FieldMappingMsg; } set { _FieldMappingMsg = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("FieldMappingMsg")); } } } #region private TBState _State; public TBState State { get { return _State; } set { _State = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("State")); } } } private int _Count; /// /// 总进度 /// public int Count { get { return _Count; } set { _Count = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Count")); } } } private int _Progress; /// /// 当前进度 /// public int Progress { get { return _Progress; } set { _Progress = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Progress")); } } } #endregion public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged2; } } }