目录
1.Intro
主要针对字段创建、删除、检查、获取和挂接表等的属性操作。
2.Environment
Environment:Windows 7及以上
Language:C#
IDE:Visual Studio 2012
SDK:ArcGIS Engine 10.2
3.Source
[Guid("8b52d619-b130-405c-bc90-47ca3ede3ecf")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libs_GIS.Attribute_Operate")]
public sealed class Attribute_Operate
{
#region 获取游标
/// <summary>
/// 获取选择要素,返回游标进行查询操作
/// </summary>
/// <param name="pFeatureLayer">要素图层对象</param>
/// <returns>返回游标对象</returns>
public static IFeatureCursor GetSelectedFeatures_Search(IFeatureLayer pFeatureLayer)
{
ICursor pCursor = null;
IFeatureCursor pFeatureCursor = null;
if (pFeatureLayer == null) return null;
//选定的特征集
IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
if (pSelectionSet.Count == 0) return null;
pSelectionSet.Search(null, false, out pCursor);
pFeatureCursor = pCursor as IFeatureCursor;
return pFeatureCursor;
}
/// <summary>
/// 获取选择要素,返回游标进行更新操作
/// </summary>
/// <param name="pFeatLyr">要素图层对象</param>
/// <returns>返回游标对象</returns>
public static IFeatureCursor GetSelectedFeatures_Update(IFeatureLayer pFeatureLayer)
{
ICursor pCursor = null;
IFeatureCursor pFeatureCursor = null;
if (pFeatureLayer == null)
{
return null;
}
//选定的特征集
IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
ISelectionSet2 pSelectionSet2 = pFeatureSelection.SelectionSet as ISelectionSet2;
if (pSelectionSet2.Count == 0)
{
return null;
}
pSelectionSet2.Update(null, false, out pCursor);
pFeatureCursor = pCursor as IFeatureCursor;
return pFeatureCursor;
}
#endregion
#region 要素数量统计
/// <summary>
/// 获取要素的数量(图层获取)
/// </summary>
/// <param name="pFeatureLayer">要素图层对象</param>
/// <returns>返回要素个数</returns>
public static int Get_Feature_Count(IFeatureLayer pFeatureLayer)
{
return pFeatureLayer.FeatureClass.FeatureCount(null);
}
/// <summary>
/// 获取要素的数量(图层获取)
/// </summary>
/// <param name="pFeatureLayer">要素图层对象</param>
/// <param name="pQueryFilter">查询语句</param>
/// <returns>返回要素个数</returns>
public static int Get_Feature_Count(IFeatureLayer pFeatureLayer, IQueryFilter pQueryFilter)
{
return pFeatureLayer.FeatureClass.FeatureCount(pQueryFilter);
}
/// <summary>
/// 获取要素的数量(游标获取)
/// </summary>
/// <param name="pFeatureCursor">游标对象</param>
/// <returns>返回要素个数</returns>
public static int Get_Feature_Count(IFeatureCursor pFeatureCursor)
{
int count = 0;
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
count++;
pFeature = pFeatureCursor.NextFeature();
}
return count;
}
/// <summary>
/// 获取图层要素中选中的要素数量
/// </summary>
/// <param name="pFeatureLayer">要素图层对象</param>
/// <returns>返回选中个数</returns>
public static int Get_SelectedFeature_Count(IFeatureLayer pFeatureLayer)
{
IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
int selected_Count = pSelectionSet.Count;
return selected_Count;
}
#endregion
#region 字段创建、检查、删除和获取所有字段名称
/// <summary>
/// 检查字段名是否存在
/// </summary>
/// <param name="field_Name">字段名</param>
/// <returns>返回检查结果,存在返回true,不存在返回false</returns>
public static bool Check_Field_Exists(IFeatureLayer pFeatureLayer, string field_Name)
{
IFields pFields = pFeatureLayer.FeatureClass.Fields;
if (pFields.FindField(field_Name) == -1)
{
return false;
}
else
{
return true;
}
}
/// <summary>
/// 创建字段
/// </summary>
/// <param name="pFeatureLayer">要素图层对象</param>
/// <param name="field_Name">字段名</param>
/// <param name="field_AliasName">字段别名</param>
/// <param name="field_Type">字段类型</param>
public static void Create_Field(IFeatureLayer pFeatureLayer, string field_Name, string field_AliasName, string field_Type)
{
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IClass pClass = pFeatureClass as IClass;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = field_Name;
pFieldEdit.AliasName_2 = field_AliasName;
switch (field_Type.ToLower().Trim().ToString())
{
case "int":
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
break;
case "text":
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
break;
case "date":
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate;
break;
case "double":
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
break;
case "long":
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
break;
case "float":
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSingle;
break;
}
pClass.AddField(pField);
}
/// <summary>
/// 删除字段
/// </summary>
/// <param name="featureLayer">要素图层对象</param>
/// <param name="field_Name">字段名称</param>
public static void Delete_Field(IFeatureLayer featureLayer, string field_Name)
{
ITable pTable = featureLayer as ITable;
IFields pFields = pTable.Fields;
int index_Field = pFields.FindField(field_Name);
IField pField = pFields.get_Field(index_Field);
pTable.DeleteField(pField);
}
/// <summary>
/// 获取全部字段名
/// </summary>
/// <param name="pFeatureClass">要素类对象</param>
/// <returns>返回字段名列表</returns>
public static List<string> Get_AllFieldsName(IFeatureClass pFeatureClass)
{
int num = pFeatureClass.Fields.FieldCount;
List<string> list_FieldsName = new List<string>();
for (int i = 0; i < num; i++)
{
string name = pFeatureClass.Fields.get_Field(i).Name;
list_FieldsName.Add(name);
}
return list_FieldsName;
}
#endregion
#region 字段赋值
/// <summary>
/// 要素属性获取
/// </summary>
/// <param name="pFeature">要素对象</param>
/// <param name="field_Name">字段名称</param>
/// <returns>返回字段值</returns>
private static object Get_FieldValue(IFeature pFeature, string field_Name)
{
int index = pFeature.Class.FindField(field_Name);
object value = pFeature.get_Value(index);
return value;
}
/// <summary>
/// 要素属性赋值
/// </summary>
/// <param name="pFeature">要素对象</param>
/// <param name="field_Name">字段名</param>
/// <param name="field_Value">字段值</param>
private static void Set_FieldValue(IFeature pFeature, string field_Name, object field_Value)
{
int index = pFeature.Class.FindField(field_Name);
pFeature.set_Value(index, field_Value);
}
#endregion
#region 挂接表操作
/// <summary>
/// 设置属性关联
/// </summary>
/// <param name="featureLayer">需要关联的图层要素</param>
/// <param name="baseFeatureLayer">关联基于的图层要素</param>
private static void Set_JoinTable(IFeatureLayer featureLayerToJoin, IFeatureLayer baseFeatureLayerToJoin, string join_Field = "OBJECTID", string base_JoinField = "OBJECTID")
{
try
{
IFeatureClass pFClass = baseFeatureLayerToJoin.FeatureClass;
ITable pForeignTable = featureLayerToJoin.FeatureClass as ITable;
IMemoryRelationshipClassFactory pMemoRelCFactory = new MemoryRelationshipClassFactoryClass();
IRelationshipClass pRelationshipClass = pMemoRelCFactory.Open(
"TableJoin1",
pFClass, // 基于join的图层要素
base_JoinField,
(IObjectClass)pForeignTable, // join的图层要素
join_Field,
"forward",
"backward",
esriRelCardinality.esriRelCardinalityOneToOne
);
IDisplayRelationshipClass pDisplayRelationshipClass = (IDisplayRelationshipClass)featureLayerToJoin;
pDisplayRelationshipClass.DisplayRelationshipClass(pRelationshipClass, esriJoinType.esriLeftOuterJoin); //左连接。
}
catch
{
return;
}
}
/// <summary>
/// 获取Join后的FeatureClass对象
/// </summary>
/// <param name="featureLayerToJoin">需要join的图层对象</param>
/// <param name="baseFeatureLayerToJoin">基于的join图层对象</param>
/// <param name="join_Field">join字段</param>
/// <returns>返回join后的要素对象</returns>
private static IFeatureClass Get_BaseJoinFeatureClass(IFeatureLayer featureLayerToJoin, IFeatureLayer baseFeatureLayerToJoin, string join_Field = "OBJECTID", string base_JoinField = "OBJECTID")
{
IFeatureClass baseJoinFeatureClass = baseFeatureLayerToJoin.FeatureClass;
ITable pBaseJoinTable = baseJoinFeatureClass as ITable;
IFeatureClass joinFeatureClass = featureLayerToJoin.FeatureClass;
ITable pJoinTable = joinFeatureClass as ITable;
IMemoryRelationshipClassFactory memoryRelClassFactory = new MemoryRelationshipClassFactory();
IRelationshipClass relationshipClass = memoryRelClassFactory.Open(
"TableJoin1",
pBaseJoinTable as IObjectClass, // 基于join的图层要素
base_JoinField,
pJoinTable as IObjectClass, // join的图层要素
join_Field,
"forward",
"backward",
esriRelCardinality.esriRelCardinalityOneToOne
);
IRelationshipClassCollectionEdit pRelClassCollEdit = baseFeatureLayerToJoin as IRelationshipClassCollectionEdit;
pRelClassCollEdit.AddRelationshipClass(relationshipClass);
IDisplayTable displayTable = pRelClassCollEdit as IDisplayTable;
IFeatureClass outputFeatureClass = displayTable.DisplayTable as IFeatureClass;
return outputFeatureClass;
}
#endregion
}
4.Conclusion
不多比比,直接上代码,都在注释里了兄弟。