gis

arcengine提取拓扑类中的要素(polygon)到指定的要

2019-08-21  本文已影响0人  清远_03d9

1.使用方法

 IFeatureDataset pDataset =
                    (m_pLRModelTask.XYMotherDataBase.MotherWorkspace as IFeatureWorkspace). OpenFeatureDataset("Dataset");
            IGeoDataset pGeoDataset = pDataset as IGeoDataset;
            ISpatialReference m_ipSpatialRef = pGeoDataset.SpatialReference;
            GDBEngineDataBase pGDBEngineDataBase = new GDBEngineDataBase();
CartoAPI.DeleteFeatureClass(m_pLRModelTask.XYMotherDataBase.MotherWorkspace, "TopoError");
            IFeatureClass pTopoFeatureClass = GeoDBAPI.CreateSimpleFeatureClass("TopoError", pDataset, m_ipSpatialRef);
            TopoLayerToPolygonLayer(m_pLRModelTask.XYMotherDataBase.TopoWorkspace2, "拓扑错误2", pTopoFeatureClass);
            Marshal.ReleaseComObject(pTopoFeatureClass);
            Marshal.ReleaseComObject(pDataset);

2.实现思路

      /// <summary>
        /// 提取拓扑类中的polygon到指定的要素类
        /// </summary>
        /// <param name="TopoWorkSpace"></param>
        /// <param name="m_strTopologyName"></param>
        /// <param name="outPutFeatureClass"></param>
        private void TopoLayerToPolygonLayer(IWorkspace TopoWorkSpace,string m_strTopologyName, IFeatureClass outPutFeatureClass)
        {
            //IWorkspace TopoWorkSpace = m_pLRModelTask.XYMotherDataBase.TopoWorkspace2;
            ITopology m_ipTopology = OpenTopology(TopoWorkSpace, m_strTopologyName);
            if(m_ipTopology == null)
            {
                return;
            }
            IGeoDataset pGeoDataset = outPutFeatureClass as IGeoDataset;
            ISpatialReference m_ipSpatialRef = pGeoDataset.SpatialReference;
            // 错误容器
            IErrorFeatureContainer m_ipErrorFeatContainer = (IErrorFeatureContainer)m_ipTopology;

            // 拓扑规则容器
            ITopologyRuleContainer m_ipTopologyRuleContainer = (ITopologyRuleContainer)m_ipTopology;

            IFeatureDataset ipFeatDataset = (TopoWorkSpace as IFeatureWorkspace).OpenFeatureDataset("Dataset");

            IGeoDataset ipGeoDataset = (IGeoDataset)ipFeatDataset;
            IEnvelope ipEnvelope = ipGeoDataset.Extent; // 整个地图范围          

            IEnumRule ipEnumRule = m_ipTopologyRuleContainer.Rules;
            IRule ipRule = ipEnumRule.Next();
            while (ipRule != null)
            {
                ITopologyRule ipTopologyRule = (ITopologyRule)ipRule;
              
                // 获取特定规则的错误(或例外,或错误和例外)
                IEnumTopologyErrorFeature ipEnumErrorFeature =
                                 GetRuleErrors(ipTopologyRule, m_ipErrorFeatContainer, m_ipSpatialRef, ipFeatDataset);
                if(ipEnumErrorFeature == null)
                {
                    continue;
                }

                ITopologyErrorFeature ipErrorFeature = ipEnumErrorFeature.Next();

                while (ipErrorFeature != null) // 遍历错误
                {
                    IFeature ipFeature = (IFeature)ipErrorFeature;
                    IGeometry pGeometry = ipFeature.Shape;
                    pGeometry.Project(m_ipSpatialRef);
                    CreateFeature(pGeometry, outPutFeatureClass);
                    ipErrorFeature = ipEnumErrorFeature.Next();
                }

                    ipRule = ipEnumRule.Next();
            }

        }

        /// <summary>
        /// 获取特定规则的错误(或例外,或错误和例外)
        /// </summary>
        /// <param name="arrayTopoError"></param>
        /// <param name="ipTopoRule"></param>
        /// <param name="ipEnvelope"></param>
        /// <returns></returns>
        public IEnumTopologyErrorFeature GetRuleErrors( ITopologyRule ipTopoRule,
                                  IErrorFeatureContainer m_ipErrorFeatContainer,
                                  ISpatialReference m_ipSpatialRef, IFeatureDataset ipFeatDataset)
        {
            IGeoDataset ipGeoDataset = (IGeoDataset)ipFeatDataset;
            IEnvelope ipEnvelope = ipGeoDataset.Extent; // 整个地图范围            

            // 规则类型
            esriTopologyRuleType ruleType = ipTopoRule.TopologyRuleType;
            string strRuleType = EngineAPI.en_GetRuleNameByTopologyType(ruleType);
           
            // 源图层名称
            int oriClassID = ipTopoRule.OriginClassID;
            string strOrigionAliasClass = "";
            string strOriginClass = GetClassNameByID(oriClassID, ref strOrigionAliasClass, (IFeatureClassContainer)ipFeatDataset);

            // 目标图层名称
            int destClassID = ipTopoRule.DestinationClassID;
            string strDestinationAliasClass = "";
            string strDestinationClass = GetClassNameByID(destClassID, ref strDestinationAliasClass, (IFeatureClassContainer)ipFeatDataset);


            //IEnumTopologyErrorFeature ipEnumErrorFeature =m_ipErrorFeatContainer.get_ErrorFeatures(m_ipSpatialRef, ipTopoRule, ipEnvelope, true, true);
            IEnumTopologyErrorFeature ipEnumErrorFeature =
                m_ipErrorFeatContainer.get_ErrorFeatures(m_ipSpatialRef, ipTopoRule, ipEnvelope, true, true);

            return ipEnumErrorFeature;
        }

        // 根据ID获取要素类名称
        public string GetClassNameByID(int classID, ref string strAliasName, IFeatureClassContainer m_ipFeatClassContainer)
        {
            string strClassName = null;
            IFeatureClass ipFeatClass = m_ipFeatClassContainer.get_ClassByID(classID);
            if (ipFeatClass != null)
            {
                strAliasName = ipFeatClass.AliasName;
                IDataset pGeoDs = (IDataset)ipFeatClass;
                strClassName = pGeoDs.Name;
                pGeoDs = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject(ipFeatClass);
            }
            ipFeatClass = null;
            return strClassName;
        }

        //  打开拓扑类
        private ITopology OpenTopology(IWorkspace TopoWorkSpace,string m_strTopologyName)
        {
            IWorkspace2 pWorkspace = (IWorkspace2)TopoWorkSpace;
            ITopology m_ipTopology = null;

            if (pWorkspace.get_NameExists(esriDatasetType.esriDTTopology, m_strTopologyName))
            {
                ITopologyWorkspace ipTopologyWS;
                ipTopologyWS = (ITopologyWorkspace)TopoWorkSpace;

                if (ipTopologyWS == null)
                {
                    return null;
                }

                m_ipTopology = ipTopologyWS.OpenTopology(m_strTopologyName);
            }
            return m_ipTopology;
        }


        /// <summary>
        /// 在目标图层上创建要素(所有属性信息为空,非编辑操作内完成)
        /// </summary>
        /// <param name="pNewGeom">新要素的图形</param>
        /// <returns>操作结果</returns>
        public bool CreateFeature(IGeometry pNewGeom,IFeatureClass _targetLayer)
        {
           
            try
            {
                //IFeatureClass pFeatureClass = _targetLayer.FeatureClass;
                IFeature pFeature = _targetLayer.CreateFeature();
                pFeature.Shape = pNewGeom;
                pFeature.Store();
                return true;
            }
            catch (Exception ex)
            {
                Logger.Exception<EditControl>(ex);
                return false;
            }
        }
上一篇下一篇

猜你喜欢

热点阅读