using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.OpenData.Control; using KGIS.Framework.OpenData.Filter; using KGIS.Framework.OpenData.InterFace; using KGIS.Framework.Platform; using KGIS.Framework.Platform.Helper; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using Kingo.PluginServiceInterface.Model; using System; using System.Collections.Generic; using System.Linq; using System.Windows; using TreeNode = Kingo.PluginServiceInterface.Model.TreeNode; namespace Kingo.Plugin.General.ViewDTBJK { /// /// 图斑列表右键功能页-变更范围导入 的交互逻辑 /// public partial class UCBGDataImport : BaseWindow { private TaskPackage taskPackage { get; set; } public string TBBSM { get; set; } public IGeometry WYRWTB { get; set; } public Action, TreeNode> ImpComplate; public bool AllowEdit { get; set; } = true; /// /// 数据源路径 /// public string DataSourcePath { get; set; } private IFeatureLayer _TargetLayer; public TreeNode TreeDanNode { get; set; } /// /// 目标图层 /// public IFeatureLayer TargetLayer { get { return _TargetLayer; } set { _TargetLayer = value; if (_TargetLayer != null) txtTargetLayer.EditValue = _TargetLayer.Name; } } /// /// 数据源 /// public IFeatureClass SourceFeatureClass { get; set; } string strWhere = string.Empty; public UCBGDataImport() { InitializeComponent(); } /// /// 选择数据源 /// /// /// private void btnSelectedImportDataPath_Click(object sender, RoutedEventArgs e) { if (TargetLayer == null) { MessageHelper.ShowTips("目标图层不能为空!"); return; } OpenDataDialog pDialog = new OpenDataDialog(); ISpatialDataObjectFilter pOFilter; pOFilter = new FilterDatasetsAndLayers(); pDialog.AddFilter(pOFilter, true); pDialog.Title = "选择导入的数据"; pDialog.AllowMultiSelect = false; pDialog.RestoreLocation = true; pDialog.StartLocation = pDialog.FinalLocation; System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog(); if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) { foreach (ISpatialDataObject distObj in pDialog.Selection) { if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass) { btnImportDataPath.EditValue = pDialog.FinalLocation; if (SourceFeatureClass != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(SourceFeatureClass); SourceFeatureClass = null; } SourceFeatureClass = (distObj.DatasetName as IName).Open() as IFeatureClass; SetFieldMapping(); } } } } /// /// 过滤条件 /// /// /// private void btnSelectedSQLDataPath_Click(object sender, RoutedEventArgs e) { try { IFeatureClass pFeatureClass = SourceFeatureClass; if (pFeatureClass == null) { MessageHelper.Show("请添加数据源图层!"); return; } else { UCSQLFilterCondition ucSQLFilterContion = new UCSQLFilterCondition(pFeatureClass); ucSQLFilterContion.SetValue += (wheresql) => { btnSQLDataPath.Text = wheresql; }; ucSQLFilterContion.ShowInMainWindow(); } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } /// /// 设置字段映射 /// public void SetFieldMapping() { try { //选择的不为空且数据类型一致 if (SourceFeatureClass != null && SourceFeatureClass.ShapeType == TargetLayer.FeatureClass.ShapeType) { 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 = "" }); for (int i = 0; i < TargetLayer.FeatureClass.Fields.FieldCount; i++) { IField field = TargetLayer.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() }); //任务包监测图斑右键导入变更范围时,处理因 TBMJ 数据类型不匹配导致获取不到 TBMJ 数据的问题。 if (field.Name == "TBMJ" && field.Type.ToString() != "esriFieldTypeDouble") { dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = "esriFieldTypeDouble" }); } else { dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() }); } } List data = new List(); for (int i = 0; i < SourceFeatureClass.Fields.FieldCount; i++) { IField field = SourceFeatureClass.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());//&& 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.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); } dgFieldMapping.ItemsSource = null; dgFieldMapping.ItemsSource = data; } else { MessageHelper.ShowTips("选择数据不正确,请确认数据是否为空或格式是否正确!"); return; } } catch (Exception ex) { MessageHelper.ShowError("异常:" + ex.Message); LogAPI.Debug(ex); } } private void btnOK_Click(object sender, RoutedEventArgs e) { int RowCount = 0; int ImportRowCount = 0; IWorkspaceEdit pWsEdit = null; try { if (string.IsNullOrEmpty(btnImportDataPath.Text)) { MessageHelper.ShowTips("请先选择导入数据文件的路径!"); return; } #region 判断坐标系一致性 IFeatureClass t_FC = TargetLayer.FeatureClass; //外部图层FeatureDataset为空,bug11428 if ((t_FC as FeatureClass).Workspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { IEngineEditor edit = new EngineEditorClass(); if (edit.EditState == esriEngineEditState.esriEngineStateNotEditing) { MessageHelper.ShowTips("网络版数据库需要开启编辑后,再进行导入!"); return; } } if (t_FC is IGeoDataset && SourceFeatureClass is IGeoDataset) { IGeoDataset t_Ds = t_FC as IGeoDataset; IGeoDataset s_Ds = SourceFeatureClass as IGeoDataset; if (t_Ds.SpatialReference != null && s_Ds.SpatialReference != null) { if (!GeoDBAPI.SpatialReferenceCompare(t_Ds.SpatialReference, s_Ds.SpatialReference)) { MessageHelper.ShowTips("源要素坐标系与目标要素类坐标系不一致,无法进行数据导入!"); return; } } } #endregion IDataset pDataset = t_FC as IDataset; IWorkspace pWs = pDataset.Workspace; pWsEdit = pWs as IWorkspaceEdit; pWsEdit.StartEditing(true); pWsEdit.StartEditOperation(); if (cbReplace.IsChecked == true) { var FeatureCount = t_FC.FeatureCount(null); if (FeatureCount > 0) { System.Windows.Forms.DialogResult dialogResult = MessageHelper.ShowYesNoAndTips(string.Format("是否确定要覆盖当前任务图斑{0}变更范围数据?覆盖后数据不可恢复,请谨慎操作!", this.TBBSM)); if (dialogResult == System.Windows.Forms.DialogResult.Yes) { //清除数据 ITable pTable = t_FC as ITable; IQueryFilter queryFilter = new QueryFilterClass() { WhereClause = $"bid='{(TreeDanNode.ParentNode.Data as TaskPackage).BID}' and tbbsm='{this.TBBSM}'" }; pTable.DeleteSearchedRows(queryFilter); } else { return; } } } List listBSM = new List(); { //字段映射信息 List mFieldMapping = dgFieldMapping.ItemsSource as List; #region 新增字段 ////提示不明确或缺少提示 王欢 2018-09-19 if (mFieldMapping == null) { MessageHelper.ShowTips("无法获取字段映射信息,数据导入失败!"); return; } List addFields = mFieldMapping.FindAll(f => f.T_FieldIndex == -2); IFeatureClassAPI t_FcAPI = new FeatureClassAPI(t_FC); foreach (FieldMapping item in addFields) { IField f = SourceFeatureClass.Fields.get_Field(item.S_FieldIndex); if (t_FC.FindField(f.Name) > -1) { t_FcAPI.AddField(f.Name + "_a", f.Type, f.AliasName); item.T_FieldIndex = t_FC.Fields.FindField(f.Name + "_a"); } else { t_FcAPI.AddField(f.Name, f.Type, f.AliasName); item.T_FieldIndex = t_FC.Fields.FindField(f.Name); } } #endregion string str = btnSQLDataPath.Text; IQueryFilter filter = new QueryFilterClass() { WhereClause = str };//GeoDBAPI.CreateSpatialFilter(this.WYRWTB, esriSpatialRelEnum.esriSpatialRelIntersects, str); IFeatureCursor cursor = t_FC.Insert(true); IFeatureBuffer newFeature = null; IFeatureCursor s_Cursor = SourceFeatureClass.Search(filter, false); int Count = SourceFeatureClass.FeatureCount(filter); RowCount = Count; int i = 0; IFeature feature = null; while ((feature = s_Cursor.NextFeature()) != null) { if (ProgressHelper.IsCancel) { break; } if (newFeature == null) { newFeature = t_FC.CreateFeatureBuffer(); } int indexBID = newFeature.Fields.FindField("BID"); if (indexBID > -1 && TreeDanNode != null) { newFeature.set_Value(indexBID, (TreeDanNode.ParentNode.Data as TaskPackage).BID); } string bsm = Guid.NewGuid().ToString(); indexBID = newFeature.Fields.FindField("BSM"); if (indexBID > -1) { newFeature.set_Value(indexBID, bsm); } indexBID = newFeature.Fields.FindField("TBBSM"); if (indexBID > -1) { newFeature.set_Value(indexBID, this.TBBSM); } //处理 bug12457 (山东现场)数据库工程--湿地公园数据导入失败 (坐标系:2000,39 附件为湿地公园数据) 王欢 2018-09-19 IGeometry pGeo = feature.ShapeCopy; //白明雅 2019-02-13 自己画的数据报错,添加判断 if (pGeo == null || pGeo.IsEmpty == true) { string FieldValue = feature.get_Value(feature.Fields.FindField("OBJECTID")).ToString(); LogAPI.Debug("OID:" + FieldValue + " 缺少图像数据(IGeometry)"); continue; } IZAware pZAware = pGeo as IZAware; pZAware.ZAware = false; newFeature.Shape = pGeo; foreach (FieldMapping item in mFieldMapping) { if (item.S_FieldName.Equals("包ID", StringComparison.CurrentCultureIgnoreCase) || item.S_FieldName.Equals("标识码", StringComparison.CurrentCultureIgnoreCase) || item.S_FieldName.Equals("图斑标识码", StringComparison.CurrentCultureIgnoreCase) || item.S_FieldName.Equals("SFXML", StringComparison.CurrentCultureIgnoreCase) || item.S_FieldName.Equals("变更类型", StringComparison.CurrentCultureIgnoreCase)) { continue; } if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0) { continue; } if (string.IsNullOrWhiteSpace(feature.get_Value(item.S_FieldIndex).ToString())) { newFeature.set_Value(item.T_FieldIndex, DBNull.Value); } else { newFeature.set_Value(item.T_FieldIndex, feature.get_Value(item.S_FieldIndex)); } } string jkhhi = newFeature.Value[indexBID].ToString(); cursor.InsertFeature(newFeature); listBSM.Add(bsm); i++; ImportRowCount = i; if (i % 500 == 0 || i == Count) { ProgressHelper.CurrentProgress = i; } } if (newFeature != null) { cursor.Flush(); } pWsEdit.StopEditOperation(); pWsEdit.StopEditing(true); if ((t_FC as FeatureClass).Workspace.Type != esriWorkspaceType.esriRemoteDatabaseWorkspace) { IFeatureClassManage fcManage = t_FC as IFeatureClassManage; fcManage.UpdateExtent(); } } ImpComplate?.Invoke(true, listBSM, TreeDanNode); int FailedRowCount = RowCount - ImportRowCount; this.Close(); } catch (Exception ex) { if (pWsEdit != null) { pWsEdit.AbortEditOperation(); pWsEdit.StopEditing(false); } LogAPI.Debug("数据导入异常:" + ex); int FailedRowCount = RowCount - ImportRowCount; string message = string.Format("共导入{0}条,成功{1}条,失败{2}条, 失败原因:{3}", RowCount, ImportRowCount, FailedRowCount, ex.Message); MessageHelper.ShowWarning(message, true); } finally { ProgressHelper.CloseProcessBar(); } } private void btnCancel_Click(object sender, RoutedEventArgs e) { this.Close(); } } public class FieldMapping { /// /// 目标字段名 /// public string T_FieldName { get; set; } /// /// 目标字段索引 /// public int T_FieldIndex { get; set; } /// /// 源字段名 /// public string S_FieldName { get; set; } /// /// 源字段索引 /// public int S_FieldIndex { get; set; } /// /// 字段集合 /// public List FieldList { get; set; } } }