程序的运行环境为VS2010+ArcObjects10,代码完全使用C#。
创建线要素时要分别定义一个线对象和起止点对象,关键代码如下:
IPolyline line = new PolylineClass();
IPoint StartPoint = new PointClass();
IPoint EndPoint = new PointClass();
double X1, Y1, X2, Y2;
X1 = Convert.ToDouble(currentFeature.get_Value(10));
Y1 = Convert.ToDouble(currentFeature.get_Value(11));
X2 = Convert.ToDouble(currentFeature.get_Value(15));
Y2 = Convert.ToDouble(currentFeature.get_Value(16));
StartPoint.X = X1;
StartPoint.Y = Y1;
EndPoint.X = X2;
EndPoint.Y = Y2;
line.FromPoint = StartPoint;
line.ToPoint = EndPoint;
首先完成起始点的坐标赋值,这里currentFeature.get_Value(X)读到的是一个 string 类型的变量,可先不予理会,理解创建线要素的关键过程:起止点的XY坐标赋值——>把起止点赋给线对象的相应属性。
上面是线要素的几何属性的赋值过程,完整的创建线要素的过程可参考如下:
//代码完成的是根据选择的要素集合生成shapefile的过程
//outfileNamePath指定的是输出的shape文件的路径和文件名
//IEnumFeature指定的是输入的某层的要素集合
private IFeatureLayer CreateShpFromSelected(string outfileNamePath, IEnumFeature selectedFeatures)
{
string folder = System.IO.Path.GetDirectoryName(outfileNamePath);
string file = System.IO.Path.GetFileName(outfileNamePath);
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFWS = pWSF.OpenFromFile(folder, 0) as IFeatureWorkspace;
if (File.Exists(outfileNamePath))
{
IFeatureClass featureClass = pFWS.OpenFeatureClass(file);
IDataset pDataset = featureClass as IDataset;
pDataset.Delete();
}
IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
//添加Shape字段
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeometryDef = new GeometryDefClass();
IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
pGeometryDefEdit.SpatialReference_2 = (MainForm.selectedLayer.FeatureClass as IGeoDataset).SpatialReference;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField);
//添加非几何字段
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "Shape_Leng";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "X1";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "Y1";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "Z1";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "X2";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "Y2";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "Z2";
pFieldEdit.Length_2 = 20;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
IFeatureClass pFeatureClass = pFWS.CreateFeatureClass(file, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
IFeature currentFeature = selectedFeatures.Next();
//遍历要素集,同时创建一个新要素接收该要素的所有属性值,并加到要素类中。
while (currentFeature != null)
{
IFeature pFeature = pFeatureClass.CreateFeature();
IPolyline line = new PolylineClass();
IPoint StartPoint = new PointClass();
IPoint EndPoint = new PointClass();
double X1, Y1, X2, Y2;
X1 = Convert.ToDouble(currentFeature.get_Value(10));
Y1 = Convert.ToDouble(currentFeature.get_Value(11));
X2 = Convert.ToDouble(currentFeature.get_Value(15));
Y2 = Convert.ToDouble(currentFeature.get_Value(16));
StartPoint.X = X1;
StartPoint.Y = Y1;
EndPoint.X = X2;
EndPoint.Y = Y2;
line.FromPoint = StartPoint;
line.ToPoint = EndPoint;
pFeature.Shape = line as IGeometry;
pFeature.set_Value(pFeature.Fields.FindField("Shape_Leng"), currentFeature.get_Value(3));
pFeature.set_Value(pFeature.Fields.FindField("X1"), currentFeature.get_Value(10));
pFeature.set_Value(pFeature.Fields.FindField("Y1"), currentFeature.get_Value(11));
pFeature.set_Value(pFeature.Fields.FindField("Z1"), currentFeature.get_Value(12));
pFeature.set_Value(pFeature.Fields.FindField("Y2"), currentFeature.get_Value(15));
pFeature.set_Value(pFeature.Fields.FindField("X2"), currentFeature.get_Value(16));
pFeature.set_Value(pFeature.Fields.FindField("Z2"), currentFeature.get_Value(17));
pFeature.Store();
currentFeature = selectedFeatures.Next();
}
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureClass;
return pFeatureLayer;
}
首先要创建一个Feature对象,然后把创建的line赋值到Feature对象的Shape属性上,再依次对Feature的各非几何字段赋值,最后调用Feature对象的Store函数完成存储。对IEnumFeature的所有Feature对象执行此操作,最终生成的结果为一个shapefile类型的要素层。