Arc Objects10创建线要素图层

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


转载自:https://blog.csdn.net/jovon/article/details/21476623

You may also like...