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