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;
}
}
}
}
ArcGIS Engine - 重复性检查
于 2020-11-11 15:12:26 首次发布