ArcGIS Engine - 重复性检查

在这里插入图片描述

		private static MainForm mainForm = MainForm.GetInstance();
        private List<ILayer> ListLayer;

        public CheckRepeatability(List<ILayer> listLayer)
        {
            InitializeComponent();
            ListLayer = listLayer;
        }

        /// <summary>
        /// 重复性检查
        /// </summary>
        /// <param name="listLayer"></param>
        public void checkRepeatability()
        {
            if (ListLayer.Count == 0)
            {
                MessageBox.Show("图层为空!","提示");
                return;
            } 

            //对每一个图层进行重复性检查
            for (int i = 0; i < ListLayer.Count; i++)
            {
                //等待处理
                mainForm.ShowWaitInfo("正在进行," + ListLayer[i].Name, "重复性检查...");

                //重复性检查
                List<IFeature> IdenticalFeature = Find_Identical(ListLayer[i] as IFeatureLayer);

                //传入列表重复信息
                if (IdenticalFeature.Count != 0)
                {
                    //添加要素信息
                    AddFeatureInfo(ListLayer[i], IdenticalFeature);
                }

                //关闭等待窗口
                mainForm.CloseWaitInfo();
            }

            //窗体显示
            if (FeatureGridView.RowCount != 0)
            {
                this.Show();
            }
            else
            {
                MessageBox.Show("未找到重复要素!","提示");
            }
            
        }

        /// <summary>
        /// 查找相同要素
        /// </summary>
        /// <param name="pFeatureLayer">输入要素图层</param>
        /// <returns>返回重复要素列表</returns>
        private static List<IFeature> Find_Identical(IFeatureLayer pFeatureLayer)
        {
            if (pFeatureLayer == null) return null;

            //重复要素集
            List<IFeature> IdenticalFeature = new List<IFeature>();

            //获取要素类
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            //获取所有要素
            List<IFeature> AllFeature = new List<IFeature>();
            for (int i = 0; i < pFeatureClass.FeatureCount(null); i++)
            {
                AllFeature.Add(pFeatureClass.GetFeature(i));
            }

            //点要素查询重复
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
            {
                //查询重复要素
                for (int i = 0; i < AllFeature.Count; i++)
                {
                    //临时重复要素
                    List<IFeature> temporaryFeature = new List<IFeature>();

                    IFeature pFeatureA = AllFeature[i];
                    IGeometry pGeometryA = pFeatureA.ShapeCopy;
                    IRelationalOperator pIRelationalOperator = pGeometryA as IRelationalOperator;

                    for (int l = i + 1; l < AllFeature.Count; l++)
                    {
                        IFeature pFeatureB = AllFeature[l];
                        IGeometry pGeometryB = pFeatureB.ShapeCopy;

                        //重复性判断
                        if (pIRelationalOperator.Equals(pGeometryB))
                        {
                            temporaryFeature.Add(pFeatureB);
                        }

                    }

                    //移除要素集里重复要素
                    if (temporaryFeature.Count != 0)
                    {
                        for (int k = 0; k < temporaryFeature.Count; k++)
                        {
                            AllFeature.Remove(temporaryFeature[k]);
                            IdenticalFeature.Add(temporaryFeature[k]);
                        }

                    }

                }

            }

            //线要素(通过长度比对)查询重复
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
                //查询重复要素
                for (int i = 0; i < AllFeature.Count; i++)
                {
                    //临时重复要素
                    List<IFeature> temporaryFeature = new List<IFeature>();

                    IFeature pFeatureA = AllFeature[i];
                    IPolyline PolylineA = pFeatureA.Shape as IPolyline;
                    string LengthA = Convert.ToDouble(PolylineA.Length).ToString("0.00");

                    for (int l = i + 1; l < AllFeature.Count; l++)
                    {
                        IFeature pFeatureB = AllFeature[l];
                        IPolyline PolylineB = pFeatureB.Shape as IPolyline;
                        string LengthB = Convert.ToDouble(PolylineB.Length).ToString("0.00");

                        //判断长度是否相等
                        if (LengthA == LengthB)
                        {
                            IGeometry pGeometryA = pFeatureA.ShapeCopy;
                            IGeometry pGeometryB = pFeatureB.ShapeCopy;
                            IRelationalOperator pIRelationalOperator = pGeometryA as IRelationalOperator;

                            //重复性判断
                            if (pIRelationalOperator.Equals(pGeometryB))
                            {
                                temporaryFeature.Add(pFeatureB);
                            }

                        }

                    }

                    //移除要素集里重复要素
                    if (temporaryFeature.Count != 0)
                    {
                        for (int k = 0; k < temporaryFeature.Count; k++)
                        {
                            AllFeature.Remove(temporaryFeature[k]);
                            IdenticalFeature.Add(temporaryFeature[k]);
                        }
                    }


                }

            }

            //面要素(通过面积比对)查询重复
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
            {
                //查询重复要素
                for (int i = 0; i < AllFeature.Count; i++)
                {
                    //临时重复要素
                    List<IFeature> temporaryFeature = new List<IFeature>();

                    IFeature pFeatureA = AllFeature[i];
                    IArea AreaA = pFeatureA.Shape as IArea;
                    string areaA = Convert.ToDouble(AreaA.Area).ToString("0.0000");

                    for (int l = i + 1; l < AllFeature.Count; l++)
                    {
                        IFeature pFeatureB = AllFeature[l];
                        IArea AreaB = pFeatureB.Shape as IArea;
                        string areaB = Convert.ToDouble(AreaB.Area).ToString("0.0000");

                        //判断面积是否相等
                        if (areaA == areaB)
                        {
                            IGeometry pGeometryA = pFeatureA.ShapeCopy;
                            IGeometry pGeometryB = pFeatureB.ShapeCopy;
                            IRelationalOperator pIRelationalOperator = pGeometryA as IRelationalOperator;

                            //重复性判断
                            if (pIRelationalOperator.Equals(pGeometryB))
                            {
                                temporaryFeature.Add(pFeatureB);
                            }

                        }

                    }

                    //移除要素集里重复要素
                    if (temporaryFeature.Count != 0)
                    {
                        for (int k = 0; k < temporaryFeature.Count; k++)
                        {
                            AllFeature.Remove(temporaryFeature[k]);
                            IdenticalFeature.Add(temporaryFeature[k]);
                        }

                    }

                }

            }

            return IdenticalFeature;
        }

        /// <summary>
        /// 添加重复要素信息
        /// </summary>
        /// <param name="layer">图层</param>
        /// <param name="IdenticalFeature">重复要素</param>
        public void AddFeatureInfo(ILayer layer, List<IFeature> IdenticalFeature)
        {
            //添加图层
            checkedLayer.Properties.Items.Add(layer.Name);

            //添加重复要素信息
            for (int l = 0; l < IdenticalFeature.Count; l++)
            {
                //添加行数
                int R = FeatureGridView.Rows.Add(1);

                //要素ID
                FeatureGridView.Rows[R].Cells[0].Value = IdenticalFeature[l].OID;

                //图层名称
                FeatureGridView.Rows[R].Cells[1].Value = layer.Name;

                //几何类型
                if (IdenticalFeature[l].Shape.GeometryType == esriGeometryType.esriGeometryPoint)
                {
                    FeatureGridView.Rows[R].Cells[2].Value = "点";
                }
                if (IdenticalFeature[l].Shape.GeometryType == esriGeometryType.esriGeometryPolyline)
                {
                    FeatureGridView.Rows[R].Cells[2].Value = "线";
                }
                if (IdenticalFeature[l].Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
                {
                    FeatureGridView.Rows[R].Cells[2].Value = "面";
                }
                
            }
        }

        /// <summary>
        /// 双击定位
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FeatureGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //获取选择ID
            int OID = (int)FeatureGridView.SelectedRows[0].Cells[0].Value;

            //获取选择图层
            string layerName = (string)FeatureGridView.SelectedRows[0].Cells[1].Value;

            //通过名字获取图层
            ILayer SelectLayer = null;
            for (int i = 0; i < ListLayer.Count;i++ )
            {
                if (layerName == ListLayer[i].Name)
                {
                    SelectLayer = ListLayer[i];
                }
            }

            //定位
            if (SelectLayer != null)
            {
                IFeatureLayer pFeatureLayer = SelectLayer as IFeatureLayer;
                IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                IFeature pFeature = pFeatureClass.GetFeature(OID);
                IGeometry pGeometry = pFeature.Shape;
                IEnvelope pEnvelope = pGeometry.Envelope;
                if (pGeometry.GeometryType != esriGeometryType.esriGeometryPoint)
                {
                    pEnvelope.Expand(1.5, 1.5, true);
                }
                else
                {
                    pEnvelope.Expand(5, 5, false);
                }

                pEnvelope.Expand(1.5, 1.5, true);

                //缩放到重复要素
                mainForm.MapControl.Extent = pEnvelope;

                //选中要素
                mainForm.MapControl.Map.ClearSelection();
                mainForm.MapControl.Map.SelectFeature(SelectLayer, pFeature);
            }
            
        }

        /// <summary>
        /// 删除要素
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FeatureGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 3)
            {
                if (MessageBox.Show("是否删除该重复要素?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    //获取选择行号
                    int row = e.RowIndex;

                    //获取选择ID
                    int OID = (int)FeatureGridView.SelectedRows[0].Cells[0].Value;

                    //获取选择图层
                    string layerName = (string)FeatureGridView.SelectedRows[0].Cells[1].Value;

                    //通过名字获取图层
                    ILayer SelectLayer = null;
                    for (int i = 0; i < ListLayer.Count; i++)
                    {
                        if (layerName == ListLayer[i].Name)
                        {
                            SelectLayer = ListLayer[i];
                        }
                    }

                    //根据ID获取要素
                    if (SelectLayer != null)
                    {
                        IFeatureLayer pFeatureLayer = SelectLayer as IFeatureLayer;
                        IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                        IFeature pFeature = pFeatureClass.GetFeature(OID);

                        //删除要素
                        pFeature.Delete();

                        //移除控件列表中要素
                        FeatureGridView.Rows.RemoveAt(row);
                    }
                    
                    //刷新地图
                    mainForm.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);

                    //更新控件ID(由于删除要素FID会自动编号)
                    for (int i = 0; i < FeatureGridView.Rows.Count; i++)
                    {
                        if (FeatureGridView.Rows[i].Cells[1].Value.ToString() == layerName)
                        {
                            //获取选择ID
                            int FID = (int)FeatureGridView.Rows[i].Cells[0].Value;

                            if (OID < FID)
                            {
                                FeatureGridView.Rows[i].Cells[0].Value = FID - 1;
                            }

                        }

                    }

                }

            }

        }

        /// <summary>
        /// 删除全部要素
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DeleteAll_Click(object sender, EventArgs e)
        {
            //获取所有要素
            List<IFeature> AllIdenticalFeature = GetAllFeature();

            if (AllIdenticalFeature == null)
            {
                MessageBox.Show("没有找到重复要素!", "提示");
                return;
            }

            if(MessageBox.Show("是否要删除所有重复要素?","提示",MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                this.Visible = false;

                //等待处理
                mainForm.ShowWaitInfo("正在进行,请等待", "删除所有重复要素...");

                //对要素列表按FID进行排序
                AllIdenticalFeature.Sort(
                     delegate(IFeature feature1, IFeature feature2)
                     {
                         //降序排列
                         return feature2.OID.CompareTo(feature1.OID);
                     }
                     );

                //遍历所有要素
                for (int i = 0; i < AllIdenticalFeature.Count; i++)
                {
                    //删除要素
                    AllIdenticalFeature[i].Delete();
                }

                //清空列表
                AllIdenticalFeature.Clear();

                //清空表格
                FeatureGridView.Rows.Clear();

                //清空图层列表
                checkedLayer.Properties.Items.Clear();

                //关闭等待窗口
                mainForm.CloseWaitInfo();

                //刷新地图
                mainForm.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);

                MessageBox.Show("所有重复要素已删除!", "提示");

                this.Visible = true;
            }
            
        }

        /// <summary>
        /// 返回表格中所有要素
        /// </summary>
        /// <returns></returns>
        private List<IFeature> GetAllFeature()
        {
            if (FeatureGridView.Rows.Count == 0) return null;

            //要素列表
            List<IFeature> FeatureList = new List<IFeature>();
            
            for (int i = 0; i < FeatureGridView.Rows.Count;i++ )
            {
                //获取选择ID
                int OID = (int)FeatureGridView.Rows[i].Cells[0].Value;

                //获取选择图层
                string layerName = (string)FeatureGridView.Rows[i].Cells[1].Value;

                //通过名字获取图层
                ILayer SelectLayer = null;
                for (int l = 0; l < ListLayer.Count; l++)
                {
                    if (layerName == ListLayer[l].Name)
                    {
                        SelectLayer = ListLayer[l];
                    }
                }

                //根据ID获取要素
                if (SelectLayer != null)
                {
                    IFeatureLayer pFeatureLayer = SelectLayer as IFeatureLayer;
                    IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                    IFeature pFeature = pFeatureClass.GetFeature(OID);
                    FeatureList.Add(pFeature);
                }
            }

            return FeatureList;
        }

        /// <summary>
        /// 图层选择
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkedLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            //显示图层
            for (int i = 0; i < FeatureGridView.Rows.Count; i++)
            {
                FeatureGridView.Rows[i].Visible = true;
            }

            //根据图层显示
            if (checkedLayer.Text != "全部图层")
            {
                for (int i = 0; i < FeatureGridView.Rows.Count; i++)
                {
                    if (checkedLayer.Text != FeatureGridView.Rows[i].Cells[1].Value.ToString())
                    {
                        FeatureGridView.Rows[i].Visible = false;
                    }
                }
            }
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王八八。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值