You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
554 lines
26 KiB
554 lines
26 KiB
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 |
|
{ |
|
/// <summary> |
|
/// FrmAttribureEdit.xaml 的交互逻辑 |
|
/// </summary> |
|
public partial class FrmMerge : Window |
|
{ |
|
public FrmMerge() |
|
{ |
|
InitializeComponent(); |
|
} |
|
List<DataSource> groupList; |
|
public IHookHelper m_hookHelper; |
|
public bool IsPromptAgain = true; |
|
public void BindData() |
|
{ |
|
gridData.ItemsSource = null; |
|
IMap map = MapsManager.Instance.MapService.getAxMapControl().ActiveView.FocusMap; |
|
Dictionary<string, List<IFeature>> SelectedFeature = GetSelectedFeaturesDic(map); |
|
groupList = new List<DataSource>(); |
|
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<string, List<IFeature>> GetSelectedFeaturesDic(IMap map, esriGeometryType geoType = esriGeometryType.esriGeometryAny) |
|
{ |
|
if (map == null) |
|
return null; |
|
IEnumFeature enumFeature = map.FeatureSelection as IEnumFeature; |
|
if (enumFeature == null) |
|
return null; |
|
Dictionary<string, List<IFeature>> geoList = new Dictionary<string, List<IFeature>>(); |
|
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<IFeature>() { feart }); |
|
} |
|
} |
|
} |
|
feart = enumFeature.Next(); |
|
} |
|
return geoList; |
|
} |
|
/// <summary> |
|
/// 点击定位 |
|
/// </summary> |
|
/// <param name="sender"></param> |
|
/// <param name="e"></param> |
|
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); |
|
} |
|
} |
|
/// <summary> |
|
/// 合并 |
|
/// </summary> |
|
/// <param name="sender"></param> |
|
/// <param name="e"></param> |
|
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<string> bsmList = new List<string>(); |
|
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<IFeatureClass>() { 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<IFeature> 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<IFeatureClass>() { 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<IFeature> 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<IFeatureClass>() { 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) |
|
{ |
|
|
|
} |
|
} |
|
|
|
}
|
|
|