美文网首页gis
arcengine提取拓扑类中的要素(polygon)到指定的要

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

作者: 清远_03d9 | 来源:发表于2019-08-21 18:33 被阅读0次

    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;
                }
            }
    

    相关文章

      网友评论

        本文标题:arcengine提取拓扑类中的要素(polygon)到指定的要

        本文链接:https://www.haomeiwen.com/subject/rlwisctx.html