using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.Maps; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using Kingo.Plugin.EngineEditor.helper; using Kingo.Plugin.EngineEditor.Model; using Kingo.PluginServiceInterface; using KUI.Windows; using System; using System.Collections.Generic; using System.Linq; namespace Kingo.Plugin.EngineEditor.Views.BoundaryFitting { /// /// UCBoundaryFittingNew.xaml 的交互逻辑 /// public partial class UCBoundaryFittingNew : BaseWindow { private IHookHelper m_hookHelper;//获取地图控件和主窗体 private Dictionary keys { get; set; } private EngineEditorClass _engineEdit = new EngineEditorClass(); private IFeatureLayer SelectFeatureLayer = null; public UCBoundaryFittingNew(object Helpers, EngineEditorClass m_engineEdit) { InitializeComponent(); try { if (this.m_hookHelper == null) this.m_hookHelper = Helpers as IHookHelper; //获取当前工程中的全部图层 List featureLayers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap(); if (featureLayers != null && featureLayers.Count > 0) { keys = new Dictionary(); foreach (IFeatureLayer iFeatureLayer in featureLayers) { if (!keys.ContainsKey(iFeatureLayer.Name)) keys.Add(iFeatureLayer.Name, iFeatureLayer); } targetName.ItemsSource = keys.Keys; int index = keys.Keys.ToList().IndexOf("基础_地类图斑"); if (index >= 0) { targetName.SelectedIndex = index; } } _engineEdit = m_engineEdit; } catch (Exception ex) { LogAPI.Debug("UCBoundaryFitting异常:" + ex.Message); LogAPI.Debug("UCBoundaryFitting异常:" + ex.StackTrace); MessageHelper.ShowError("初始化边界修复界面异常" + ex.Message); } } #region 目标图层切换事件 private void targetName_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) { try { if (keys != null) { IFeatureLayer featureLayer = keys[targetName.SelectedItem.ToTrim()]; if (featureLayer == null) return; SelectFeatureLayer = featureLayer; } } catch (Exception ex) { LogAPI.Debug("targetName_SelectionChanged异常:" + ex.Message); LogAPI.Debug("targetName_SelectionChanged异常:" + ex.StackTrace); } } #endregion #region 关闭窗体事件 private void BaseWindow_Closed(object sender, EventArgs e) { try { this.Close(); } catch (Exception ex) { LogAPI.Debug("BaseWindow_Closed异常:" + ex.Message); LogAPI.Debug("BaseWindow_Closed异常:" + ex.StackTrace); } } #endregion private void btnCancel1_Click(object sender, System.Windows.RoutedEventArgs e) { try { this.Close(); } catch (Exception ex) { LogAPI.Debug("btnCancel1_Click异常:" + ex.Message); LogAPI.Debug("btnCancel1_Click异常:" + ex.StackTrace); } } private void btnOK_Click(object sender, System.Windows.RoutedEventArgs e) { try { double disValue = 1.0; if (!double.TryParse(AttributeValue.Text, out disValue) || disValue <= 0 || disValue > 10) { MessageHelper.ShowTips("容差输入不正确."); return; } if (_engineEdit.EditState != esriEngineEditState.esriEngineStateEditing) { MessageHelper.ShowTips("请先开启编辑."); return; } if (this.SelectFeatureLayer == null) { MessageHelper.ShowTips("请选择需要边界套合的参考图层."); return; } IFeatureLayer dltbbgLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); if (dltbbgLayer == null) { MessageHelper.ShowTips("未获取到单图斑地类图斑更新层!"); return; } IFeatureLayer TargetLayer = (_engineEdit as EngineEditorClass).TargetLayer as IFeatureLayer; if (TargetLayer == null || TargetLayer.FeatureClass == null || TargetLayer.FeatureClass.FeatureCount(null) == 0) { MessageHelper.ShowTips("请选择正确的参考图层."); return; } int indexBSM = this.SelectFeatureLayer.FeatureClass.Fields.FindField("BSM"); int indexTBBSM = this.SelectFeatureLayer.FeatureClass.Fields.FindField("TBBSM"); int indexDTB_TBBSM = TargetLayer.FeatureClass.Fields.FindField("TBBSM"); IEnumFeature enumFeature = m_hookHelper.FocusMap.FeatureSelection as IEnumFeature; enumFeature.Reset(); IFeature feature = enumFeature.Next(); if (feature == null) { MessageHelper.ShowTips("请选择要修复的图斑."); return; } this.ShowLoading("正在进行边界修复......", 0, 0); Dictionary> xfDic = new Dictionary>(); #region 分组统计选中子地块所在任务包及该TBBSM下其余子地块 while (feature != null) { int tbbsmIndex = feature.Fields.FindField("tbbsm"); int bidIndex = feature.Fields.FindField("packageid"); if (tbbsmIndex < 0 || bidIndex < 0) { continue; } string tbbsm = feature.get_Value(tbbsmIndex).ToString(); string bid = feature.get_Value(bidIndex).ToString(); if (xfDic.ContainsKey(bid)) { xfDic[bid].Add(tbbsm); } else { xfDic.Add(bid, new List() { tbbsm }); } feature = enumFeature.Next(); } #endregion List _features = null; ISpatialFilter spatialFilter = null; IFeatureCursor cursor = null; List repairs = new List(); List tbbsmList = new List(); #region 构造边界修复数据 foreach (string bid in xfDic.Keys) { tbbsmList = xfDic[bid].Distinct().ToList(); string where = string.Join(",", tbbsmList.Select(x => $"'{x}'")); spatialFilter = new SpatialFilterClass() { WhereClause = $"packageid = '{bid}' and tbbsm in ({where})" }; cursor = dltbbgLayer.Search(spatialFilter, true); while ((feature = cursor.NextFeature()) != null) { try { int bsmIndex = feature.Fields.FindField("bsm"); string bsm = feature.get_Value(bsmIndex).ToString(); RepairEntity repairEntity = new RepairEntity() { Geometry = feature.ShapeCopy, ListReference = new List(), Distance = disValue, JCBH = bsm, PackageId = bid, OID = feature.OID }; _features = FeatureAPI.Identify(feature.ShapeCopy, SelectFeatureLayer); if (_features == null || _features.Count < 1) { this.CloseLoading(); System.Threading.Thread.Sleep(1000); MessageHelper.ShowTips($"边界修复提示:标识码为【{bsm}】地块未获取到参考图层要素!跳过当前图斑。"); continue; } foreach (IFeature jcfeature in _features) { if (indexTBBSM > -1 && indexDTB_TBBSM > -1 && jcfeature.get_Value(indexTBBSM).ToString().Equals(feature.get_Value(indexDTB_TBBSM).ToString())) { continue; } repairEntity.ListReference.Add(new ReferenceEntity() { BSM = indexBSM > -1 ? jcfeature.Value[indexBSM].ToString().Trim() : "", RefGeometry = jcfeature.ShapeCopy, oid = jcfeature.OID }); } repairs.Add(repairEntity); } catch (Exception ex) { throw ex; } } } #endregion List UnionList = new List(); _engineEdit.StartOperation(); BoundaryRepairHelper.Execute(repairs, UnionList); List updRes = repairs.Where(x => !x.JCBH.Contains("NMK") && !x.JCBH.Contains("_DELETE")).ToList(); List delRes = repairs.Where(x => x.JCBH.Contains("_DELETE")).ToList(); #region 删除要素 List oidList = new List(); //string queryBsms = string.Join(",", delRes.Select(x => $"'{x.JCBH.Replace("_DELETE", "")}'")); //string queryBids = string.Join(",", delRes.Select(x => $"'{x.PackageId}'")); //spatialFilter = new SpatialFilterClass() //{ // WhereClause = $"packageid in ({queryBids}) and bsm in ({queryBsms})" //}; //cursor = dltbbgLayer.FeatureClass.Search(spatialFilter, true); //while ((feature = cursor.NextFeature()) != null) //{ // oidList.Add(feature.OID); //} foreach (RepairEntity item in delRes) { oidList.Add(item.OID); } if (UnionList.Count > 0) { oidList.AddRange(UnionList); } if (oidList.Count > 0) { foreach (int oid in oidList) { feature = dltbbgLayer.FeatureClass.GetFeature(oid); if (feature != null) { feature.Delete(); } } } #endregion #region 修改要素 Dictionary oidDic = new Dictionary(); //queryBsms = string.Join(",", updRes.Select(x => $"'{x.JCBH}'")); //queryBids = string.Join(",", updRes.Select(x => $"'{x.PackageId}'")); //spatialFilter = new SpatialFilterClass() //{ // WhereClause = $"packageid in ({queryBids}) and bsm in ({queryBsms})" //}; //cursor = dltbbgLayer.FeatureClass.Search(spatialFilter, true); //while ((feature = cursor.NextFeature()) != null) //{ // oidDic.Add(feature.OID, feature.get_Value(feature.Fields.FindField("bsm")).ToString()); //} foreach (RepairEntity item in updRes) { oidDic.Add(item.OID, item.JCBH); } foreach (int oid in oidDic.Keys) { feature = dltbbgLayer.FeatureClass.GetFeature(oid); if (feature == null) { continue; } string bsm = oidDic[oid]; RepairEntity repair = repairs.FirstOrDefault(x => x.JCBH == bsm); if (repair == null) { continue; } bool isConvert = repair.Geometry == null || repair.Geometry.IsEmpty; bool isContinue = string.IsNullOrWhiteSpace(repair.WKT); if (isConvert && isContinue) { continue; } feature.Shape = isConvert ? GeometryConvertHelper.ConvertWKTToIGeometry(repair.WKT) : repair.Geometry; feature.Store(); } #endregion m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, m_hookHelper.ActiveView.Extent); _engineEdit.StopOperation("边界修复"); MessageHelper.ShowTips("修复完成."); this.CloseLoading(); Close(); } catch (Exception ex) { _engineEdit.AbortOperation(); this.CloseLoading(); LogAPI.Debug("btnOK_Click异常:" + ex.Message); LogAPI.Debug("btnOK_Click异常:" + ex.StackTrace); MessageHelper.ShowError("边界修复异常:" + ex.Message); } } #region 边界套合后图形判断是否有曲线,有则转折线 private IGeometry IsCurve(IGeometry geo) { if (geo != null && !geo.IsEmpty && GeometryContainsCurves(geo)) { FeatureAPI.ArcToPolyline(ref geo); } return geo; } #endregion /// /// 判断传入图新是否包含曲线 /// /// /// public static bool GeometryContainsCurves(IGeometry geometry) { if (geometry == null || geometry.IsEmpty) { throw new Exception("图形不能为null或者无效图形"); } try { if (geometry is IGeometryCollection geometryCollection) { for (int i = 0; i < geometryCollection.GeometryCount; i++) { IGeometry part = geometryCollection.get_Geometry(i); if (part is ISegmentCollection segmentCollection) { for (int j = 0; j < segmentCollection.SegmentCount; j++) { ISegment segment = segmentCollection.get_Segment(j); if (segment is ICurve) { return true; } } } } } return false; } catch (Exception ex) { throw ex; } } } }