arcengine创建要素类、图层的方法
别人写的,感觉不错
/// <summary>
2 /// 创建要素类
3 /// </summary>
4 /// <param name="pObject">IWorkspace或者IFeatureDataset对象</param>
5 /// <param name="pName">要素类名称</param>
6 /// <param name="pSpatialReference">空间参考</param>
7 /// <param name="pFeatureType">要素类型</param>
8 /// <param name="pGeometryType">几何类型</param>
9 /// <param name="pFields">字段集</param>
10 /// <param name="pUidClsId">CLSID值</param>
11 /// <param name="pUidClsExt">EXTCLSID值</param>
12 /// <param name="pConfigWord">配置信息关键词</param>
13 /// <returns>返回IFeatureClass</returns>
14 public static IFeatureClass CreateFeatureClass(object pObject, string pName, ISpatialReference pSpatialReference, esriFeatureType pFeatureType,
15 esriGeometryType pGeometryType, IFields pFields, UID pUidClsId, UID pUidClsExt, string pConfigWord)
16 {
17 错误检测#region 错误检测
18 if (pObject == null)
19 {
20 throw (new Exception("[pObject] 不能为空!"));
21 }
22 if (!((pObject is IFeatureWorkspace) || (pObject is IFeatureDataset)))
23 {
24 throw (new Exception("[pObject] 必须为IFeatureWorkspace 或者 IFeatureDataset"));
25 }
26 if (pName.Length == 0)
27 {
28 throw (new Exception("[pName] 不能为空!"));
29 }
30 if ((pObject is IWorkspace) && (pSpatialReference == null))
31 {
32 throw (new Exception("[pSpatialReference] 不能为空(对于单独的要素类)"));
33 }
34 #endregion
35
36 pUidClsID字段为空时#region pUidClsID字段为空时
37 if (pUidClsId == null)
38 {
39 pUidClsId = new UIDClass();
40 switch (pFeatureType)
41 {
42 case (esriFeatureType.esriFTSimple):
43 if (pGeometryType == esriGeometryType.esriGeometryLine)
44 pGeometryType = esriGeometryType.esriGeometryPolyline;
45 pUidClsId.Value = "{52353152-891A-11D0-BEC6-00805F7C4268}";
46 break;
47 case (esriFeatureType.esriFTSimpleJunction):
48 pGeometryType = esriGeometryType.esriGeometryPoint;
49 pUidClsId.Value = "{CEE8D6B8-55FE-11D1-AE55-0000F80372B4}";
50 break;
51 case (esriFeatureType.esriFTComplexJunction):
52 pUidClsId.Value = "{DF9D71F4-DA32-11D1-AEBA-0000F80372B4}";
53 break;
54 case (esriFeatureType.esriFTSimpleEdge):
55 pGeometryType = esriGeometryType.esriGeometryPolyline;
56 pUidClsId.Value = "{E7031C90-55FE-11D1-AE55-0000F80372B4}";
57 break;
58 case (esriFeatureType.esriFTComplexEdge):
59 pGeometryType = esriGeometryType.esriGeometryPolyline;
60 pUidClsId.Value = "{A30E8A2A-C50B-11D1-AEA9-0000F80372B4}";
61 break;
62 case (esriFeatureType.esriFTAnnotation):
63 pGeometryType = esriGeometryType.esriGeometryPolygon;
64 pUidClsId.Value = "{E3676993-C682-11D2-8A2A-006097AFF44E}";
65 break;
66 case (esriFeatureType.esriFTDimension):
67 pGeometryType = esriGeometryType.esriGeometryPolygon;
68 pUidClsId.Value = "{496764FC-E0C9-11D3-80CE-00C04F601565}";
69 break;
70 }
71 }
72 #endregion
73
74 pUidClsExt字段为空时#region pUidClsExt字段为空时
75 if (pUidClsExt == null)
76 {
77 switch (pFeatureType)
78 {
79 case esriFeatureType.esriFTAnnotation:
80 pUidClsExt = new UIDClass();
81 pUidClsExt.Value = "{24429589-D711-11D2-9F41-00C04F6BC6A5}";
82 break;
83 case esriFeatureType.esriFTDimension:
84 pUidClsExt = new UIDClass();
85 pUidClsExt.Value = "{48F935E2-DA66-11D3-80CE-00C04F601565}";
86 break;
87 }
88 }
89 #endregion
90
91 字段集合为空时#region 字段集合为空时
92 if (pFields == null)
93 {
94 //实倒化字段集合对象
95 pFields = new FieldsClass();
96 IFieldsEdit tFieldsEdit = (IFieldsEdit)pFields;
97
98 //创建几何对象字段定义
99 IGeometryDef tGeometryDef = new GeometryDefClass();
100 IGeometryDefEdit tGeometryDefEdit = tGeometryDef as IGeometryDefEdit;
101
102 //指定几何对象字段属性值
103 tGeometryDefEdit.GeometryType_2 = pGeometryType;
104 tGeometryDefEdit.GridCount_2 = 1;
105 tGeometryDefEdit.set_GridSize(0, 1000);
106 if (pObject is IWorkspace)
107 {
108 tGeometryDefEdit.SpatialReference_2 = pSpatialReference;
109 }
110
111 //创建OID字段
112 IField fieldOID = new FieldClass();
113 IFieldEdit fieldEditOID = fieldOID as IFieldEdit;
114 fieldEditOID.Name_2 = "OBJECTID";
115 fieldEditOID.AliasName_2 = "OBJECTID";
116 fieldEditOID.Type_2 = esriFieldType.esriFieldTypeOID;
117 tFieldsEdit.AddField(fieldOID);
118
119 //创建几何字段
120 IField fieldShape = new FieldClass();
121 IFieldEdit fieldEditShape = fieldShape as IFieldEdit;
122 fieldEditShape.Name_2 = "SHAPE";
123 fieldEditShape.AliasName_2 = "SHAPE";
124 fieldEditShape.Type_2 = esriFieldType.esriFieldTypeGeometry;
125 fieldEditShape.GeometryDef_2 = tGeometryDef;
126 tFieldsEdit.AddField(fieldShape);
127 }
128 #endregion
129
130 //几何对象字段名称
131 string strShapeFieldName = "";
132 for (int i = 0; i < pFields.FieldCount; i++)
133 {
134 if (pFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
135 {
136 strShapeFieldName = pFields.get_Field(i).Name;
137 break;
138 }
139 }
140
141 if (strShapeFieldName.Length == 0)
142 {
143 throw (new Exception("字段集中找不到几何对象定义"));
144 }
145
146 IFeatureClass tFeatureClass = null;
147 if (pObject is IWorkspace)
148 {
149 //创建独立的FeatureClass
150 IWorkspace tWorkspace = pObject as IWorkspace;
151 IFeatureWorkspace tFeatureWorkspace = tWorkspace as IFeatureWorkspace;
152 tFeatureClass = tFeatureWorkspace.CreateFeatureClass(pName, pFields, pUidClsId, pUidClsExt, pFeatureType, strShapeFieldName, pConfigWord);
153 }
154 else if (pObject is IFeatureDataset)
155 {
156 //在要素集中创建FeatureClass
157 IFeatureDataset tFeatureDataset = (IFeatureDataset)pObject;
158 tFeatureClass = tFeatureDataset.CreateFeatureClass(pName, pFields, pUidClsId, pUidClsExt, pFeatureType, strShapeFieldName, pConfigWord);
159 }
160
161 return tFeatureClass;
162 }