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));
}
}
}