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.
172 lines
6.8 KiB
172 lines
6.8 KiB
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 |
|
} |
|
}
|
|
|