using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.Maps; using KGIS.Framework.Platform; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windows.Controls; namespace Kingo.Plugin.DataCheck.View.V_Repair { /// /// 变更检查数据合并 的交互逻辑 /// public partial class FrmBGFeaterMerge : BaseWindow { public List Errorlist = new List(); public List Bglist = new List(); /// /// 标记是否合并成功 /// public bool IsMerge = false; public FrmBGFeaterMerge() { InitializeComponent(); this.Resources = Application.LoadComponent(new Uri(string.Format("{0}.{1}", "/Kingo.Plugin.DataCheck;component/Views/V_Resources/V_ResDic", "xaml"), UriKind.Relative)) as ResourceDictionary; DataTemplate datatemplate = this.Resources["ItemNode2"] as DataTemplate; listErrorGeo.ItemTemplate = datatemplate; } /// /// 合并 /// /// /// private void btnOK_MergeClick(object sender, RoutedEventArgs e) { try { IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); List obj_Err = Errorlist.FindAll(x => x.IsChecked == true); List obj_BG = Bglist.FindAll(x => x.IsBgChecked == true); if (obj_Err == null || obj_BG == null) { MessageHelper.ShowTips("数据都不可为空!"); } IGeometry geo = null; IFeature f_bgFc = null; if (obj_Err.Count == 1 && obj_BG.Count == 1) { try { geo = IPolygonExtension.ToGeometry(obj_Err[0].ErrorArea, true, esriGeometryType.esriGeometryPolygon); } catch { geo = IPolygonExtension.ToGeometry(obj_Err[0].ErrorArea, false, esriGeometryType.esriGeometryPolyline); } if (Convert.ToInt32(obj_BG[0].OBJECTID) <= 0 || geo == null) return;//未处理OID为异常的时候; f_bgFc = dltbbg_Layer.FeatureClass.GetFeature(Convert.ToInt32(obj_BG[0].OBJECTID));//变更图斑 if (geo.GeometryType == esriGeometryType.esriGeometryPolyline) { var geometry = RepairGeometry(f_bgFc, geo); IGeometry geometrys = FeatureAPI.Union(f_bgFc.ShapeCopy, geometry); f_bgFc.Shape = geometrys; f_bgFc.Store(); IsMerge = true; this.btnComplat.IsEnabled = true; MessageHelper.ShowTips("合并成功!"); } else if (geo.GeometryType == esriGeometryType.esriGeometryPolygon) { if (FeatureAPI.IsAdjacent(f_bgFc.ShapeCopy, geo) && !FeatureAPI.IsContains(f_bgFc.ShapeCopy, geo)) { IGeometry geometrys = FeatureAPI.Union(f_bgFc.Shape, geo); f_bgFc.Shape = geometrys; f_bgFc.Store(); IsMerge = true; this.btnComplat.IsEnabled = true; MessageHelper.ShowTips("合并成功!"); } else { MessageHelper.ShowTips("合并失败,选择图斑可能为不相邻或包含关系!"); } } } else { MessageHelper.ShowTips("数据勾选错误,应错误图斑和变更图斑各一条!"); } } catch (Exception ex) { LogAPI.Debug(ex.Message); MessageHelper.ShowTips("合并失败!"); } } #region RepairGeometry private IGeometry RepairGeometry(IFeature feature, IGeometry geometry) { IGeometry geometrys = null; try { geometrys = feature.ShapeCopy; IPointCollection ps = geometry as IPointCollection; IPointCollection reshapePath = new PathClass(); reshapePath.AddPointCollection(ps); IGeometryCollection geometryCollection = feature.ShapeCopy as IGeometryCollection; IRing ring = null; for (int i = 0; i < geometryCollection.GeometryCount; i++) { ring = geometryCollection.get_Geometry(i) as IRing; ring.Reshape(reshapePath as IPath); } geometrys = geometryCollection as IGeometry; if (geometrys == null || geometrys.IsEmpty) { return geometrys; } } catch (Exception ex) { LogAPI.Debug($"RepairGeometry异常,异常信息如下:{ex.Message}"); LogAPI.Debug(ex); } return geometrys; } #endregion ///// ///// 转化图形 ///// ///// ///// //private IGeometry GetPolygonFromWkt(string pointsStr) //{ // //OSGeo.OGR.Ogr.RegisterAll(); // IGeometry geometry = new PolygonClass(); // OSGeo.OGR.Geometry rstGeometry = OSGeo.OGR.Geometry.CreateFromWkt(pointsStr); // byte[] geometryBytes = new byte[rstGeometry.WkbSize()]; // rstGeometry.ExportToWkb(geometryBytes); // IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3; // int bytesLen = geometryBytes.Length; // factory.CreateGeometryFromWkbVariant(geometryBytes, out geometry, out bytesLen); // IPolygon polygon = geometry as IPolygon; // polygon.Close(); // ITopologicalOperator pBoundaryTop = polygon as ITopologicalOperator; // pBoundaryTop.Simplify(); // return geometry; //} /// /// /// /// 变更图斑 /// 错误图斑信息 public void GetViewData(List features, DataCheckResult checkResult) { try { Bglist.Clear(); Errorlist.Clear(); //变更图斑 foreach (IFeature f in features) { CheckedBgData datasource = new CheckedBgData { IsBgChecked = false, DataFeaterinfor = "OBJECTID=" + f.get_Value(f.Fields.FindField(f.Class.OIDFieldName)).ToString(), OBJECTID = f.OID.ToString() }; Bglist.Add(datasource); } //错误图斑 CheckedErrData datasources = new CheckedErrData { IsChecked = false, DataFeaterinfor = "错误图形", //"Area=" + checkResult.ErrorDesc.Split('[')[1].Split(']')[0].ToString(), ErrorArea = checkResult.ErrorArea, OBJECTID = checkResult.PrimaryKeyValue, ErrorCode = checkResult.ErrorCode }; Errorlist.Add(datasources); listErrorGeo.ItemsSource = Errorlist; BGChecklist.ItemsSource = Bglist; } catch (Exception ex) { LogAPI.Debug(ex.Message); } } /// /// 取消 /// /// /// private void btnCanleClick(object sender, RoutedEventArgs e) { this.Close(); } private void BtnComplat_Click(object sender, RoutedEventArgs e) { this.IsCancel = false; this.Close(); } /// /// 双击高亮 /// /// /// private void CheckBox_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) { try { IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); object bgData = (e.Source as CheckBox).Parent; CheckBox comboBox = e.Source as CheckBox; string bg_OID = comboBox.Content.ToString().Split('=')[1].ToString();//BG_OID if (!string.IsNullOrWhiteSpace(bg_OID)) { IFeature feature = dltbbg_Layer.FeatureClass.GetFeature(Convert.ToInt32(bg_OID)); if (feature.ShapeCopy != null && !feature.ShapeCopy.IsEmpty) { MapsManager.Instance.MapService.SelectFeature("DLTBBG", bg_OID, false); } } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } } /// /// 选择项数据实体 /// public class CheckedBgData : INotifyPropertyChanged { public bool _IsBgChecked; public bool IsBgChecked { get { return _IsBgChecked; } set { _IsBgChecked = value; RaisePropertyChanged("IsBgChecked"); } } /// /// 数据信息 /// public string DataFeaterinfor { set; get; } public string OBJECTID { set; get; } public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string v) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v)); } } /// /// 选择项数据实体 /// public class CheckedErrData : INotifyPropertyChanged { private bool _IsChecked; public bool IsChecked { get { return _IsChecked; } set { _IsChecked = value; RaisePropertyChanged("IsChecked"); } } /// /// 数据类型 /// public string DataFeaterinfor { set; get; } public string OBJECTID { set; get; } public string EID { set; get; } public string ErrorCode { set; get; } public string ErrorArea { set; get; } public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string v) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v)); } } }