Exemplo n.º 1
0
        /// <summary>
        /// 从工作空间中获得指定的拓扑
        /// </summary>
        /// <param name="featureWorkspace">要素工作空间</param>
        /// <param name="topoDatasetName">包含拓扑的要素数据集名称</param>
        /// <param name="topoName">拓扑名称</param>
        /// <returns></returns>
        public static ITopology GetTopologyByName(this IFeatureWorkspace featureWorkspace, string topoDatasetName, string topoName)
        {
            IFeatureDataset    featureDataset    = featureWorkspace.OpenFeatureDataset(topoDatasetName);
            ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset;

            return(topologyContainer.get_TopologyByName(topoName));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 在数据集中构建拓扑
        /// </summary>
        /// <param name="IN_TopoName">要生成拓扑的名称</param>
        /// <param name="IN_Tolerance">拓扑容差,可选,默认0.001</param>
        public void PUB_TopoBuild(string IN_TopoName, double IN_Tolerance = 0.001)
        {
            ITopologyContainer topologyContainer = (ITopologyContainer)FeatureDataset_Main;

            try//若不存在同名拓扑则添加
            {
                Topology = topologyContainer.get_TopologyByName(IN_TopoName);
                MessageBox.Show("已存在该拓扑。");
            }
            catch
            {
                try
                {
                    Topology = topologyContainer.CreateTopology(IN_TopoName, IN_Tolerance, -1, "");
                }
                catch (COMException comExc)
                {
                    MessageBox.Show(String.Format("拓扑创建出错: {0} 描述: {1}", comExc.ErrorCode, comExc.Message));
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 在数据集中构建拓扑
        /// </summary>
        /// <param name="IN_TopoName">要生成拓扑的名称</param>
        /// <param name="IN_Tolerance">拓扑容差,可选,默认0.001</param>
        public void PUB_TopoBuild(string IN_TopoName, double IN_Tolerance = 0.001)
        {
            TP_topoName = IN_TopoName;
            ITopologyContainer topologyContainer = (ITopologyContainer)FeatureDataset_Main;

            try//若不存在同名拓扑则添加
            {
                Topology = topologyContainer.get_TopologyByName(IN_TopoName);
                CommonClass common = new CommonClass();
                common.DeleteTopolgyFromGISDB(Topology);
                DeleteFeature(TP_topoName);
            }
            catch
            {
            }
            try
            {
                Topology = topologyContainer.CreateTopology(IN_TopoName, IN_Tolerance, -1, "");
            }
            catch (COMException comExc)
            {
                MessageBox.Show(String.Format("拓扑创建出错: {0} 描述: {1}", comExc.ErrorCode, comExc.Message));
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 设置检查用到的拓扑
        /// </summary>
        private void SetCheckTopo()
        {
            #region 从MAP上获取其要素操作空间及数据集名称
            string            FeatureDataset_Name = "";    //要素数据集的名字
            IFeatureWorkspace pFeatureWorkspace;           //定义要素操作空间
            ///通过MAP上的图层获取我们所需要的数据集
            ILayer layer   = null;                         //定义用来接收指定组下面的图层
            int    L_count = _AppHk.MapControl.LayerCount; //MAP上总图层数
            if (L_count == 0)
            {
                return;              //当MAP上是空,就返回
            }
            for (int G = 0; G < L_count; G++)
            {
                ILayer temp_layer = _AppHk.MapControl.get_Layer(G);
                //判别是不是组,如果是,就从组中取一个层
                if (temp_layer is IGroupLayer && temp_layer.Name == SetCheckState.CheckDataBaseName)
                {
                    ICompositeLayer grouplayer = temp_layer as ICompositeLayer;//把组图层转成组合图层
                    if (grouplayer.Count == 0)
                    {
                        return;
                    }
                    layer = grouplayer.get_Layer(0);//得到MAP中其中一个层
                    break;
                }
            }
            IFeatureLayer f_layer = layer as IFeatureLayer;
            IFeatureClass cl      = f_layer.FeatureClass;//得到对应的要素类
            if (cl.FeatureDataset == null)
            {
                SetCheckState.Message(pAppFormRef, "提示", "您所操作的数据是离散的,请先做数据预处理!");
                return;
            }
            else
            {
                pFeatureWorkspace   = cl.FeatureDataset.Workspace as IFeatureWorkspace;
                FeatureDataset_Name = cl.FeatureDataset.Name;//得到要素类的数据集名称
            }
            #endregion
            IFeatureDataset pfd = pFeatureWorkspace.OpenFeatureDataset(FeatureDataset_Name);//打开一个DATASET数据集

            IGeoDataset pGeoDataset = pfd as IGeoDataset;
            if (pGeoDataset != null)
            {
                SetCheckState.Geodatabase = pGeoDataset;
            }
            ITopologyContainer pTc = pfd as ITopologyContainer;//转成创建拓扑需要的对应对象接口
            #region 创建拓扑,后面的检查都使用这个拓扑
            if (SetCheckState.pT == null)
            {
                ITopology pT_temp = null;//定义一个临时的拓扑
                try
                {
                    if (SetCheckState.CheckDataBaseName == "更新修编数据" || SetCheckState.CheckDataBaseName == "工作库数据")
                    {
                        pT_temp = pTc.get_TopologyByName("Rule");//查找拓扑
                    }
                    else if (SetCheckState.CheckDataBaseName == "现势库数据")
                    {
                        pT_temp = pTc.get_TopologyByName("Rule1");//查找拓扑
                    }
                    if (pT_temp != null)
                    {
                        SetCheckState.pT        = pT_temp;//如果拓扑已存在,我们就把原先的拓扑赋值给定义的全局拓扑
                        SetCheckState.pRuleCont = SetCheckState.pT as ITopologyRuleContainer;
                    }
                }
                catch
                {
                    if (SetCheckState.CheckDataBaseName == "更新修编数据" || SetCheckState.CheckDataBaseName == "工作库数据")
                    {
                        SetCheckState.pT = pTc.CreateTopology("Rule", pTc.DefaultClusterTolerance, -1, "");//创建了个名叫Rule的拓扑。
                    }
                    else if (SetCheckState.CheckDataBaseName == "现势库数据")
                    {
                        SetCheckState.pT = pTc.CreateTopology("Rule1", pTc.DefaultClusterTolerance, -1, "");//创建了个名叫Rule的拓扑。
                    }
                    SetCheckState.pRuleCont = SetCheckState.pT as ITopologyRuleContainer;
                    for (int l = 0; l < L_count; l++)
                    {
                        ILayer layer_1 = _AppHk.MapControl.get_Layer(l); //通过索引得到对应的层
                        #region                                          //判别是不是组,如果是,就从组中取一个层
                        if (layer_1 is IGroupLayer && layer_1.Name == SetCheckState.CheckDataBaseName)
                        {
                            ICompositeLayer grouplayer_1 = layer_1 as ICompositeLayer;//把组图层转成组合图层
                            int             group_count  = grouplayer_1.Count;
                            if (group_count == 0)
                            {
                                return;
                            }
                            for (int g = 0; g < group_count; g++)
                            {
                                ILayer        layer_temp    = grouplayer_1.get_Layer(g);
                                IFeatureLayer pFeaturelayer = layer_temp as IFeatureLayer;
                                IFeatureClass pFeatureClass = pFeaturelayer.FeatureClass;
                                #region 将所有的要素类加入到拓扑中
                                if (pFeatureClass.Search(null, false).NextFeature() == null || pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)
                                {
                                    continue;
                                }
                                SetCheckState.pT.AddClass(pFeatureClass, 5, 1, 1, false);//将要验证的要线素类放入拓扑中。
                                #endregion
                            }
                            break;
                        }
                        #endregion
                    }
                }
            }
            #endregion
        }
Exemplo n.º 5
0
        /// <summary>
        /// 从要素数据集中获得指定的拓扑
        /// </summary>
        /// <param name="topoFeatureDataset">包含拓扑的要素数据集名称</param>
        /// <param name="topoName">拓扑名称</param>
        /// <returns></returns>
        public static ITopology GetTopologyByName(this IFeatureDataset topoFeatureDataset, string topoName)
        {
            ITopologyContainer topologyContainer = (ITopologyContainer)topoFeatureDataset;

            return(topologyContainer.get_TopologyByName(topoName));
        }
Exemplo n.º 6
0
        /// <summary>
        /// 移除拓扑
        /// </summary>
        /// <param name="pFeaDataet">数据集</param>
        /// <param name="pTopoName">拓扑名</param>
        /// <param name="outError">异常</param>
        public void RemoveTopo(IFeatureDataset pFeaDataet, string topoName, out Exception outError)
        {
            outError = null;
            //topoName = topoName + "_Topology";
            IWorkspace              pWorkspace              = pFeaDataet.Workspace;
            IFeatureWorkspace       pFeatureWorkspace       = pWorkspace as IFeatureWorkspace;
            IFeatureWorkspaceManage pFeatureWorkspaceManage = pFeatureWorkspace as IFeatureWorkspaceManage;

            //if (!((IWorkspaceEdit)pWorkspace).IsBeingEdited())
            //{
            //    //((IWorkspaceEdit)pWorkspace).StartEditing(true);
            //    //((IWorkspaceEdit)pWorkspace).StartEditOperation();
            //}
            //    int iCount = 0;
            //    try
            //    {
            try
            {
                ITopologyContainer pTopoCon = pFeaDataet as ITopologyContainer;
                ITopology          pTopo    = pTopoCon.get_TopologyByName(topoName);

                //ISchemaLock pLock = pTopo as ISchemaLock;
                //pLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);

                ////删除该拓扑下所有的拓扑规则
                //RemoveTopoRule(pTopo, out outError);
                //if (outError != null) return;

                ////删除该拓扑下左右的拓扑图层
                //RemoveTopoClass(pTopo, out outError);
                //if (outError != null) return;

                //删除拓扑
                IDataset     pTopoDt          = pTopo as IDataset;
                IName        pName            = pTopoDt.FullName;
                IDatasetName ptopodatasetname = pName as IDatasetName;
                pFeatureWorkspaceManage.DeleteByName(ptopodatasetname);

                //(pTopo as IDataset).Delete();
                //pTopo.FeatureDataset.Delete();

                //Marshal.ReleaseComObject(pTopo);
                pTopo = null;
                //++iCount;

                //pLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
            }
            catch (Exception ex)
            {
                ////*********************************************
                ////guozheng 2010-12-24 平安夜  added 系统异常日志
                //if (ModData.SysLog == null) ModData.SysLog = new clsWriteSystemFunctionLog();
                //ModData.SysLog.Write(ex);
                ////**********************************************
                outError = ex;
            }
            //}
            //finally
            //{
            //    if (((IWorkspaceEdit)pWorkspace).IsBeingEdited())
            //    {
            //        if (iCount > 0)
            //        {
            //            ((IWorkspaceEdit)pWorkspace).StopEditOperation();
            //            ((IWorkspaceEdit)pWorkspace).StopEditing(true);
            //        }
            //        {
            //            ((IWorkspaceEdit)pWorkspace).AbortEditOperation();
            //            ((IWorkspaceEdit)pWorkspace).StopEditing(true);
            //        }
            //    }
            //}
        }