|
|
|
|
using ESRI.ArcGIS.Controls;
|
|
|
|
|
using ESRI.ArcGIS.Geodatabase;
|
|
|
|
|
using ESRI.ArcGIS.Geometry;
|
|
|
|
|
using KGIS.Framework.AE;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace KGIS.Plugin.DataChanging.Utility
|
|
|
|
|
{
|
|
|
|
|
public static class FeatureOperator
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 属性变更历史记录
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="features"></param>
|
|
|
|
|
/// <param name="pEnvelope"></param>
|
|
|
|
|
/// <param name="ActionName"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static bool SaveEditFeatureToHis(List<IFeature> features, IEnvelope pEnvelope, string ActionName)
|
|
|
|
|
{
|
|
|
|
|
if (features == null || features.Count == 0)
|
|
|
|
|
return false;
|
|
|
|
|
IDataset dataset = features[0].Class as IDataset;
|
|
|
|
|
IFeatureClass hisFeatureClass = GetHisFeatureClass(dataset);
|
|
|
|
|
if (hisFeatureClass != null)
|
|
|
|
|
{
|
|
|
|
|
IFeatureClassAPI featureAPI = new FeatureClassAPI(hisFeatureClass);
|
|
|
|
|
List<K_Field> Fields = featureAPI.GetFields();
|
|
|
|
|
int OID = 0;
|
|
|
|
|
//记录变更动作
|
|
|
|
|
OID = InsertAction(dataset.Workspace, EnumActionType.PropertyEdited, features[0].Class.AliasName, (features[0].Class as FeatureClass).BrowseName, "", pEnvelope, ActionName);
|
|
|
|
|
if (OID == 0)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
foreach (var feature in features)
|
|
|
|
|
{
|
|
|
|
|
foreach (K_Field item in Fields)
|
|
|
|
|
{
|
|
|
|
|
if (item.Name.ToUpper() == "ACTIONID")
|
|
|
|
|
{
|
|
|
|
|
item.Value = OID;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
int index = feature.Fields.FindField(item.Name);
|
|
|
|
|
if (index == -1)
|
|
|
|
|
continue;
|
|
|
|
|
item.Value = feature.get_Value(index);
|
|
|
|
|
}
|
|
|
|
|
featureAPI.AddFeature(Fields);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static IFeatureClass GetHisFeatureClass(IDataset dataset)
|
|
|
|
|
{
|
|
|
|
|
if (dataset != null)
|
|
|
|
|
{
|
|
|
|
|
IWorkspace2 workSpace = dataset.Workspace as IWorkspace2;
|
|
|
|
|
string hisDatasetName = dataset.Name + "_HIS";
|
|
|
|
|
if (workSpace.get_NameExists(esriDatasetType.esriDTFeatureClass, hisDatasetName))
|
|
|
|
|
{
|
|
|
|
|
IFeatureWorkspace pFeatureWorkspace = workSpace as IFeatureWorkspace;
|
|
|
|
|
IFeatureClass his = pFeatureWorkspace.OpenFeatureClass(hisDatasetName);
|
|
|
|
|
//检测是否有历史纪录相关字段,没有则创建
|
|
|
|
|
AddFiledToExistFeatureClass(his, "OPTIME", esriFieldType.esriFieldTypeString);
|
|
|
|
|
AddFiledToExistFeatureClass(his, "OPGUID", esriFieldType.esriFieldTypeString);
|
|
|
|
|
return his;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void AddFiledToExistFeatureClass(IFeatureClass featureClass, string fieldName, esriFieldType fieldType)
|
|
|
|
|
{
|
|
|
|
|
if (featureClass.FindField(fieldName) > -1)
|
|
|
|
|
return;
|
|
|
|
|
IClass pClass = featureClass as IClass;
|
|
|
|
|
IFieldsEdit fldsE = featureClass.Fields as IFieldsEdit;
|
|
|
|
|
IField fld = new FieldClass();
|
|
|
|
|
IFieldEdit2 fldE = fld as IFieldEdit2;
|
|
|
|
|
fldE.Type_2 = fieldType;
|
|
|
|
|
fldE.Name_2 = fieldName;
|
|
|
|
|
pClass.AddField(fld);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插入变更动作
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static int InsertAction(IWorkspace pWorkSpace, EnumActionType pActionType, string pOperationLayerName, string layerTableName, string pOIDs, IEnvelope pEnvelope, string ActionName = "", IGeometry geo = null)
|
|
|
|
|
{
|
|
|
|
|
EngineEditorClass editor = new EngineEditorClass();
|
|
|
|
|
ITableAPI tableAPI = null;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
IWorkspaceAPI wkAPI = new WorkspaceAPI(pWorkSpace);
|
|
|
|
|
tableAPI = wkAPI.OpenTable("BGDZB");
|
|
|
|
|
|
|
|
|
|
Dictionary<string, object> data = InsertAction(pActionType, pOperationLayerName, layerTableName, pOIDs, pEnvelope, ActionName, geo);
|
|
|
|
|
if (data == null)
|
|
|
|
|
return 0;
|
|
|
|
|
object OID = tableAPI.AddRow(data);
|
|
|
|
|
return (int)OID;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
if (tableAPI != null)
|
|
|
|
|
tableAPI.CloseTable();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插入变更动作
|
|
|
|
|
/// </summary>
|
|
|
|
|
private static Dictionary<string, object> InsertAction(EnumActionType pActionType, string pOperationLayerName, string layerTableName, string pOIDs, IEnvelope pEnvelope, string ActionName = "", IGeometry geo = null)
|
|
|
|
|
{
|
|
|
|
|
//if (Env.Instance.CurrentActiveBGXM == 0)
|
|
|
|
|
//{
|
|
|
|
|
// MessageHelper.Show("在进行变更之前,请先创建变更项目或者打开现有变更项目!");
|
|
|
|
|
// return null;
|
|
|
|
|
//}
|
|
|
|
|
Dictionary<string, object> dic = new Dictionary<string, object>();
|
|
|
|
|
dic.Add("ProjectID", "1");
|
|
|
|
|
if (pActionType == EnumActionType.SplitFeature)
|
|
|
|
|
dic.Add("ActionName", "土地利用-图斑分割");
|
|
|
|
|
if (pActionType == EnumActionType.MerageFeature)
|
|
|
|
|
dic.Add("ActionName", "土地利用-图斑合并");
|
|
|
|
|
if (pActionType == EnumActionType.AddFeature)
|
|
|
|
|
dic.Add("ActionName", "土地利用-新增图斑");
|
|
|
|
|
if (pActionType == EnumActionType.PropertyEdited)
|
|
|
|
|
dic.Add("ActionName", "土地利用-图斑属性修改");
|
|
|
|
|
//判断传入的值是否存在
|
|
|
|
|
if (pActionType == EnumActionType.None)
|
|
|
|
|
{
|
|
|
|
|
dic.Add("ActionName", ActionName);
|
|
|
|
|
}
|
|
|
|
|
dic.Add("OperationLayerName", pOperationLayerName);
|
|
|
|
|
dic.Add("OperationLayerTableName", layerTableName);
|
|
|
|
|
dic.Add("OperationFeatureOIDs", pOIDs);
|
|
|
|
|
dic.Add("XMax", pEnvelope.XMax);
|
|
|
|
|
dic.Add("XMin", pEnvelope.XMin);
|
|
|
|
|
dic.Add("YMax", pEnvelope.YMax);
|
|
|
|
|
dic.Add("YMin", pEnvelope.YMin);
|
|
|
|
|
dic.Add("CreateTime", DateTime.Now);
|
|
|
|
|
dic.Add("OperationUser", "Admin");
|
|
|
|
|
dic.Add("State", 1);
|
|
|
|
|
dic.Add("IsShow", 1);
|
|
|
|
|
if (geo != null)
|
|
|
|
|
{
|
|
|
|
|
dic.Add("SHAPE", geo);
|
|
|
|
|
}
|
|
|
|
|
return dic;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 变更动作类型
|
|
|
|
|
/// </summary>
|
|
|
|
|
public enum EnumActionType
|
|
|
|
|
{
|
|
|
|
|
None = 0,
|
|
|
|
|
AddFeature = 1,
|
|
|
|
|
SplitFeature = 2,
|
|
|
|
|
MerageFeature = 3,
|
|
|
|
|
PropertyEdited = 4
|
|
|
|
|
}
|
|
|
|
|
}
|