Пример #1
0
        //规则添加工具
        private void PRV_AddRuleTool(ITopologyRule IN_TopologyRule)
        {
            ITopologyRuleContainer Temp_TopologyRuleContainer = (ITopologyRuleContainer)Topology;//构建容器

            try
            {
                Temp_TopologyRuleContainer.get_CanAddRule(IN_TopologyRule);//不能添加的话直接报错
                try
                {
                    Temp_TopologyRuleContainer.DeleteRule(IN_TopologyRule); //删除已存在的规则后再添加
                    Temp_TopologyRuleContainer.AddRule(IN_TopologyRule);    //规则存在的话直接报错
                }
                catch
                {
                    Temp_TopologyRuleContainer.AddRule(IN_TopologyRule);
                }
            }
            catch
            {
                MessageBox.Show("不支持添加");
            }
            PRV_ValidateTopologyWithGP();  //添加完成后自动检验
            PUB_GetTopoLayer();            //存储创建的拓扑图层
            PRV_GetError(IN_TopologyRule); //输出错误
        }
Пример #2
0
        //获取错误信息
        private void PRV_GetError(ITopologyRule IN_TopologyRule)
        {
            if (Topology != null)
            {
                IEnvelope Temp_Envolope = (this.Topology as IGeoDataset).Extent;
                IErrorFeatureContainer Temp_ErrorContainer = Topology as IErrorFeatureContainer;
                //获取所有信息
                IEnumTopologyErrorFeature Temp_EnumErrorFeature = Temp_ErrorContainer.get_ErrorFeatures(((IGeoDataset)FeatureDataset_Main).SpatialReference, IN_TopologyRule, Temp_Envolope, true, true);
                ITopologyErrorFeature     Temp_ErrorFeature     = Temp_EnumErrorFeature.Next();
                while (Temp_ErrorFeature != null)
                {
                    IFeature Temp_Feature = Temp_ErrorFeature as IFeature;
                    string   Temp_ErrorInfo;
                    if (Temp_ErrorFeature.DestinationClassID != 0)//检测是否是双要素规则
                    {
                        Temp_ErrorInfo = Temp_ErrorFeature.OriginOID + "," + Temp_ErrorFeature.DestinationOID;
                    }
                    else
                    {
                        Temp_ErrorInfo = Temp_ErrorFeature.OriginOID.ToString();
                    }
                    LI_AllErrorInfo.Add((PRV_RecorverTopologyRuleType((int)(Temp_ErrorFeature.TopologyRuleType))) + " " + Temp_ErrorInfo);//将错误信息加入List

                    //MessageBox.Show("错误:" + PRV_RecorverTopologyRuleType((int)(Temp_ErrorFeature.TopologyRuleType)) + "\r\n错误ID:" + Temp_ErrorInfo);
                    Temp_ErrorFeature = Temp_EnumErrorFeature.Next();
                }
            }
            else
            {
                MessageBox.Show("请先构建拓扑");
            }
        }
Пример #3
0
        //规则添加工具
        private void PRV_AddRuleTool(ITopologyRule IN_TopologyRule, string idname)
        {
            ITopologyRuleContainer Temp_TopologyRuleContainer = (ITopologyRuleContainer)Topology;//构建容器

            try
            {
                Temp_TopologyRuleContainer.get_CanAddRule(IN_TopologyRule);//不能添加的话直接报错
                try
                {
                    Temp_TopologyRuleContainer.DeleteRule(IN_TopologyRule); //删除已存在的规则后再添加
                    IN_TopologyRule.OriginSubtype = int.Parse(idname);
                    Temp_TopologyRuleContainer.AddRule(IN_TopologyRule);    //规则存在的话直接报错
                }
                catch
                {
                    Temp_TopologyRuleContainer.AddRule(IN_TopologyRule);
                }
            }
            catch
            {
                MessageBox.Show("不支持添加");
            }
            // PRV_ValidateTopologyWithGP();//添加完成后自动检验
            //PUB_GetTopoLayer();//存储创建的拓扑图层

            //PRV_GetError(IN_TopologyRule);//输出错误
        }
Пример #4
0
        /// <summary>
        /// 导出拓扑错误图形, 在指定要素数据集(IFeatureDataset)或工作空间(IWorkspace)新建要素类以保存拓扑错误图形
        /// </summary>
        /// <param name="topologyRule">拓扑规则</param>
        /// <param name="topology">拓扑</param>
        /// <param name="resultObject">指定的要素数据集(IFeatureDataset)或工作空间(IWorkspace),用于创建新要素类,保存拓扑错误图形</param>
        public static IFeatureClass TopoErrorToNewFeatureClass(this ITopologyRule topologyRule, ITopology topology, object resultObject, string resultClassName = null)
        {
            //获得指定拓扑规则类型的拓扑错误要素
            var errorFeatures = GetTopoErrorFeatures(topologyRule, topology);

            if (errorFeatures.Count < 1)
            {
                return(null);
            }

            //创建保存拓扑错误的要素类
            var feature = errorFeatures[0] as IFeature;
            var geoType = feature.Shape.GeometryType;

            if (string.IsNullOrEmpty(resultClassName))
            {
                resultClassName = topologyRule.TopologyRuleType.ToString();
            }

            IFeature tmpFeature         = errorFeatures[0] as IFeature;
            var      resultFeatureClass = FeatureClassEx.Create(resultObject, resultClassName,
                                                                tmpFeature.Shape.SpatialReference, geoType, new FieldsClass());

            //将拓扑错误要素存入要素类中
            TopoErrorInsertToFeatureClass(errorFeatures, resultFeatureClass);
            return(resultFeatureClass);
        }
Пример #5
0
 private void btnClearRule_Click(object sender, EventArgs e)
 {
     for (int i = 0; i < this.listRule.SelectedItems.Count; i++)
     {
         ITopologyRule tag = (ITopologyRule)this.listRule.SelectedItems[i].Tag;
         this.listRule.Items.Remove(this.listRule.SelectedItems[i]);
     }
     this.listRule.SelectedItems.Clear();
 }
Пример #6
0
        /// <summary>
        /// 获取指定类型的拓扑错误要素枚举
        /// </summary>
        /// <param name="topologyRule">拓扑规则</param>
        /// <param name="topology">拓扑</param>
        /// <returns></returns>
        public static IEnumTopologyErrorFeature GetEnumTopoErrorFeature(this ITopologyRule topologyRule, ITopology topology)
        {
            IEnvelope envelope = (topology as IGeoDataset).Extent;
            IErrorFeatureContainer errorContainer = topology as IErrorFeatureContainer;

            IEnumTopologyErrorFeature enumErrorFeature = errorContainer.get_ErrorFeatures(
                ((IGeoDataset)topology.FeatureDataset).SpatialReference, topologyRule, envelope, true, true);

            return(enumErrorFeature);
        }
Пример #7
0
        private void btnAddRule_Click(object sender, EventArgs e)
        {
            frmRule rule = new frmRule
            {
                OriginClassArray = TopologyEditHelper.m_pList
            };

            if (rule.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if (!rule.bVaildRule)
                    {
                        MessageBox.Show("无效规则!");
                    }
                    else
                    {
                        ITopologyRule topologyRule = rule.TopologyRule;
                        if (!this.method_2(topologyRule))
                        {
                            string[] items = new string[3];
                            items[0] =
                                (this.itopology_0 as IFeatureClassContainer).get_ClassByID(topologyRule.OriginClassID)
                                .AliasName;
                            items[1] = this.method_0(topologyRule.TopologyRuleType);
                            if ((topologyRule.OriginClassID != topologyRule.DestinationClassID) &&
                                (topologyRule.DestinationClassID > 0))
                            {
                                items[2] =
                                    (this.itopology_0 as IFeatureClassContainer).get_ClassByID(
                                        topologyRule.DestinationClassID).AliasName;
                            }
                            ListViewItem item = new ListViewItem(items)
                            {
                                Tag = new Class2(topologyRule, true)
                            };
                            this.listView1.Items.Add(item);
                            this.bool_0 = true;
                            if (this.OnValueChange != null)
                            {
                                this.OnValueChange();
                            }
                        }
                        else
                        {
                            MessageBox.Show("该规则已应用到该要素类!");
                        }
                    }
                }
                catch (Exception exception)
                {
                    Logger.Current.Error("", exception, "");
                }
            }
        }
Пример #8
0
        private void btnAddRule1_Click(object sender, EventArgs e)
        {
            frmAddRuleByClass class2 = new frmAddRuleByClass
            {
                OriginClassArray = this.iarray_1
            };

            if (class2.ShowDialog() == DialogResult.OK)
            {
                ITopologyRule[] topologyRules = class2.TopologyRules;
                if (topologyRules != null)
                {
                    for (int i = 0; i < topologyRules.Length; i++)
                    {
                        IFeatureClass class3;
                        ITopologyRule rule = topologyRules[i];
                        if (this.method_2(rule))
                        {
                            continue;
                        }
                        int index = 0;
                        while (index < this.iarray_0.Count)
                        {
                            class3 = (IFeatureClass)this.iarray_0.get_Element(index);
                            if (class3.ObjectClassID == rule.OriginClassID)
                            {
                                goto Label_0093;
                            }
                            index++;
                        }
                        goto Label_0106;
Label_0093:
                        this.listRule.Items.Add(class3.AliasName);
                        this.listRule.Items[this.listRule.Items.Count - 1].SubItems.Add(rule.Name);
                        this.listRule.Items[this.listRule.Items.Count - 1].Tag = rule;
Label_0106:
                        if (rule.OriginClassID != rule.DestinationClassID)
                        {
                            for (index = 0; index < this.iarray_0.Count; index++)
                            {
                                class3 = (IFeatureClass)this.iarray_0.get_Element(index);
                                if (class3.ObjectClassID == rule.DestinationClassID)
                                {
                                    goto Label_015C;
                                }
                            }
                        }
                        continue;
Label_015C:
                        this.listRule.Items[this.listRule.Items.Count - 1].SubItems.Add(class3.AliasName);
                    }
                }
            }
        }
Пример #9
0
        /// <summary>
        /// 获取指定类型的拓扑错误要素
        /// </summary>
        /// <param name="topologyRule">拓扑规则</param>
        /// <param name="topology">拓扑</param>
        /// <returns></returns>
        public static List <ITopologyErrorFeature> GetTopoErrorFeatures(this ITopologyRule topologyRule, ITopology topology)
        {
            List <ITopologyErrorFeature> result = new List <ITopologyErrorFeature>();

            ITopologyErrorFeature errorFeature;
            var enumErrorFeature = GetEnumTopoErrorFeature(topologyRule, topology);

            while ((errorFeature = enumErrorFeature.Next()) != null)
            {
                result.Add(errorFeature);
            }
            return(result);
        }
Пример #10
0
 private bool method_2(ITopologyRule itopologyRule_0)
 {
     for (int i = 0; i < this.listRule.Items.Count; i++)
     {
         ITopologyRule tag = (ITopologyRule)this.listRule.Items[i].Tag;
         if (((tag.Name == itopologyRule_0.Name) && (tag.OriginClassID == itopologyRule_0.OriginClassID)) &&
             (tag.DestinationClassID == itopologyRule_0.DestinationClassID))
         {
             return(true);
         }
     }
     return(false);
 }
Пример #11
0
 private bool method_1(ITopologyRule itopologyRule_0, IArray iarray_3)
 {
     for (int i = 0; i < iarray_3.Count; i++)
     {
         ITopologyRule rule = (ITopologyRule)iarray_3.get_Element(i);
         if (((rule.Name == itopologyRule_0.Name) && (rule.OriginClassID == itopologyRule_0.OriginClassID)) &&
             (rule.DestinationClassID == itopologyRule_0.DestinationClassID))
         {
             return(true);
         }
     }
     return(false);
 }
Пример #12
0
        private void btnAddRule_Click(object sender, EventArgs e)
        {
            frmRule rule = new frmRule
            {
                OriginClassArray = this.iarray_1
            };

            if (rule.ShowDialog() == DialogResult.OK)
            {
                if (!rule.bVaildRule)
                {
                    MessageBox.Show("无效规则!");
                }
                else
                {
                    ITopologyRule topologyRule = rule.TopologyRule;
                    if (this.method_2(topologyRule))
                    {
                        MessageBox.Show("该规则已应用到该要素类!");
                    }
                    else
                    {
                        int           num;
                        IFeatureClass class2;
                        for (num = 0; num < this.iarray_0.Count; num++)
                        {
                            class2 = (IFeatureClass)this.iarray_0.get_Element(num);
                            if (class2.ObjectClassID == topologyRule.OriginClassID)
                            {
                                this.listRule.Items.Add(class2.AliasName);
                                this.listRule.Items[this.listRule.Items.Count - 1].SubItems.Add(topologyRule.Name);
                                this.listRule.Items[this.listRule.Items.Count - 1].Tag = topologyRule;
                                break;
                            }
                        }
                        if (topologyRule.OriginClassID != topologyRule.DestinationClassID)
                        {
                            for (num = 0; num < this.iarray_0.Count; num++)
                            {
                                class2 = (IFeatureClass)this.iarray_0.get_Element(num);
                                if (class2.ObjectClassID == topologyRule.DestinationClassID)
                                {
                                    this.listRule.Items[this.listRule.Items.Count - 1].SubItems.Add(class2.AliasName);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #13
0
 private bool method_2(ITopologyRule itopologyRule_0)
 {
     for (int i = 0; i < this.listView1.Items.Count; i++)
     {
         ITopologyRule topoRule = (this.listView1.Items[i].Tag as Class2).TopoRule;
         if (((topoRule.Name == itopologyRule_0.Name) &&
              (topoRule.OriginClassID == itopologyRule_0.OriginClassID)) &&
             (topoRule.DestinationClassID == itopologyRule_0.DestinationClassID))
         {
             return(true);
         }
     }
     return(false);
 }
Пример #14
0
        private void btnAddRule1_Click(object sender, EventArgs e)
        {
            frmAddRuleByClass class2 = new frmAddRuleByClass
            {
                OriginClassArray = TopologyEditHelper.m_pList
            };

            if (class2.ShowDialog() == DialogResult.OK)
            {
                ITopologyRule[] topologyRules = class2.TopologyRules;
                if (topologyRules != null)
                {
                    for (int i = 0; i < topologyRules.Length; i++)
                    {
                        ITopologyRule rule = topologyRules[i];
                        if (!this.method_2(rule))
                        {
                            string[] items = new string[3];
                            items[0] =
                                (this.itopology_0 as IFeatureClassContainer).get_ClassByID(rule.OriginClassID).AliasName;
                            items[1] = this.method_0(rule.TopologyRuleType);
                            if ((rule.OriginClassID != rule.DestinationClassID) && (rule.DestinationClassID > 0))
                            {
                                items[2] =
                                    (this.itopology_0 as IFeatureClassContainer).get_ClassByID(rule.DestinationClassID)
                                    .AliasName;
                            }
                            ListViewItem item = new ListViewItem(items)
                            {
                                Tag = new Class2(rule, true)
                            };
                            this.listView1.Items.Add(item);
                            this.bool_0 = true;
                            if (this.OnValueChange != null)
                            {
                                this.OnValueChange();
                            }
                        }
                    }
                }
            }
        }
Пример #15
0
        /// <summary>
        /// 添加拓扑规则
        /// </summary>
        /// <param name="topology"></param>
        /// <param name="topologyRule"></param>
        public static void AddRuleToTopology(this ITopology topology, ITopologyRule topologyRule)
        {
            ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology;//构建容器

            try
            {
                topologyRuleContainer.get_CanAddRule(topologyRule);//不能添加的话直接报错
                try
                {
                    topologyRuleContainer.DeleteRule(topologyRule); //删除已存在的规则后再添加
                    topologyRuleContainer.AddRule(topologyRule);    //规则存在的话直接报错
                }
                catch
                {
                    topologyRuleContainer.AddRule(topologyRule);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("不支持添加拓扑规则:" + ex.Message);
            }
        }
Пример #16
0
        private IList method_4(ITopology itopology_0)
        {
            IList list = new ArrayList();
            ITopologyRuleContainer container = itopology_0 as ITopologyRuleContainer;
            IEnumRule rules = container.Rules;

            rules.Reset();
            for (ITopologyRule rule2 = rules.Next() as ITopologyRule;
                 rule2 != null;
                 rule2 = rules.Next() as ITopologyRule)
            {
                bool flag;
                bool flag2;
                bool flag3;
                rule2.ErrorShapeTypes(out flag, out flag2, out flag3);
                if (flag3)
                {
                    list.Add(rule2);
                }
            }
            return(list);
        }
Пример #17
0
 public TopologyRuleWrap(ITopologyRule itopologyRule_1, bool bool_1)
 {
     this.itopologyRule_0 = itopologyRule_1;
     this.bool_0          = bool_1;
 }
Пример #18
0
 public Class2(ITopologyRule itopologyRule_1, bool bool_1)
 {
     this.itopologyRule_0 = itopologyRule_1;
     this.bool_0          = bool_1;
 }
Пример #19
0
        /// <summary>
        /// 面重叠检查错误列表  同层面检查  chenyafei  添加20101208
        /// </summary>
        /// <param name="pFeaDatset">数据集</param>
        /// <param name="pTopo">拓扑</param>
        /// <param name="pTopoRuleType">拓扑规则</param>
        /// <param name="pOrgFeaClsNameDic">源图层名</param>
        /// <param name="pEnvelop">拓扑验证范围</param>
        /// <param name="pDataGrid">检查结果列表显示</param>
        /// <param name="outError"></param>
        public void GetAreaNoOverlopErrorList(IFeatureDataset pFeaDatset, ITopology pTopo, IEnvelope pEnvelop, DataGridViewX pDataGrid, out Exception outError)
        {
            outError = null;
            try
            {
                IFeatureClass oriFeaCls = null;     //源要素类
                IFeatureClass desFeaCls = null;     //目标要素类

                //依照拓扑规则获取错误要素
                IErrorFeatureContainer pErrorFeaCon = pTopo as IErrorFeatureContainer;
                ITopologyRuleContainer pTopoRuleCon = pTopo as ITopologyRuleContainer;
                IEnumRule pEnumRule = pTopoRuleCon.Rules;
                pEnumRule.Reset();
                ITopologyRule pTopoRule = pEnumRule.Next() as ITopologyRule;
                //遍历拓扑规则
                while (pTopoRule != null)
                {
                    //if (pTopoRule.TopologyRuleType != pTopoRuleType)
                    //{
                    //    pTopoRule = pEnumRule.Next() as ITopologyRule;
                    //    continue;
                    //}
                    IEnumTopologyErrorFeature pEnumErrorFea = null;
                    try
                    {
                        pEnumErrorFea = pErrorFeaCon.get_ErrorFeatures(
                            (pFeaDatset as IGeoDataset).SpatialReference, pTopoRule, pEnvelop, true, false);
                    }
                    catch (Exception ex)
                    {
                        ////*********************************************
                        ////guozheng 2010-12-24 平安夜  added 系统异常日志
                        //if (ModData.SysLog == null) ModData.SysLog = new clsWriteSystemFunctionLog();
                        //ModData.SysLog.Write(ex);
                        ////**********************************************
                        RemoveTopo(pFeaDatset, pFeaDatset.Name, out outError);
                        outError = ex;
                        return;
                    }
                    if (pEnumErrorFea == null)
                    {
                        pTopoRule = pEnumRule.Next() as ITopologyRule;
                        continue;
                    }

                    //进度条初始值
                    //ModData.m_ProgressBarDetail.Minimum = 0;
                    //ModData.m_ProgressBarDetail.Value = 0;
                    //ModData.m_ProgressBarDetail.Maximum = ModOperator.GetErrCount(pEnumErrorFea);
                    int pValue = 0;
                    //Application.DoEvents();

                    pEnumErrorFea = pErrorFeaCon.get_ErrorFeatures(
                        (pFeaDatset as IGeoDataset).SpatialReference, pTopoRule, pEnvelop, true, false);

                    ITopologyErrorFeature pErrorFea = pEnumErrorFea.Next();
                    //遍历错误要素,进行错误输出
                    while (pErrorFea != null)
                    {
                        double   pMapx        = 0;                            //错误定位点x
                        double   pMapy        = 0;                            //错误定位点y
                        string   errFeaGeoStr = "";                           //错误几何信息
                        string   errCoorStr   = "";
                        string   pFeaClsName  = "";                           //要素类名称
                        int      desID        = pErrorFea.DestinationOID;     //目标要素ID
                        int      oriID        = pErrorFea.OriginOID;          //源要素类ID
                        IFeature oriFeature   = null;                         //源要素
                        IFeature desFeature   = null;                         //目标要素
                        int      oriFeaClsID  = pErrorFea.OriginClassID;      //源要素类ID
                        int      desFeaClsID  = pErrorFea.DestinationClassID; //目标要素类ID
                        string   errDes       = "";                           //错误描述

                        try
                        {
                            //若要素类为空,则说明是对数据集中的所有的同层面进行重叠检查
                            oriFeaCls = (pTopo as IFeatureClassContainer).get_ClassByID(oriFeaClsID);
                            desFeaCls = oriFeaCls;
                        }
                        catch
                        { }

                        if (oriFeaCls != null && oriID > 0)
                        {
                            oriFeature = oriFeaCls.GetFeature(oriID);
                        }
                        else
                        {
                            //源要素OID
                            oriID = -1;
                        }
                        if (desFeaCls != null && desID > 0)
                        {
                            desFeature = desFeaCls.GetFeature(desID);
                        }
                        else
                        {
                            //目标要素OID
                            desID = -1;
                        }
                        double pMinArea = 0;       //面积最小值
                        double pMaxArea = 0;       //重叠面积最大值
                        pFeaClsName = (oriFeaCls as IDataset).Name;
                        if (pFeaClsName.Contains("."))
                        {
                            pFeaClsName = pFeaClsName.Substring(pFeaClsName.IndexOf('.') + 1);
                        }


                        //获得错误几何信息
                        GetZoomErrFea(pErrorFea as IFeature, out pMapx, out pMapy, out errFeaGeoStr, out errCoorStr);

                        //目标数据库对应到元数据库中的OID
                        int dicDesOID = -1;
                        if (desFeature != null)
                        {
                            int index = desFeature.Fields.FindField(desFeaCls.OIDFieldName);
                            if (index != -1)
                            {
                                if (desFeature.get_Value(index).ToString().Trim() != "")
                                {
                                    dicDesOID = Convert.ToInt32(desFeature.get_Value(index).ToString().Trim());
                                }
                            }
                        }
                        string errType = "";
                        if (pTopoRule.TopologyRuleType == esriTopologyRuleType.esriTRTAreaNoOverlap)
                        {
                            errDes  = "OID为" + oriID + "的小班与OID为" + dicDesOID + "的小班之间有重叠";
                            errType = "面重叠检查";
                        }
                        else if (pTopoRule.TopologyRuleType == esriTopologyRuleType.esriTRTAreaNoGaps)
                        {
                            errDes  = "小班之间有缝隙";
                            errType = "面缝隙检查";
                        }

                        //处理错误结果
                        ProcErrorList(errType, pFeaDatset, pFeaClsName, oriID, pFeaClsName, dicDesOID, pMapx, pMapy, errFeaGeoStr, pDataGrid, errDes, errCoorStr);
                        //ProcErrorList(pFeaDatset, pFeaClsName, oriFeature, pFeaClsName, desID, pDataGrid, EnumCheckType.面重叠检查, pErrType, errDes);

                        //错误数加1
                        //ModData.m_ErrCount++;
                        //m_ErrCount++;
                        //m_LabelRes.Text = "同层面重叠检查错误:" + m_ErrCount + "个";

                        //进度条
                        pValue++;
                        //ModData.m_ProgressBarDetail.Value = pValue;
                        //Application.DoEvents();   //实时处理windows消息

                        pErrorFea = pEnumErrorFea.Next();
                    }

                    pTopoRule = pEnumRule.Next() as ITopologyRule;
                }
            }
            catch (Exception ex)
            {
                ////*********************************************
                ////guozheng 2010-12-24 平安夜  added 系统异常日志
                //if (ModData.SysLog == null) ModData.SysLog = new clsWriteSystemFunctionLog();
                //ModData.SysLog.Write(ex);
                ////**********************************************
                outError = ex;
            }
        }
Пример #20
0
        /// <summary>
        /// 面套面处理主函数
        /// </summary>
        /// <param name="_AppHk"></param>
        private void ExcutePolygonOverlapTreat()
        {
            Plugin.Application.IAppFormRef pAppFrm = _AppHk as Plugin.Application.IAppFormRef;

            pAppFrm.MainForm.Invoke(new ShowTips(ShowStatusTips), new object[] { pAppFrm, "正在获取所有面层..." });
            //获取所有面层
            List <ILayer> listLayers = GetCheckLayers(_AppHk.MapControl.Map, "更新修编数据");

            if (listLayers == null)
            {
                return;
            }
            List <ILayer> listCheckLays = new List <ILayer>();

            //遍历更新库体里的所有层
            foreach (ILayer pTempLay in listLayers)
            {
                IFeatureLayer pFeatLay = pTempLay as IFeatureLayer;
                if (pFeatLay == null)
                {
                    continue;
                }
                if (pFeatLay.FeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)
                {
                    continue;
                }
                //接边针对的是线和面,所以我们操作时只需对线和面层进行即可
                if (pFeatLay.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolygon)
                {
                    continue;
                }

                listCheckLays.Add(pTempLay);
            }
            if (listCheckLays.Count == 0)
            {
                return;
            }

            //遍历各个面层并与其它面层建立拓扑规则以获取所有存在重叠的最小面
            pAppFrm.MainForm.Invoke(new ShowTips(ShowStatusTips), new object[] { pAppFrm, "正在建立拓扑规则..." });
            Dictionary <ITopologyRule, IFeatureClass> dicTemp = new Dictionary <ITopologyRule, IFeatureClass>();
            ITopologyRuleContainer pTopologyRuleContainer     = SetCheckState.pT as ITopologyRuleContainer;//使用建立好的拓扑

            //遍历我们得出的所有面层并操作
            foreach (ILayer pLay in listCheckLays)
            {
                IFeatureLayer pFeatLay = pLay as IFeatureLayer;
                if (pFeatLay == null)
                {
                    continue;
                }
                ITopologyRule topologyRule = new TopologyRuleClass();                       //实例一个拓扑规则类
                topologyRule.TopologyRuleType  = esriTopologyRuleType.esriTRTAreaNoOverlap; //使用规则的类型(面不相交)
                topologyRule.OriginClassID     = pFeatLay.FeatureClass.FeatureClassID;
                topologyRule.AllOriginSubtypes = true;
                topologyRule.Name = pFeatLay.FeatureClass.AliasName;
                if (pTopologyRuleContainer.get_CanAddRule(topologyRule) == true)//提示拓扑规则是否可以被添加
                {
                    pTopologyRuleContainer.AddRule(topologyRule);
                    dicTemp.Add(topologyRule, pFeatLay.FeatureClass);
                }

                foreach (ILayer pOtherLay in listCheckLays)
                {
                    if (pOtherLay == pLay)
                    {
                        continue;
                    }
                    IFeatureLayer pOtherFeatLay = pOtherLay as IFeatureLayer;
                    if (pOtherFeatLay == null)
                    {
                        continue;
                    }
                    topologyRule = new TopologyRuleClass();
                    topologyRule.TopologyRuleType       = esriTopologyRuleType.esriTRTAreaNoOverlapArea;
                    topologyRule.OriginClassID          = pFeatLay.FeatureClass.FeatureClassID;
                    topologyRule.AllOriginSubtypes      = true;
                    topologyRule.DestinationClassID     = pOtherFeatLay.FeatureClass.FeatureClassID;
                    topologyRule.AllDestinationSubtypes = true;
                    topologyRule.Name = pFeatLay.FeatureClass.AliasName + " AreaNoOverlapArea with " + pOtherFeatLay.FeatureClass.AliasName;
                    if (pTopologyRuleContainer.get_CanAddRule(topologyRule) == true)
                    {
                        pTopologyRuleContainer.AddRule(topologyRule);
                        dicTemp.Add(topologyRule, pFeatLay.FeatureClass);
                    }
                }
            }

            pAppFrm.MainForm.Invoke(new ShowTips(ShowStatusTips), new object[] { pAppFrm, "正在验证拓扑..." });
            ISegmentCollection pLocation = new PolygonClass();                            //使用多边形接口

            pLocation.SetRectangle(SetCheckState.Geodatabase.Extent);                     //将我们用来操作验证的要素类利用SETRECTANGLE来构造一个完整的几何形体
            IPolygon  pPoly          = SetCheckState.pT.get_DirtyArea(pLocation as IPolygon);
            IEnvelope pAreaValidated = SetCheckState.pT.ValidateTopology(pPoly.Envelope); //验证拓扑

            pAppFrm.MainForm.Invoke(new ShowTips(ShowStatusTips), new object[] { pAppFrm, "正在分析获取要处理的要素..." });
            pAppFrm.MainForm.Invoke(new ShowProgress(ShowProgressBar), new object[] { pAppFrm, true });
            pAppFrm.MainForm.Invoke(new ChangeProgress(ChangeProgressBar), new object[] { pAppFrm.ProgressBar, 0, dicTemp.Count, 0 });
            //获取所有存在重叠的最小面
            Dictionary <IFeature, IFeatureClass> dicCheckFeats = new Dictionary <IFeature, IFeatureClass>();
            IErrorFeatureContainer pErrFeatCon = SetCheckState.pT as IErrorFeatureContainer;
            IEnumRule pEnumRule = pTopologyRuleContainer.Rules;

            pEnumRule.Reset();
            ITopologyRule pTempTopologyRule = pEnumRule.Next() as ITopologyRule;
            int           intcnt            = 0;

            while (pTempTopologyRule != null)
            {
                intcnt++;
                pAppFrm.MainForm.Invoke(new ChangeProgress(ChangeProgressBar), new object[] { pAppFrm.ProgressBar, -1, -1, intcnt });
                if (!(pTempTopologyRule.TopologyRuleType == esriTopologyRuleType.esriTRTAreaNoOverlap || pTempTopologyRule.TopologyRuleType == esriTopologyRuleType.esriTRTAreaNoOverlapArea))
                {
                    continue;
                }
                IEnumTopologyErrorFeature pEnumTopoErrFeat = pErrFeatCon.get_ErrorFeatures(SetCheckState.Geodatabase.SpatialReference, pTempTopologyRule, SetCheckState.Geodatabase.Extent, true, false);
                ITopologyErrorFeature     pTopoErrFeat     = pEnumTopoErrFeat.Next();

                IFeatureClass pOrgFeatCls = null;
                if (dicTemp.ContainsKey(pTempTopologyRule))
                {
                    pOrgFeatCls = dicTemp[pTempTopologyRule];
                }
                if (pOrgFeatCls == null)
                {
                    break;
                }
                IDataset pDatasetTemp = pOrgFeatCls as IDataset;
                while (pTopoErrFeat != null)
                {
                    IFeature orgFeat  = pOrgFeatCls.GetFeature(pTopoErrFeat.OriginOID);
                    bool     bHasFeat = false;
                    foreach (ILayer pLay in listCheckLays)
                    {
                        IFeatureLayer pFeatLay = pLay as IFeatureLayer;
                        if (pFeatLay == null)
                        {
                            continue;
                        }
                        IDataset pDataset = pFeatLay.FeatureClass as IDataset;
                        string   strCon   = "";
                        //排除指定要素
                        if (pDataset.Name == pDatasetTemp.Name)
                        {
                            strCon = "OBJECTID<>" + orgFeat.OID.ToString();
                        }

                        //判断面orgFeat内是否包含有面
                        if (HasFeatureWithInGeometry(pFeatLay.FeatureClass, orgFeat.Shape, strCon) == true)
                        {
                            bHasFeat = true;
                            break;
                        }
                    }

                    if (bHasFeat == false)
                    {
                        dicCheckFeats.Add(orgFeat, pOrgFeatCls);
                    }
                    pTopoErrFeat = pEnumTopoErrFeat.Next();
                }

                pTempTopologyRule = pEnumRule.Next() as ITopologyRule;
            }

            pAppFrm.MainForm.Invoke(new ShowTips(ShowStatusTips), new object[] { pAppFrm, "处理数据中..." });
            pAppFrm.MainForm.Invoke(new ChangeProgress(ChangeProgressBar), new object[] { pAppFrm.ProgressBar, 0, dicCheckFeats.Count, 0 });

            Exception err = null;
            //开启编辑  wjj 20090921
            IDataset       pFeatDataset   = SetCheckState.Geodatabase as IDataset;
            IWorkspaceEdit pWorkspaceEdit = pFeatDataset.Workspace as IWorkspaceEdit;

            if (pWorkspaceEdit.IsBeingEdited() == false)
            {
                pWorkspaceEdit.StartEditing(false);
            }

            //遍历上步所获得到的重叠最小面,分析获取包含该面的所有面并根据面积排序
            intcnt = 0;
            foreach (KeyValuePair <IFeature, IFeatureClass> keyvlue in dicCheckFeats)
            {
                intcnt++;
                pAppFrm.MainForm.Invoke(new ChangeProgress(ChangeProgressBar), new object[] { pAppFrm.ProgressBar, -1, -1, intcnt });
                IFeature pFeat = keyvlue.Key;
                Dictionary <IFeature, IFeatureClass> dicFeats = GetFeaturesByGeometry(pFeat, listCheckLays);
                bool bDel = false;
                if (dicFeats.Count > 0)
                {
                    //从外到内做处理,处理原则分类代码相同则利用小面套空大面并删除小面,不同则小面套空大面
                    IFeature[] pFeatArray = new IFeature[dicFeats.Count];
                    dicFeats.Keys.CopyTo(pFeatArray, 0);
                    for (int i = 0; i < dicFeats.Count - 1; i++)
                    {
                        if (bDel == false)
                        {
                            IFeature pBigFeat = pFeatArray[i];
                            IFeature pLowFeat = pFeatArray[i + 1];

                            //小面掏空大面
                            UpdateFeatureByOverlapArea(dicFeats[pBigFeat], "OBJECTID=" + pBigFeat.OID.ToString(), pLowFeat.Shape, out err);
                            if (pBigFeat.get_Value(pBigFeat.Fields.FindField("CODE")).ToString() == pLowFeat.get_Value(pLowFeat.Fields.FindField("CODE")).ToString())
                            {
                                SysCommon.Gis.ModGisPub.DelFeature(dicFeats[pLowFeat], "OBJECTID=" + pLowFeat.OID.ToString(), out err);
                                bDel = true;
                            }
                            else
                            {
                                bDel = false;
                            }
                        }
                        else
                        {
                            bDel = false;
                        }
                    }


                    IFeature pLastFeat = pFeatArray[dicFeats.Count - 1];
                    //小面掏空大面
                    UpdateFeatureByOverlapArea(dicFeats[pLastFeat], "OBJECTID=" + pLastFeat.OID.ToString(), pFeat.Shape, out err);
                    if (pLastFeat.get_Value(pLastFeat.Fields.FindField("CODE")).ToString() == pFeat.get_Value(pFeat.Fields.FindField("CODE")).ToString())
                    {
                        SysCommon.Gis.ModGisPub.DelFeature(dicCheckFeats[pFeat], "OBJECTID=" + pFeat.OID.ToString(), out err);
                        bDel = true;
                    }
                    else
                    {
                        bDel = false;
                    }
                }
            }

            pEnumRule.Reset();
            pTempTopologyRule = pEnumRule.Next() as ITopologyRule;
            while (pTempTopologyRule != null)
            {
                pTopologyRuleContainer.DeleteRule(pTempTopologyRule);
                pTempTopologyRule = pEnumRule.Next() as ITopologyRule;
            }

            //结束编辑 wjj 20090921
            if (pWorkspaceEdit.IsBeingEdited() == true)
            {
                pWorkspaceEdit.StopEditing(true);
            }

            _AppHk.CurrentThread = null;
            pAppFrm.MainForm.Invoke(new ShowTips(ShowStatusTips), new object[] { pAppFrm, "" });
            pAppFrm.MainForm.Invoke(new ShowProgress(ShowProgressBar), new object[] { pAppFrm, false });
            pAppFrm.MainForm.Invoke(new ShowForm(ShowErrForm), new object[] { "提示", "处理完毕!" });
        }
Пример #21
0
        public override bool Pretreat()
        {
            try
            {
                //SendMessage(enumMessageType.RuleError, "����׼������");

                IFeatureWorkspace fws = m_TopoWorkspace as IFeatureWorkspace;
                IWorkspace2 ws2 = m_TopoWorkspace as IWorkspace2;

                IFeatureClassContainer fClassContainer = this.m_Topology as IFeatureClassContainer;
                IEnumFeatureClass enFeatureClass = fClassContainer.Classes;
                IFeatureClass fClass = enFeatureClass.Next();
                IFeatureClass fClassRefer = null;
                bool isAdded = false;
                while (fClass != null)
                {
                    IDataset ds = fClass as IDataset;
                    if (ds.Name == m_LayerName)
                    {
                        isAdded = true;
                        break;
                    }
                    fClass = enFeatureClass.Next();
                }
                if (!isAdded)
                {
                    if (!ws2.get_NameExists(esriDatasetType.esriDTFeatureClass, m_LayerName))
                    {
                        SendMessage(enumMessageType.RuleError, string.Format("ͼ��{0}�������˿�ʧ�ܣ��޷����", this.m_psRuleParas.arraySeledLayers[0]));
                        return false;
                    }
                    fClass = fws.OpenFeatureClass(m_LayerName);
                    this.m_Topology.AddClass(fClass as IClass, 1, m_psRuleParas.arrayRanks[0], 1, false);
                }

                if (this.m_psRuleParas.arraySeledLayers.Count > 1)
                {

                    enFeatureClass.Reset();
                    fClassRefer = enFeatureClass.Next();
                    isAdded = false;
                    while (fClass != null)
                    {
                        IDataset ds = fClassRefer as IDataset;
                        if (ds.Name == m_ReferLayerName)
                        {
                            isAdded = true;
                            break;
                        }
                        fClassRefer = enFeatureClass.Next();
                    }
                    if (!isAdded)
                    {
                        if (!ws2.get_NameExists(esriDatasetType.esriDTFeatureClass, m_ReferLayerName))
                        {
                            SendMessage(enumMessageType.RuleError, string.Format("ͼ��{0}�����ڣ��޷����", this.m_psRuleParas.arraySeledLayers[1]));
                            return false;
                        }
                        fClassRefer = fws.OpenFeatureClass(m_ReferLayerName);
                        this.m_Topology.AddClass(fClass as IClass, 1, m_psRuleParas.arrayRanks[1], 1, false);
                    }
                }

                m_TopologylRule = new TopologyRuleClass();
                m_TopologylRule.Name = m_psRuleParas.arrayRules[0].strRuleAliasName;
                m_TopologylRule.OriginClassID = fClass.ObjectClassID;
                if (fClassRefer != null)
                    m_TopologylRule.DestinationClassID = fClassRefer.ObjectClassID;

                m_TopologylRule.AllOriginSubtypes = true;
                m_TopologylRule.AllDestinationSubtypes = true;
                m_TopologylRule.TopologyRuleType = GetTopologyTypeByName(m_psRuleParas.arrayRules[0].strTopoRuleName);

                (this.m_Topology as ITopologyRuleContainer).AddRule(m_TopologylRule);

                return true;

            }
            catch (Exception exp)
            {
                SendMessage(enumMessageType.PretreatmentError, "���뵽����ʱ�������Ϣ��"+exp.Message);
                SendMessage(enumMessageType.Exception, exp.ToString());
                return false;
            }
        }