public class FeatureHelper
{
public static void CopyFeature(IFeature pSrcFea, IFeature pDestFea)
{
CopyFeature(pSrcFea, pDestFea, true);
}
public static void CopyFeature(IFeature pSrcFea, IFeature pDestFea, bool pOverwrite)
{
try
{
IFeatureClass class2 = pSrcFea.Table as IFeatureClass;
IFeatureClass class3 = pDestFea.Table as IFeatureClass;
int num = pSrcFea.Fields.FieldCount;
for (int i = 0; i < num; i++)
{
IField field = class2.Fields.get_Field(i);
if ((((field.Type != esriFieldType.esriFieldTypeOID) &&
(field.Type != esriFieldType.esriFieldTypeGeometry))
&& (field != class2.LengthField)) && (field != class2.AreaField))
{
string str = field.Name.ToUpper();
int num3 = class3.Fields.FindField(str);
if (num3 >= 0)
{
IField field2 = class3.Fields.get_Field(num3);
if ((((field2.Type != esriFieldType.esriFieldTypeOID) &&
(field2.Type != esriFieldType.esriFieldTypeGeometry))
&& (field2 != class3.LengthField)) && (field2 != class3.AreaField))
{
object obj2 = pSrcFea.get_Value(i);
if (pOverwrite)
{
if ((obj2 == null) || (obj2 is DBNull))
{
obj2 = null;
}
if (field2.CheckValue(obj2))
{
try
{
pDestFea.set_Value(num3, obj2);
}
catch
{
}
}
}
else
{
object obj3 = pDestFea.get_Value(num3);
if ((obj3 == null) || (obj3 is DBNull))
{
if ((obj2 == null) || (obj2 is DBNull))
{
obj2 = null;
}
if (field2.CheckValue(obj2))
{
try
{
pDestFea.set_Value(num3, obj2);
}
catch
{
}
}
}
}
}
}
}
}
pDestFea.Store();
}
catch (Exception)
{
}
}
public static void CopyRow(IRow pSrcFea, IRow pDestFea)
{
try
{
ITable table = pSrcFea.Table;
ITable table2 = pDestFea.Table;
IField field = null;
IField field2 = null;
IField field3 = null;
IField field4 = null;
if (table is IFeatureClass)
{
field = (table as IFeatureClass).LengthField;
field2 = (table as IFeatureClass).AreaField;
}
if (table2 is IFeatureClass)
{
field3 = (table2 as IFeatureClass).LengthField;
field4 = (table2 as IFeatureClass).AreaField;
}
int num = pSrcFea.Fields.FieldCount;
for (int i = 0; i < num; i++)
{
IField field5 = table.Fields.get_Field(i);
if ((((field5.Type != esriFieldType.esriFieldTypeOID)
&& (field5.Type != esriFieldType.esriFieldTypeGeometry)) && (field5 != field)) && (field5 != field2))
{
string str = field5.Name.ToUpper();
object obj2 = pSrcFea.get_Value(i);
if ((obj2 != null) || (obj2 is DBNull))
{
int num3 = table2.Fields.FindField(str);
if (num3 >= 0)
{
IField field6 = table2.Fields.get_Field(num3);
if (((((field6.Type != esriFieldType.esriFieldTypeOID) &&
(field6.Type != esriFieldType.esriFieldTypeGeometry)) && (field6 != field3)) && (field6 != field4)) && (((obj2 != null) && !(obj2 is DBNull)) && field6.CheckValue(obj2)))
{
try
{
pDestFea.set_Value(num3, obj2);
}
catch
{
}
}
}
}
}
}
pDestFea.Store();
}
catch (Exception)
{
}
}
public static void CopyRow(IRow pSrcFea, IRow pDestFea, List<int> pSrcField, List<int> pDestField)
{
for (int i = 0; i < pSrcField.Count; i++)
{
int num2 = pSrcField[i];
int num3 = pDestField[i];
if ((num2 >= 0) && (num3 >= 0))
{
try
{
object obj2 = pSrcFea.get_Value(num2);
IField field = pDestFea.Fields.get_Field(num3);
if (((obj2 != null) && !(obj2 is DBNull)) && field.CheckValue(obj2))
{
try
{
pDestFea.set_Value(num3, obj2);
}
catch
{
}
}
}
catch (Exception exception)
{
string message = exception.Message;
}
}
}
}
public static void CopyTable(ITable pSrcTable, ITable pDestTable)
{
Exception exception;
try
{
if ((pSrcTable != null) && (pDestTable != null))
{
List<int> pSrcField = null;
List<int> pDestField = null;
CreateFieldMap(pSrcTable, pDestTable, out pSrcField, out pDestField);
ICursor o = pSrcTable.Search(null, true);
int num = pSrcTable.RowCount(null);
if (num > 0)
{
int num2 = (num / 10) + 1;
IWorkspaceEdit edit = (pDestTable as IDataset).Workspace as IWorkspaceEdit;
edit.StartEditing(false);
edit.StartEditOperation();
IRow pSrcFea = o.NextRow();
int num3 = 1;
while (pSrcFea != null)
{
try
{
if ((num2 >= 0x3e8) && ((num3++ % num2) == 0))
{
edit.StopEditOperation();
edit.StopEditing(true);
edit.StartEditing(false);
edit.StartEditOperation();
}
IRow pDestFea = pDestTable.CreateRow();
CopyRow(pSrcFea, pDestFea, pSrcField, pDestField);
if ((pSrcFea is IFeature) && (pDestFea is IFeature))
{
(pDestFea as IFeature).Shape=(pSrcFea as IFeature).ShapeCopy;
}
pDestFea.Store();
}
catch (Exception exception1)
{
exception = exception1;
}
pSrcFea = o.NextRow();
edit.StopEditOperation();
edit.StopEditing(true);
}
Marshal.ReleaseComObject(o);
}
}
}
catch (Exception exception2)
{
exception = exception2;
}
}
public static void CreateFieldMap(ITable pSrcTable, ITable pDestTable, out List<int> pSrcField, out List<int> pDestField)
{
Exception exception;
pSrcField = new List<int>();
pDestField = new List<int>();
int num = pSrcTable.Fields.FieldCount;
IField field = null;
try
{
if (pSrcTable is IFeatureClass)
{
field = (pSrcTable as IFeatureClass).LengthField;
}
}
catch (Exception exception1)
{
exception = exception1;
}
IField field2 = null;
try
{
if (pSrcTable is IFeatureClass)
{
field2 = (pSrcTable as IFeatureClass).AreaField;
}
}
catch (Exception exception2)
{
exception = exception2;
}
IField field3 = null;
try
{
if (pDestTable is IFeatureClass)
{
field3 = (pDestTable as IFeatureClass).LengthField;
}
}
catch (Exception exception3)
{
exception = exception3;
}
IField field4 = null;
try
{
if (pDestTable is IFeatureClass)
{
field4 = (pDestTable as IFeatureClass).AreaField;
}
}
catch (Exception exception4)
{
exception = exception4;
}
for (int i = 0; i < num; i++)
{
IField field5 = pSrcTable.Fields.get_Field(i);
if ((((field5.Type != esriFieldType.esriFieldTypeOID) &&
(field5.Type != esriFieldType.esriFieldTypeGeometry)) && (field5 != field)) && (field5 != field2))
{
string str = field5.Name.ToUpper();
int item = pDestTable.Fields.FindField(str);
if (item >= 0)
{
IField field6 = pDestTable.Fields.get_Field(item);
if ((((field6.Type !=esriFieldType.esriFieldTypeOID) &&
(field6.Type != esriFieldType.esriFieldTypeGeometry)) && (field6 != field3)) && (field6 != field4))
{
pSrcField.Add(i);
pDestField.Add(item);
}
}
}
}
}
public static double GetFeatureDoubleValue(IFeature pFea, string pField)
{
return LSCommonHelper.ConvertHelper.ObjectToDouble(GetRowValue(pFea, pField));
}
public static int GetFeatureIntValue(IFeature pFea, string pField)
{
return LSCommonHelper.ConvertHelper.ObjectToInt(GetRowValue(pFea, pField));
}
public static string GetFeatureStringValue(IFeature pFea, string pField)
{
return GetRowValue(pFea, pField).ToString();
}
public static object GetFeatureValue(IFeature pFea, string pField)
{
return GetRowValue(pFea, pField);
}
public static object GetRowValue(IRow pRow, string pField)
{
if ((pRow != null) && (pField != null))
{
int num = pRow.Fields.FindField(pField);
if (num >= 0)
{
object obj2 = pRow.get_Value(num);
if ((obj2 == null) || (obj2 is DBNull))
{
obj2 = "";
}
return obj2;
}
}
return "";
}
public static void SetFeatureValue(IFeature pFea, string pField, object pValue)
{
SetRowValue(pFea, pField, pValue);
}
public static void SetFeatureValue(IFeatureBuffer pFea, string pField, object pValue)
{
SetRowValue(pFea as IRow, pField, pValue);
}
public static void SetRowValue(IRow pRow, string pField, object pValue)
{
if ((pRow != null) && (pField != null))
{
int num = pRow.Fields.FindField(pField);
if (num >= 0)
{
if ((pValue == null) || (pValue is DBNull))
{
pValue = "";
}
IField field = pRow.Fields.get_Field(num);
if (field.CheckValue(pValue))
{
if ((field.Type == esriFieldType.esriFieldTypeInteger) && ((pValue == null) || (pValue.ToString() == "")))
{
pRow.set_Value(num, 0);
}
else if ((field.Type == esriFieldType.esriFieldTypeDouble) && ((pValue == null) || (pValue.ToString() == "")))
{
pRow.set_Value(num, 0.0);
}
else
{
pRow.set_Value(num, pValue);
}
}
else
{
try
{
pRow.set_Value(num, pValue);
}
catch
{
}
}
}
}
}
}
ArcGIS Engine代码共享-要素(Feature)操作
最新推荐文章于 2020-08-31 16:53:24 发布