Arc Objects10创建线要素图层

来源:互联网 发布:淘宝代销选择品牌技巧 编辑:程序博客网 时间:2024/06/04 03:40

程序的运行环境为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类型的要素层。

0 0