创建要素类,关系类,ITopologicalOperator接口



1.创建要素类时ESRI.ArcGIS.esriSystem.UID CLSID的赋值很重要!

  /// <summary>
        /// 创建Line要素类
        /// </summary>
        /// <param name="workspace">工作空间</param>
        /// <param name="featureDataset">要素集名称</param>
        /// <param name="featureClassName">要素类名称</param>
        /// <param name="pSpatialReference">坐标系</param>
        /// <returns></returns>
        public IFeatureClass CreateFeatureClassForLine(IWorkspace2 workspace, IFeatureDataset featureDataset, String featureClassName, ISpatialReference pSpatialReference)
        {
            ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass;
            ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace; // Explicit Cast

            if (workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName)) //feature class with that name already exists 
            {
                IFeatureClass pFeaCls = (workspace as IFeatureWorkspace).OpenFeatureClass(featureClassName);
                (pFeaCls as ITable).DeleteSearchedRows(null);
                return pFeaCls;
            }

            if (featureClassName == "")
            {
                return null; 
            }
            ESRI.ArcGIS.esriSystem.UID CLSID = null;
            ESRI.ArcGIS.esriSystem.UID CLSEXT = null;
            System.String strConfigKeyword = null;

            // assign the class id value if not assigned
            if (CLSID == null)
            {
                CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
                CLSID.Value = "esriGeoDatabase.Feature";
                //CLSID.Value = "esriGeometryType.esriGeometryPolyline";
            }

            IObjectClassDescription objectClassDescription = new FeatureClassDescriptionClass();
            IFields fields = null;
            // if a fields collection is not passed in then supply our own
            if (fields == null)
            {
                // create the fields using the required fields method
                fields = objectClassDescription.RequiredFields;
                IFieldsEdit fieldsEdit = (IFieldsEdit)fields; // Explicit Cast
                IField field = new FieldClass();

                // create a user defined text field
                IFieldEdit fieldEdit = (IFieldEdit)field; // Explicit Cast

                // setup field properties
                fieldEdit.Name_2 = "FeatureType";
                fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                fieldEdit.IsNullable_2 = true;
                fieldEdit.AliasName_2 = "要素类型";
                fieldEdit.DefaultValue_2 = "0";
                fieldEdit.Editable_2 = true;
                fieldEdit.Length_2 = 100;

                // add field to field collection
                fieldsEdit.AddField(field);
                fields = (IFields)fieldsEdit;  
            }

            System.String strShapeField = "";

            // locate the shape field
            for (int j = 0; j < fields.FieldCount; j++)
            {
                if (fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry)
                {
                    //strShapeField = fields.get_Field(j).Name;
                    IField shapeField = fields.get_Field(j);
                    strShapeField = fields.get_Field(j).Name;
                    IGeometryDef geometryDef = shapeField.GeometryDef;
                    IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;

                    // Alter the feature class geometry type to lines (default is polygons).
                    geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
                    geometryDefEdit.HasM_2 = true;
                    geometryDefEdit.GridCount_2 = 1;

                    // Set the first grid size to zero and allow ArcGIS to determine a valid grid size.
                    geometryDefEdit.set_GridSize(0, 0);
                    ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
                    //geometryDefEdit.SpatialReference_2 = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
                    geometryDefEdit.SpatialReference_2 = pSpatialReference;

                    break;
                }
            }

            // Use IFieldChecker to create a validated fields collection.
            IFieldChecker fieldChecker = new FieldCheckerClass();
            IEnumFieldError enumFieldError = null;
            IFields validatedFields = null;
            fieldChecker.ValidateWorkspace = (IWorkspace)workspace;
            fieldChecker.Validate(fields, out enumFieldError, out validatedFields);

            // The enumFieldError enumerator can be inspected at this point to determine 
            // which fields were modified during validation.

            // finally create and return the feature class
            if (featureDataset == null)// if no feature dataset passed in, create at the workspace level
            {
                featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
            }
            else
            {
                featureClass = featureDataset.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
            }
            return featureClass;
        }



2.创建掩码图形,并维护相应的关系类,针对图层的选择集

  /// <summary>
        /// 创建掩码图形,并维护相应的关系类,针对图层的选择集
        /// </summary>
        /// <param name="ipTrackPolygon"></param>
        /// <param name="ipMaskedFeaturely"></param>
        /// <param name="ipRelationshipClass"></param>
        public static void CreateMaskRelationship(IGeometry ipTrackPolygon, IFeatureLayer ipMaskedFeaturely, IRelationshipClass ipRelationshipClass)
        {
            IFeatureSelection ipFeatureS = ipMaskedFeaturely as IFeatureSelection;
            ISelectionSet ipSelectionSet = ipFeatureS.SelectionSet;
            if (ipSelectionSet.Count == 0) return;

            ICursor pCursor;
            ipSelectionSet.Search(null, false, out pCursor);//获得选择集的查询Cursor
            if (pCursor == null)
            {
                XtraMessageBox.Show("当前没有选择的要素符号,请确认!");
                return;
            }
            IFeatureCursor pFtCur = pCursor as IFeatureCursor;
            IObjectClass ipObjectClass = ipRelationshipClass.OriginClass;
            IFeatureClass ipOriginFeatureClass = ipObjectClass as IFeatureClass;//原始目标要素类,mask要素类
            // 开始编辑 掩膜层
            //为掩膜层TERL_RepsMask创建新的要素
            IFeatureCursor ipFeatureCursor = ipOriginFeatureClass.Insert(true);
            IFeatureBuffer ipFeatureBuffer = ipOriginFeatureClass.CreateFeatureBuffer();
            ipFeatureBuffer.Shape = ipTrackPolygon;
            object varID = ipFeatureCursor.InsertFeature(ipFeatureBuffer);
            ipFeatureCursor.Flush();
            int FeatureID = (int)varID;
            IFeature ipCreateDMaskFeature = ipOriginFeatureClass.GetFeature(FeatureID);//获取新的掩膜要素
            //IGeometry ipMaskGeometry = ipCreateDMaskFeature.Shape;
            IFeature ipSelectedFeature = null;
            // 获取当前过滤图层的要素类型
            while ((ipSelectedFeature = pFtCur.NextFeature()) != null)
            {
                IRelationship ipRelationShip;
                IObject ipFeatureObject;
                ipFeatureObject = ipSelectedFeature;
                IObject ipFeatureMaskObject;
                ipFeatureMaskObject = ipCreateDMaskFeature;
                ipRelationShip = ipRelationshipClass.CreateRelationship(ipFeatureMaskObject, ipFeatureObject);
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pCursor);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pFtCur);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(ipFeatureCursor);
        }

    }


3.使用ITopologicalOperator 接口获取输出要素时,注意参数esriGeometryDimension的设置!

   /// <summary>
        ///  提取跳绘要素
        /// </summary>
        /// <param name="pFeaCls_JJX">境界线图层</param>
        /// <param name="pFeaCls_HL">河流、道理图层</param>
        /// <param name="pSpatialReference">空间参考</param>
        /// <param name="FeaClsTiaoHuiName">制图表达RuleID值字段</param>
        /// <returns></returns>
        private bool CreateTiaoHuiFeaCls(IFeatureClass pFeaCls_JJX, IFeatureClass pFeaCls_HL, ISpatialReference pSpatialReference, IFeatureClass pTiaohuiFeaCls, IFeatureClass pMaskFeaCls)
        {
            List<GeometryAttri> plistExporyGeometry = new List<GeometryAttri>();
            try
            {
                List<GeometryAttri> plistGeometry_JJX = PutSelectedGeomIntoBag(pFeaCls_JJX, null);
                List<GeometryAttri> plistGeometry_HL = PutSelectedGeomIntoBag(pFeaCls_HL, null);
                foreach (GeometryAttri pGeo_JJX in plistGeometry_JJX)
                {
                    ITopologicalOperator pTopo = pGeo_JJX.PGeometry as ITopologicalOperator;
                    double douRepSize = pGeo_JJX.RepreSize;

                    foreach (GeometryAttri pGeo_HL in plistGeometry_HL)
                    {
                        IGeometry pExportGeometry = pTopo.Intersect(pGeo_HL.PGeometry, esriGeometryDimension.esriGeometryNoDimension);
                        if (pExportGeometry != null && pExportGeometry.IsEmpty == false)
                        {
                            GeometryAttri geometryAttri = new GeometryAttri();
                            geometryAttri.PGeometry = pExportGeometry;
                            geometryAttri.RepreSize = douRepSize;

                            plistExporyGeometry.Add(geometryAttri);
                        }
                    }
                }

                //ISpatialReference pSpatialReference = GlobalVars.instance.MapControl.SpatialReference;
                using (ComReleaser pComRelease = new ComReleaser())
                {
                    foreach (GeometryAttri geometry in plistExporyGeometry)
                    {
                        //写入跳绘图层
                        IFeature pFea_TiaoHui = pTiaohuiFeaCls.CreateFeature();
                        pFea_TiaoHui.Shape = geometry.PGeometry;
                        pFea_TiaoHui.Store();

                        //写入掩膜图层
                        IFeature pFea_Mask = pMaskFeaCls.CreateFeature();
                        IGeometry pGeoBuffer = (geometry.PGeometry as ITopologicalOperator).Buffer(geometry.RepreSize);
                        pFea_Mask.Shape = pGeoBuffer;
                        pFea_Mask.Store();
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 获取FeatureClass所有要素(Feature)的Geometry对象集合
        /// </summary>
        /// <param name="pFeaCls"></param>
        /// <param name="pQuery">查询条件</param>
        /// <returns></returns>
        public static List<GeometryAttri> PutSelectedGeomIntoBag(IFeatureClass pFeaCls, IQueryFilter pQuery)
        {
            IFeatureLayer pFeaLyr = new FeatureLayerClass();
            pFeaLyr.FeatureClass = pFeaCls;
            IRepresentationRenderer pRepRenderer = (pFeaLyr as IGeoFeatureLayer).Renderer as IRepresentationRenderer;

            List<GeometryAttri> plistGeometryAttri = new List<GeometryAttri>();
            //获取选中的features
            IFeature pFeature = null;
            try
            {
                IFeatureCursor pFeaCursor = pFeaCls.Search(pQuery, false);

                while ((pFeature = pFeaCursor.NextFeature()) != null)
                {
                    double RepSize = getRepresentionLineSize(pRepRenderer, pFeature, GlobalVars.instance.MapControl);
                    GeometryAttri geometryAttri = new GeometryAttri();
                    IGeometry pGeo = pFeature.ShapeCopy;

                    if (pGeo != null)
                    {
                        geometryAttri.PGeometry = pGeo;
                        geometryAttri.RepreSize = RepSize;
                    }
                    plistGeometryAttri.Add(geometryAttri);
                }
                return plistGeometryAttri;
            }
            catch (Exception ex)
            {
                return null;
            }
        }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值