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类型的要素层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcEngine中实现点要素图层的唯一值符号化,您可以按照以下步骤进行操作: 1. 打开要素类并获取要素集合。使用IFeatureClass接口打开要素类,并使用IFeatureCursor接口获取要素集合。 ```csharp IFeatureClass featureClass = ...; // 打开要素类 IFeatureCursor featureCursor = featureClass.Search(null, false); // 获取要素集合 ``` 2. 创建唯一值符号化渲染器。使用ISimpleRenderer接口创建一个新的SimpleRenderer对象,并使用IUniqueValueRenderer接口将其转换为唯一值符号化渲染器。 ```csharp ISimpleRenderer simpleRenderer = new SimpleRenderer(); IUniqueValueRenderer uniqueValueRenderer = simpleRenderer as IUniqueValueRenderer; ``` 3. 设置字段和符号。指定用于唯一值分类的字段,并为每个唯一值设置符号。 ```csharp uniqueValueRenderer.FieldCount = 1; // 设置字段数量 uniqueValueRenderer.set_Field(0, "FieldName"); // 设置用于分类的字段名称 // 为每个唯一值设置符号 ISymbol symbol = ...; // 设置符号 uniqueValueRenderer.AddValue("Value1", "", symbol); // 添加第一个唯一值和对应的符号 uniqueValueRenderer.AddValue("Value2", "", symbol); // 添加第二个唯一值和对应的符号 // ... // 可以重复上述步骤为更多唯一值设置符号 ``` 4. 应用渲染器到图层。获取要素图层对象,并将唯一值符号化渲染器应用到图层的渲染器属性中。 ```csharp IFeatureLayer featureLayer = ...; // 获取要素图层对象 featureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer; // 应用渲染器到图层 ``` 5. 刷新地图并显示唯一值符号化的结果。调用IMap接口的Refresh方法刷新地图,并使用IActiveView接口的Refresh和PartialRefresh方法来更新显示。 ```csharp IMap map = ...; // 获取地图对象 map.Refresh(); // 刷新地图 IActiveView activeView = map as IActiveView; activeView.Refresh(); // 刷新活动视图 activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); // 部分刷新,更新地理数据 ``` 请根据您的具体需求自行填充代码中的缺失部分,例如打开要素类、设置字段和符号等。希望这些信息对您有所帮助!如有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值