using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.Maps; using KGIS.Framework.Platform; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using KGIS.Framework.Utils.Interface; using Kingo.Plugin.EngineEditor.helper; using Kingo.PluginServiceInterface.Helper; using System; using System.Collections.Generic; using System.Windows; using System.Windows.Input; namespace Kingo.Plugin.EngineEditor.Views { /// /// FrmAttribureEdit.xaml 的交互逻辑 /// public partial class FrmMerge : Window { public FrmMerge() { InitializeComponent(); } List groupList; public IHookHelper m_hookHelper; public bool IsPromptAgain = true; public void BindData() { gridData.ItemsSource = null; IMap map = MapsManager.Instance.MapService.getAxMapControl().ActiveView.FocusMap; Dictionary> SelectedFeature = GetSelectedFeaturesDic(map); groupList = new List(); if (SelectedFeature.Keys.Count > 1) { MessageHelper.ShowTips("请选择单图层的要素进行合并操作!"); return; } else { foreach (string key in SelectedFeature.Keys) { txtConten.Text = SelectedFeature[key].Count + "个要素"; foreach (IFeature f in SelectedFeature[key]) { DataSource datasource = new DataSource(); datasource.FID = f.get_Value(f.Fields.FindField(f.Class.OIDFieldName)).ToString(); datasource.feature = f; groupList.Add(datasource); } } gridData.ItemsSource = groupList; } Platform.Instance.NotifyMsgEven2 += Instance_NotifyMsgEven2; } public static Dictionary> GetSelectedFeaturesDic(IMap map, esriGeometryType geoType = esriGeometryType.esriGeometryAny) { if (map == null) return null; IEnumFeature enumFeature = map.FeatureSelection as IEnumFeature; if (enumFeature == null) return null; Dictionary> geoList = new Dictionary>(); IFeature feart = enumFeature.Next(); while (feart != null) { if (feart.Shape != null && !feart.Shape.IsEmpty && (geoType == esriGeometryType.esriGeometryAny || feart.Shape.GeometryType == geoType)) { IDataset dataset = feart.Table as IDataset; if (dataset != null) { if (geoList.ContainsKey(dataset.BrowseName)) { geoList[dataset.BrowseName].Add(feart); } else { geoList.Add(dataset.BrowseName, new List() { feart }); } } } feart = enumFeature.Next(); } return geoList; } /// /// 点击定位 /// /// /// private void gridFileInfo_MouseDown(object sender, MouseButtonEventArgs e) { try { DataSource item = gridData.SelectedItem as DataSource; if (item != null && item.feature != null) { IFeature f = item.feature as IFeature; IFillSymbol fillSymbol = new SimpleFillSymbolClass(); fillSymbol.Color = new ESRI.ArcGIS.Display.RgbColorClass() { Red = 0, Green = 0, Blue = 255 }; MapsManager.Instance.MapService.FlashShape((m_hookHelper.Hook as IMapControlDefault), f.ShapeCopy, 2); } } catch (Exception ex) { LogAPI.Debug("合并要素-定位异常:" + ex.Message + ex.StackTrace); } } /// /// 合并 /// /// /// private void btnOK_Click(object sender, RoutedEventArgs e) { if (groupList == null || groupList.Count < 2) { MessageHelper.ShowTips("请选择合并的要素!"); return; } IEngineEditor m_editor = new EngineEditorClass(); try { IFeatureLayer featureLayer = (m_editor as EngineEditorClass).TargetLayer as IFeatureLayer; IDataset dataset = featureLayer.FeatureClass as IDataset; string areapath = SysAppPath.GetAreaUpdateConfigPath(); string mjField = string.Empty; if (!string.IsNullOrWhiteSpace(areapath) && System.IO.File.Exists(areapath)) mjField = AreaConfigHelper.GetAreaPropertyByLayerName(dataset.Name); DataSource item = gridData.SelectedItem as DataSource; IGeometry geo = null; List bsmList = new List(); if (dataset.Name == "CZCDYDGX") { CZCDYDGXMerge(); } else if (dataset.Name == "DLTBGX") { DLTBGXMerge(); } else { m_editor.StartOperation(); int index_bsm = featureLayer.FeatureClass.FindField("BSM"); foreach (DataSource data in groupList) { if (dataset.Name.ToUpper() == "DLTBBG" && index_bsm >= 0) { bsmList.Add(data.feature.Value[index_bsm].ToString()); } if (geo == null) { geo = data.feature.ShapeCopy; } else { if (geo.GeometryType == esriGeometryType.esriGeometryPoint) { MessageHelper.ShowTips("点要素不能进行合并!"); throw new Exception("点要素不能进行合并"); } if (!geo.IsEmpty && !data.feature.ShapeCopy.IsEmpty && geo.GeometryType == data.feature.ShapeCopy.GeometryType) { ITopologicalOperator topOp = geo as ITopologicalOperator; topOp.Simplify(); IGeometry geometry = data.feature.ShapeCopy; (geometry as ITopologicalOperator).Simplify(); geo = topOp.Union(geometry); } } } //增加提示框原因,如果提示框选择否,再继续点合并会导致删除异常,所以原删除操作移至此处 foreach (DataSource data in groupList) { if (data.feature.OID != item.feature.OID) { data.feature.Delete(); } } item.feature.Shape = geo; if (!string.IsNullOrWhiteSpace(mjField)) { int mjIndex = item.feature.Fields.FindField(mjField); if (mjIndex > -1) { IArea area = item.feature.ShapeCopy as IArea; double mj = area.Area; if (dataset.Name == "LSYD") { mj = mj * 0.0001; } mj = Math.Round(mj, 2); item.feature.Value[mjIndex] = mj; } } item.feature.Store(); } if (m_editor.Map.SelectionCount > 0) { m_editor.Map.ClearSelection(); } m_editor.StopOperation("合并要素"); m_hookHelper.ActiveView.Refresh(); this.Close(); //北京单图斑需求:所选被合并图斑挂接的照片挂接到合并后图斑上 if (Platform.Instance.SystemType == SystemTypeEnum.DTBJK && (MapsManager.Instance.CurrProjectInfo as PluginServiceInterface.ProjectInfo).CODE.StartsWith("11") && dataset.Name.ToUpper() == "DLTBBG") { Platform.Instance.SendMsg(new NotifyMsgPackage() { MsgType = "UpdateImgIsCheckByMergeGeometry", Content = bsmList }); } } catch (Exception ex) { m_editor.AbortOperation(); LogAPI.Debug(ex); } } #region 城镇村等用地更新层合并 private void CZCDYDGXMerge() { IGeometry geo = null; try { if (groupList == null || groupList.Count < 2) { MessageHelper.ShowTips("请选择合并的要素!"); return; } IEngineEditor m_editor = new EngineEditorClass(); m_editor.StartOperation(); try { IFeatureLayer featureLayer = (m_editor as EngineEditorClass).TargetLayer as IFeatureLayer; IDataset dataset = featureLayer.FeatureClass as IDataset; if (dataset.Name != "CZCDYDGX") return; DataSource item = gridData.SelectedItem as DataSource; int index_mj = featureLayer.FeatureClass.FindField("CZCMJ"); int index_bsm = featureLayer.FeatureClass.FindField("BSM"); double mj = 0; foreach (DataSource data in groupList) { if (geo == null) { geo = data.feature.ShapeCopy; mj = data.feature.Value[index_mj].ToDouble(); } else { if (geo.GeometryType == esriGeometryType.esriGeometryPolygon && geo.GeometryType == data.feature.ShapeCopy.GeometryType) { if (!geo.IsEmpty && !data.feature.ShapeCopy.IsEmpty) { ITopologicalOperator topOp = geo as ITopologicalOperator; topOp.Simplify(); IGeometry geometry = data.feature.ShapeCopy; (geometry as ITopologicalOperator).Simplify(); geo = topOp.Union(geometry); mj += data.feature.Value[index_mj].ToDouble(); } } } } item.feature.Value[index_mj] = mj.ToDecimal(2).ToDouble(); var strBSM = BSMHelper.GetMaxBSM(new List() { featureLayer.FeatureClass }); var strbsm = strBSM.Substring(0, 10); var Maxbsm = strBSM.Substring(10).ToInt() + 1; strBSM = strbsm + Maxbsm.ToString().PadLeft(8, '0');//最新标识码 item.feature.Value[index_bsm] = strBSM; item.feature.Shape = geo; item.feature.Store(); foreach (DataSource data in groupList) { //被合并的图斑新增一条城镇村更新过程层数据 if (data.feature.OID != item.feature.OID) { CZCDYDGXGC(item.feature, data.feature); data.feature.Delete(); } } m_editor.StopOperation("城镇村更新合并要素"); } catch (Exception ex) { m_editor.AbortOperation(); LogAPI.Debug($"城镇村等用地更新层合并失败:{ex.Message}{ex.StackTrace}"); } } catch (Exception ex) { LogAPI.Debug($"城镇村等用地更新层合并失败:{ex.Message}{ex.StackTrace}"); } } private void CZCDYDGXGC(IFeature gxfeature, IFeature feature) { IFeatureLayer CZCDYDGXGCLayer = null; IFeatureLayer JCCZCLayer = null; IFeatureCursor Cursor = null; try { CZCDYDGXGCLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYDGXGC"); JCCZCLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYD"); IFeatureBuffer buff = CZCDYDGXGCLayer.FeatureClass.CreateFeatureBuffer(); if (CZCDYDGXGCLayer != null && JCCZCLayer != null) { #region 修改当前更新层对应的更新过程层变更行为,变更后面积 var index_bgxw = CZCDYDGXGCLayer.FeatureClass.FindField("BGXW"); var index_bghtbbsm = CZCDYDGXGCLayer.FeatureClass.FindField("BGHBSM"); var index_bsm = gxfeature.Fields.FindField("BSM"); string bghbsm = gxfeature.Value[index_bsm].ToTrim(); List list = FeatureAPI.Identify2(gxfeature.ShapeCopy, CZCDYDGXGCLayer); if (list != null && list.Count > 0) { list[0].Value[index_bgxw] = "2"; list[0].Value[index_bghtbbsm] = bghbsm; list[0].Store(); } #endregion var strBSM = BSMHelper.GetMaxBSM(new List() { CZCDYDGXGCLayer.FeatureClass }); list = FeatureAPI.Identify2(feature.ShapeCopy, JCCZCLayer); Cursor = CZCDYDGXGCLayer.FeatureClass.Insert(true); foreach (var jcfeature in list) { for (int i = 0; i < CZCDYDGXGCLayer.FeatureClass.Fields.FieldCount; i++) { IField field = CZCDYDGXGCLayer.FeatureClass.Fields.Field[i]; if (!field.Editable || field.Name.Contains("SHAPE")) continue; if (field.Name.ToUpper().Contains("BGQ")) { string sFieldName = field.Name.Replace("BGQ", ""); int idx = jcfeature.Fields.FindField(sFieldName); if (idx != -1) buff.Value[i] = jcfeature.Value[idx]; } else if (field.Name.ToUpper().Contains("BGH")) { if (field.Name == "BGHBSM") { buff.Value[i] = bghbsm; } else { string sFieldName = field.Name.Replace("BGH", ""); int idx = gxfeature.Fields.FindField(sFieldName); if (idx != -1) buff.Value[i] = gxfeature.Value[idx]; } } if (field.Name == "BGXW") buff.Value[i] = "2"; if (field.Name == "BGMJ") { int idx = jcfeature.Fields.FindField("CZCMJ"); if (idx != -1) buff.Value[i] = jcfeature.Value[idx]; } if (field.Name == "BSM") { var strbsm = strBSM.Substring(0, 10); var Maxbsm = strBSM.Substring(10).ToInt() + 1; strBSM = strbsm + Maxbsm.ToString().PadLeft(8, '0');//最新标识码 buff.Value[i] = strBSM; } if (field.Name == "GXSJ") { buff.Value[i] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); } } buff.Shape = feature.ShapeCopy; Cursor.InsertFeature(buff); } Cursor.Flush(); } } catch (Exception ex) { LogAPI.Debug("城镇村等用地更新层合并异常:" + ex.Message + ex.StackTrace); } } #endregion #region 地类图斑更新层合并 private void DLTBGXMerge() { if (groupList == null || groupList.Count < 2) { MessageHelper.ShowTips("请选择合并的要素!"); return; } IGeometry geo = null; IEngineEditor m_editor = new EngineEditorClass(); try { m_editor.StartOperation(); IFeatureLayer featureLayer = (m_editor as EngineEditorClass).TargetLayer as IFeatureLayer; IDataset dataset = featureLayer.FeatureClass as IDataset; if (dataset.Name != "DLTBGX") return; DataSource item = gridData.SelectedItem as DataSource; int index_tbmj = featureLayer.FeatureClass.FindField("TBMJ"); int index_tbdlmj = featureLayer.FeatureClass.FindField("TBDLMJ"); int index_kcmj = featureLayer.FeatureClass.FindField("KCMJ"); int index_kcxs = featureLayer.FeatureClass.FindField("KCXS"); double mj = 0; foreach (DataSource data in groupList) { if (geo == null) { geo = data.feature.ShapeCopy; mj = data.feature.Value[index_tbmj].ToDouble(); } else { if (geo.GeometryType == esriGeometryType.esriGeometryPolygon && geo.GeometryType == data.feature.ShapeCopy.GeometryType) { if (!geo.IsEmpty && !data.feature.ShapeCopy.IsEmpty) { ITopologicalOperator topOp = geo as ITopologicalOperator; topOp.Simplify(); IGeometry geometry = data.feature.ShapeCopy; (geometry as ITopologicalOperator).Simplify(); geo = topOp.Union(geometry); mj += data.feature.Value[index_tbmj].ToDouble(); } } } } var tbmj = mj.ToDecimal(2).ToDouble(); var kcmj = Math.Round((decimal)(item.feature.Value[index_kcxs].ToDouble() * tbmj), 2, MidpointRounding.AwayFromZero).ToDouble(); item.feature.Value[index_tbmj] = tbmj; item.feature.Value[index_kcmj] = kcmj; item.feature.Value[index_tbdlmj] = tbmj - kcmj; item.feature.Shape = geo; item.feature.Store(); foreach (DataSource data in groupList) { //被合并的图斑新增一条地类图斑更新过程层数据 if (data.feature.OID != item.feature.OID) { DLTBGXGC(item.feature, data.feature); data.feature.Delete(); } } m_editor.StopOperation("地类图斑更新合并要素"); } catch (Exception ex) { m_editor.AbortOperation(); LogAPI.Debug($"地类图斑更新层合并失败:{ex.Message}{ex.StackTrace}"); } } private void DLTBGXGC(IFeature gxfeature, IFeature feature) { IFeatureLayer DLTBGXGCLayer = null; IFeatureLayer JCDLTBLayer = null; IFeatureCursor Cursor = null; try { DLTBGXGCLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBGXGC"); JCDLTBLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTB"); IFeatureBuffer buff = DLTBGXGCLayer.FeatureClass.CreateFeatureBuffer(); if (DLTBGXGCLayer != null && JCDLTBLayer != null) { #region 修改当前更新层对应的更新过程层变更行为,变更后面积 var index_bgxw = DLTBGXGCLayer.FeatureClass.FindField("BGXW"); List list = FeatureAPI.Identify2(gxfeature.ShapeCopy, DLTBGXGCLayer); if (list != null && list.Count > 0) { list[0].Value[index_bgxw] = "2"; list[0].Store(); } #endregion var strBSM = BSMHelper.GetMaxBSM(new List() { DLTBGXGCLayer.FeatureClass }); list = FeatureAPI.Identify2(feature.ShapeCopy, JCDLTBLayer); Cursor = DLTBGXGCLayer.FeatureClass.Insert(true); foreach (var jcfeature in list) { for (int i = 0; i < DLTBGXGCLayer.FeatureClass.Fields.FieldCount; i++) { IField field = DLTBGXGCLayer.FeatureClass.Fields.Field[i]; if (!field.Editable || field.Name.Contains("SHAPE")) continue; if (field.Name.ToUpper().Contains("BGQ")) { string sFieldName = field.Name.Replace("BGQ", ""); int idx = jcfeature.Fields.FindField(sFieldName); if (sFieldName == "TBBSM") idx = jcfeature.Fields.FindField("BSM"); if (idx != -1) buff.Value[i] = jcfeature.Value[idx]; } else if (field.Name.ToUpper().Contains("BGH")) { string sFieldName = field.Name.Replace("BGH", ""); int idx = gxfeature.Fields.FindField(sFieldName); if (sFieldName == "TBBSM") idx = gxfeature.Fields.FindField("BSM"); if (idx != -1) buff.Value[i] = gxfeature.Value[idx]; } if (field.Name == "BGXW") buff.Value[i] = "2"; if (field.Name == "TBBGMJ") { int idx = jcfeature.Fields.FindField("TBMJ"); if (idx != -1) buff.Value[i] = jcfeature.Value[idx]; } if (field.Name == "BSM") { var strbsm = strBSM.Substring(0, 10); var Maxbsm = strBSM.Substring(10).ToInt() + 1; strBSM = strbsm + Maxbsm.ToString().PadLeft(8, '0');//最新标识码 buff.Value[i] = strBSM; } if (field.Name == "GXSJ") { buff.Value[i] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); } } buff.Shape = feature.ShapeCopy; Cursor.InsertFeature(buff); } Cursor.Flush(); } } catch (Exception ex) { LogAPI.Debug("地类图斑更新层合并异常:" + ex.Message + ex.StackTrace); } } #endregion public class DataSource { public string FID { get; set; } public IFeature feature { get; set; } } private void Instance_NotifyMsgEven2(NotifyMsgPackage msg) { } } }