1.窗体界面




2.构建拓扑数据集

using Com.XXW.NTSL.Base;
using Com.XXW.NTSL.FileManagement;
using Com.XXW.NTSL.Framework;
using Com.XXW.NTSL.Utils;
using DevExpress.XtraEditors;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.ConversionTools;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geoprocessing;
using ESRI.ArcGIS.Geoprocessor;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Forms;namespace Com.XXW.NTSL.SpaceManagement
{public partial class CheckTopology : Form{private ILayer TopoLayer;private List<string> List_Layer = new List<string>();public CheckTopology(ILayer topoLayer){InitializeComponent();TopoLayer = topoLayer;}/// <summary>/// Load事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void CheckTopology_Load(object sender, EventArgs e){//获取主窗体MainForm mainForm = MainForm.GetInstance();//获取全部图层List<ILayer> LayerList = mainForm.GetAllLayer(mainForm.Map);if (LayerList.Count != 0){for (int i = 0; i < LayerList.Count; i++){listMapLayer.Items.Add(LayerList[i].Name);}listMapLayer.SetSelected(0, true);listLegend_ValueChanged();}else{MessageBox.Show("没有图层!", "提示");return;}TopologyLoad(TopoLayer, LayerList);}/// <summary>/// 初始化拓扑信息/// </summary>/// <param name="TopoLayer">拓扑图层</param>/// <param name="LayerList">所有图层列表</param>private void TopologyLoad(ILayer TopoLayer, List<ILayer> LayerList){//初始化拓扑信息if (TopoLayer != null){ITopologyLayer pTopologyLayer = TopoLayer as ITopologyLayer;ITopology Topology = pTopologyLayer.Topology;//初始化拓扑名称TopologyName.Text = TopoLayer.Name;//初始化拓扑容差TopologyRange.Text = Convert.ToString(Topology.ClusterTolerance);//初始化拓扑要素类IFeatureDataset pFeatureDataset = Topology.FeatureDataset;IFeatureClassContainer pFeatureClassContainer = pFeatureDataset as IFeatureClassContainer;IEnumFeatureClass pEnumFeatureClass = pFeatureClassContainer.Classes;IFeatureClass pFeatureClass = pEnumFeatureClass.Next();while (pFeatureClass != null){for (int i = 0; i < LayerList.Count; i++){IFeatureLayer mFeatureLayer = LayerList[i] as IFeatureLayer;if (mFeatureLayer != null){IFeatureClass mFeatureClass = mFeatureLayer.FeatureClass;if (pFeatureClass.AliasName == mFeatureClass.AliasName){listFeatureClass.Items.Add(LayerList[i].Name);break;}}}pFeatureClass = pEnumFeatureClass.Next();}listFeatureClass.SetSelected(0, true);listLegend_ValueChanged();//初始化拓扑规则List<IFeatureClass> FeatureDatasetList = GetAllFeatureClass(pFeatureDataset);ITopologyRuleContainer pTopologyRuleContainer = Topology as ITopologyRuleContainer;IEnumRule pEnumRule = pTopologyRuleContainer.Rules;IRule pRule = pEnumRule.Next();while (pRule != null){ITopologyRule pTopologyRule = pRule as ITopologyRule;//添加规则int R = dataTopologyRule.Rows.Add(1);//获取A要素类int FeatureClassAID = pTopologyRule.OriginClassID;for (int i = 0; i < FeatureDatasetList.Count; i++){if (FeatureDatasetList[i].FeatureClassID == FeatureClassAID){IFeatureClass FeatureClassA = FeatureDatasetList[i];for (int l = 0; l < LayerList.Count; l++){IFeatureLayer AFeatureLayer = LayerList[l] as IFeatureLayer;if (AFeatureLayer != null){IFeatureClass AFeatureClass = AFeatureLayer.FeatureClass;if (FeatureClassA.AliasName == AFeatureClass.AliasName){dataTopologyRule.Rows[R].Cells[0].Value = LayerList[l].Name;}}}}}//获取规则信息string rule = pTopologyRule.Name;dataTopologyRule.Rows[R].Cells[1].Value = rule;//获取B要素类int FeatureClassBID = pTopologyRule.DestinationClassID;if (FeatureClassBID != FeatureClassAID){for (int i = 0; i < FeatureDatasetList.Count; i++){if (FeatureDatasetList[i].FeatureClassID == FeatureClassBID){IFeatureClass FeatureClassB = FeatureDatasetList[i];for (int l = 0; l < LayerList.Count; l++){IFeatureLayer BFeatureLayer = LayerList[l] as IFeatureLayer;if (BFeatureLayer != null){IFeatureClass BFeatureClass = BFeatureLayer.FeatureClass;if (FeatureClassB.AliasName == BFeatureClass.AliasName){dataTopologyRule.Rows[R].Cells[2].Value = LayerList[l].Name;}}}}}}else{dataTopologyRule.Rows[R].Cells[2].Value = "";}pRule = pEnumRule.Next();}UpdateRemove();}}/// <summary>/// 构建拓扑数据集/// </summary>/// <param name="List_Layer">要素类列表</param>/// <returns></returns>private IFeatureDataset TopologyFeatureDataSet(List<string> List_Layer){//获取主窗体MainForm mainForm = MainForm.GetInstance();//等待处理mainForm.ShowWaitInfo("正在进行,请等待", "构建拓扑数据集...");//获取工程工作空间IWorkspace workspace = null;string projectPath = ProjectHelper.GetProjectPath();MapHelper.GetShapefileWorkspace(projectPath, out workspace);//获取参与拓扑的要素类List<IFeatureClass> featureClassList = new List<IFeatureClass>();ISpatialReference pSpatialReference = null;for (int i = 0; i < List_Layer.Count; i++){//获取图层ILayer pLayer = mainForm.GetLayerByName(mainForm.Map, List_Layer[i]);if (pLayer != null){//获取要素类IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;featureClassList.Add(pFeatureClass);//获取空间坐标系IGeoDataset pGeoDataset = pLayer as IGeoDataset;pSpatialReference = pGeoDataset.SpatialReference;}else{MessageBox.Show("获取图层失败!", "提示");return null;}}//创建地理数据库string GDBName = "拓扑数据库";string GDBPath = ProjectHelper.GetProjectPath();string GDBPathName = GDBPath + Constant.File_Ext_Char2 + GDBName + ".mdb";IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactoryClass();if (System.IO.File.Exists(GDBPathName)){workspace = pWorkspaceFactory.OpenFromFile(GDBPathName, 0);}else{pWorkspaceFactory.Create(GDBPath, GDBName, null, 0);workspace = pWorkspaceFactory.OpenFromFile(GDBPathName, 0);}//清空要素数据集List<IFeatureDataset> FeatureDatasetList = GetAllFeatureClass(workspace);if (FeatureDatasetList.Count != 0){for(int i = 0;i < FeatureDatasetList.Count;i++){IFeatureDataset FeaDataset = FeatureDatasetList[i];FeaDataset.Delete();}}//创建要素数据集IFeatureDataset pFeaDataset = null;IFeatureWorkspace pFeatureWorkspace = workspace as IFeatureWorkspace;pFeaDataset = pFeatureWorkspace.CreateFeatureDataset("拓扑数据集", pSpatialReference);//将要素类添加到要素数据集string out_PathName = GDBPathName + "\\" + "拓扑数据集";for (int i = 0; i < featureClassList.Count;i++ ){AddFeatureClass(featureClassList[i], out_PathName, featureClassList[i].AliasName);}//关闭等待窗口mainForm.CloseWaitInfo();return pFeaDataset;}/// <summary>/// 拓扑检查/// </summary>/// <param name="pFeaDataset">要素数据集</param>/// <param name="topologyName">拓扑名称</param>/// <param name="topologyRange">拓扑容差</param>private void TopologyCheck(IFeatureDataset pFeaDataset, string topologyName, double topologyRange){//获取主窗体MainForm mainForm = MainForm.GetInstance();//等待处理mainForm.ShowWaitInfo("正在进行,请等待", "拓扑检查...");//构建拓扑TopologyChecker topocheck = new TopologyChecker(pFeaDataset);topocheck.PUB_TopoBuild(topologyName, topologyRange);topocheck.PUB_AddFeatureClass(null);//获取拓扑规则string featureClassA, rule, featureClassB, ErrorInfo = "";for (int i = 0; i < dataTopologyRule.Rows.Count; i++){//获取规则和要素类featureClassA = dataTopologyRule.Rows[i].Cells[0].Value.ToString();rule = dataTopologyRule.Rows[i].Cells[1].Value.ToString();featureClassB = dataTopologyRule.Rows[i].Cells[2].Value.ToString();//获取要素类图层(因为图层名称跟要素类名称可能不一样)ILayer ALayer = mainForm.GetLayerByName(mainForm.Map, featureClassA);IFeatureLayer AFeatureLayer = ALayer as IFeatureLayer;IFeatureClass AFeatureClass = AFeatureLayer.FeatureClass;//获取要素数据集中的A要素类List<IFeatureClass> List = GetAllFeatureClass(pFeaDataset);IFeatureClass IN_FeatureClassA = null, IN_FeatureClassB = null;for (int k = 0; k < List.Count; k++){if (List[k].AliasName == AFeatureClass.AliasName){IN_FeatureClassA = List[k];}}if (featureClassB != ""){ILayer BLayer = mainForm.GetLayerByName(mainForm.Map, featureClassB);IFeatureLayer BFeatureLayer = BLayer as IFeatureLayer;IFeatureClass BFeatureClass = BFeatureLayer.FeatureClass;//获取要素数据集中的B要素类for (int k = 0; k < List.Count; k++){if (List[k].AliasName == BFeatureClass.AliasName){IN_FeatureClassB = List[k];}}}//获取拓扑规则Enums.TopoErroType IN_RuleType = Enums.TopoErroType.任何规则;foreach (Enums.TopoErroType TopoErroType in Enum.GetValues(typeof(Enums.TopoErroType))){if (rule == TopoErroType.ToString()){IN_RuleType = TopoErroType;break;}}//添加拓扑规则if(featureClassB == ""){topocheck.PUB_AddRuleToTopology(IN_RuleType, IN_FeatureClassA);}else{topocheck.PUB_AddRuleToTopology(IN_RuleType, IN_FeatureClassA, IN_FeatureClassB);}}//关闭等待窗口mainForm.CloseWaitInfo();//提示错误信息MessageBox.Show("拓扑检查完成!", "提示");//将拓扑图层添加到地图ILayer topoLayer = topocheck.PUB_GetTopoLayer();topoLayer.Name = topologyName;mainForm.Map.AddLayer(topoLayer);mainForm.ActiveView.Refresh();}/// <summary>/// 将要素类添加到要素数据集/// </summary>/// <param name="pFeatureClass">要素类</param>/// <param name="out_GDBPathName">输出要素数据集路径</param>/// <param name="out_FeatureName">输出名称</param>private void AddFeatureClass(IFeatureClass pFeatureClass, string out_GDBPathName ,string out_FeatureName){//数据集添加要素Geoprocessor GP = new Geoprocessor();try{FeatureClassToFeatureClass featureClassToFeatureClass = new FeatureClassToFeatureClass();featureClassToFeatureClass.in_features = pFeatureClass;featureClassToFeatureClass.out_path = out_GDBPathName;featureClassToFeatureClass.out_name = out_FeatureName;GP.OverwriteOutput = false;IGeoProcessorResult pResult = new GeoProcessorResult();GP.Execute(featureClassToFeatureClass, null);}catch (Exception ex){object sev = null;MessageBox.Show(GP.GetMessages(ref sev));}}/// <summary>/// 获取所有要素集/// </summary>/// <param name="workspace">工作空间对象</param>/// <returns>要素集列表</returns>private static List<IFeatureDataset> GetAllFeatureClass(IWorkspace workspace){IEnumDataset dataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);IFeatureDataset featureDataset = dataset.Next() as IFeatureDataset;List<IFeatureDataset> featureDatasetList = new List<IFeatureDataset>();while (featureDataset != null){featureDatasetList.Add(featureDataset);featureDataset = dataset.Next() as IFeatureDataset;}return featureDatasetList;}/// <summary>/// 获取所有要素类/// </summary>/// <param name="featureDataset">要素集</param>/// <returns>要素类列表</returns>private static List<IFeatureClass> GetAllFeatureClass(IFeatureDataset featureDataset){IFeatureClassContainer featureClassContainer = (IFeatureClassContainer)featureDataset;IEnumFeatureClass enumFeatureClass = featureClassContainer.Classes;IFeatureClass featureClass = enumFeatureClass.Next();List<IFeatureClass> featureClassList = new List<IFeatureClass>();while (featureClass != null){featureClassList.Add(featureClass);featureClass = enumFeatureClass.Next();}return featureClassList;}/// <summary>/// 添加规则/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void addRule_Click(object sender, EventArgs e){if (List_Layer.Count != 0){TopologyRule pTopologyRule = new TopologyRule(List_Layer);pTopologyRule.ShowDialog();if (pTopologyRule.Ok){//判断添加规则是否存在for (int i = 0; i < dataTopologyRule.Rows.Count;i++ ){if (dataTopologyRule.Rows[i].Cells[0].Value.ToString() == pTopologyRule.GetFeature){if (dataTopologyRule.Rows[i].Cells[1].Value.ToString() == pTopologyRule.GetRule){if (dataTopologyRule.Rows[i].Cells[2].Value.ToString() == pTopologyRule.GetFeatureClass){MessageBox.Show("规则已经存在!");return;}}}}//添加规则int l = dataTopologyRule.Rows.Add(1);dataTopologyRule.Rows[l].Cells[0].Value = pTopologyRule.GetFeature;dataTopologyRule.Rows[l].Cells[1].Value = pTopologyRule.GetRule;dataTopologyRule.Rows[l].Cells[2].Value = pTopologyRule.GetFeatureClass;}UpdateRemove();}else{MessageBox.Show("请选择要参与到拓扑中的要素类!");}}/// <summary>/// 移除规则/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void removeRule_Click(object sender, EventArgs e){if (dataTopologyRule.SelectedRows.Count > 0){int i = dataTopologyRule.SelectedRows[0].Index;dataTopologyRule.Rows.RemoveAt(i);}if (dataTopologyRule.Rows.Count == 0){removeRule.Enabled = false;removeAll.Enabled = false;}}/// <summary>/// 全部移除/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void removeAll_Click(object sender, EventArgs e){for (int i = dataTopologyRule.Rows.Count - 1; i >= 0; i--){dataTopologyRule.Rows.RemoveAt(i);}if (dataTopologyRule.Rows.Count == 0){removeRule.Enabled = false;removeAll.Enabled = false;}}/// <summary>/// 更新移除/// </summary>private void UpdateRemove(){if (dataTopologyRule.Rows.Count != 0){removeRule.Enabled = true;removeAll.Enabled = true;}else{removeRule.Enabled = false;removeAll.Enabled = false;}}/// <summary>/// 完成/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleFinish_Click(object sender, EventArgs e){string topologyName = "";double topologyRange = 0;//获取拓扑名称if (TopologyName.Text != ""){topologyName = TopologyName.Text;}else{MessageBox.Show("拓扑名称不能为空!");return;}//获取拓扑容差if (IsNumbericA(TopologyRange.Text) && Convert.ToDouble(TopologyRange.Text) >= 0.001){topologyRange = Convert.ToDouble(TopologyRange.Text);}else{MessageBox.Show("请输入正确数值!"); return;}//获取拓扑要素类if (listFeatureClass.Items.Count == 0){MessageBox.Show("请选择要参与到拓扑中的要素类!"); return;} //获取拓扑规则if (dataTopologyRule.Rows.Count == 0){MessageBox.Show("请添加拓扑规则!"); return;}this.Visible = false;this.Close();//拓扑检查if (topologyName != "" && topologyRange != 0){//构建拓扑数据集IFeatureDataset FeatureDataset = TopologyFeatureDataSet(List_Layer);//构建拓扑TopologyCheck(FeatureDataset, topologyName, topologyRange);}}/// <summary>/// 取消/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleCancel_Click(object sender, EventArgs e){this.Close();}/// <summary>/// 要素类添加事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void listFeatureClass_SelectedIndexChanged(object sender, EventArgs e){List_Layer.Clear();for (int i = 0; i < listFeatureClass.Items.Count; i++){string LayreName = listFeatureClass.Items[i].ToString();List_Layer.Add(LayreName);}}/// <summary>/// 添加要素类/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleAdd_Click(object sender, EventArgs e){object Item = listMapLayer.SelectedItem;for (int i = 0; i < listFeatureClass.Items.Count; i++ ){if (listFeatureClass.Items[i] == Item){listFeatureClass.Items.Remove(Item);}}listFeatureClass.Items.Add(Item);listFeatureClass.SetSelected(0, true);listLegend_ValueChanged();}/// <summary>/// 添加全部/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleAddAll_Click(object sender, EventArgs e){listFeatureClass.Items.Clear();listFeatureClass.Items.AddRange(listMapLayer.Items);listFeatureClass.SetSelected(0, true);listLegend_ValueChanged();}/// <summary>/// 移除要素类/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleRemove_Click(object sender, EventArgs e){if (listFeatureClass.Items.Count != 0){object Item = listFeatureClass.SelectedItem;for (int i = 0; i < dataTopologyRule.Rows.Count; i++ ){string featureClassA, featureClassB, featureSelect;featureSelect = Item.ToString();featureClassA = dataTopologyRule.Rows[i].Cells[0].Value.ToString();featureClassB = dataTopologyRule.Rows[i].Cells[2].Value.ToString();if (featureClassA == featureSelect || featureClassB == featureSelect){MessageBox.Show("该要素已参与到拓扑规则中,无法移除!","提示");return;}}listFeatureClass.Items.Remove(Item);if (listFeatureClass.Items.Count != 0){listFeatureClass.SetSelected(0, true);}listLegend_ValueChanged();}}/// <summary>/// 移除全部/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleRemoveAll_Click(object sender, EventArgs e){if (listFeatureClass.Items.Count != 0){for (int i = 0; i < listFeatureClass.Items.Count; i++ ){object Item = listFeatureClass.Items[i];for (int l = 0; l < dataTopologyRule.Rows.Count; l++){string featureClassA, featureClassB, featureSelect;featureSelect = Item.ToString();featureClassA = dataTopologyRule.Rows[l].Cells[0].Value.ToString();featureClassB = dataTopologyRule.Rows[l].Cells[2].Value.ToString();if (featureClassA == featureSelect || featureClassB == featureSelect){MessageBox.Show("要素已参与到拓扑规则中,无法移除!", "提示");return;}}}listFeatureClass.Items.Clear();listLegend_ValueChanged();}}/// <summary>/// 上移/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleUp_Click(object sender, EventArgs e){object Item = listFeatureClass.SelectedItem;int i = listFeatureClass.SelectedIndex;if (i != 0){listFeatureClass.Items.Insert(i - 1, Item);listFeatureClass.Items.RemoveAt(i + 1);listFeatureClass.SetSelected(i - 1, true);}}/// <summary>/// 下移/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void simpleDown_Click(object sender, EventArgs e){object Item = listFeatureClass.SelectedItem;int i = listFeatureClass.SelectedIndex;if (i != listFeatureClass.Items.Count - 1){listFeatureClass.Items.Insert(i + 2, Item);listFeatureClass.Items.RemoveAt(i);listFeatureClass.SetSelected(i + 1, true);}}/// <summary>/// 更新状态/// </summary>private void listLegend_ValueChanged(){if (listFeatureClass.Items.Count != 0){simpleRemove.Enabled = true;simpleRemoveAll.Enabled = true;simpleUp.Enabled = true;simpleDown.Enabled = true;}else{simpleRemove.Enabled = false;simpleRemoveAll.Enabled = false;simpleUp.Enabled = false;simpleDown.Enabled = false;}}#region 通用函数/// <summary>  /// 是否大于0的数字  /// </summary>  /// <param name="v"></param>  /// <returns></returns>  private bool IsNumbericA(string v){return (this.IsFloatA(v));}/// <summary>  /// 是否正浮点数  /// </summary>  /// <param name="v"></param>  /// <returns></returns>  private bool IsFloatA(string v){string pattern = @"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$";Regex reg = new Regex(pattern);return reg.IsMatch(v);}#endregion }
}

3.拓扑检查

using Com.XXW.NTSL.Base;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataManagementTools;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geoprocessor;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Com.XXW.NTSL.SpaceManagement
{class TopologyChecker{Geoprocessor GP_Tool = new Geoprocessor();ITopology Topology;IFeatureDataset FeatureDataset_Main;List<IFeatureClass> LI_FeatureClass = new List<IFeatureClass>();List<string> LI_AllErrorInfo = new List<string>();ITopologyLayer L_TopoLayer;/// <summary>/// 构造拓扑检验类/// </summary>/// <param name="IN_MainlogyDataSet">输入的要素数据集</param>public TopologyChecker(IFeatureDataset IN_MainlogyDataSet){FeatureDataset_Main = IN_MainlogyDataSet;if (LI_FeatureClass.Count != 0)LI_FeatureClass.Clear();PUB_GetAllFeatureClass();}/// <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));}}}/// <summary>/// 添加特定要素类到拓扑中/// </summary>/// <param name="IN_TopologyClass">要添加的要素类的集合。输入null为该数据集下所有要素类</param>/// <param name="IN_XYRank">XY等级,默认为1。可选。</param>/// <param name="IN_ZRank">Z等级,默认为1。可选。</param>/// <param name="IN_Weight">权重,默认为5。可选。</param>public void PUB_AddFeatureClass(List<IFeatureClass> IN_TopologyClass, int IN_XYRank = 1, int IN_ZRank = 1, double IN_Weight = 5){if (Topology != null){if (IN_TopologyClass == null){IN_TopologyClass = LI_FeatureClass;}foreach (IFeatureClass EachFeatureCLS in IN_TopologyClass)//逐项添加所选的要素类{if (LI_FeatureClass.Contains(EachFeatureCLS))//只有相同要素数据集中的要素可以被添加{try{Topology.AddClass(EachFeatureCLS as IClass, IN_Weight, IN_XYRank, IN_ZRank, false);}catch (COMException comExc){MessageBox.Show(String.Format(((FeatureClass)EachFeatureCLS).Name + ":添加失败。 描述: {0}", comExc.Message));}}else{MessageBox.Show("该要素类不属于目标要素集,无法添加!");}}}else{MessageBox.Show("请先构建拓扑");}}/// <summary>/// GP法拓扑验证/// </summary>private void PRV_ValidateTopologyWithGP(){try{ValidateTopology Temp_Validate = new ValidateTopology(Topology);GP_Tool.Execute(Temp_Validate, null);}catch{MessageBox.Show("无法完成检测!");}}/// <summary>/// 单要素规则/// </summary>/// <param name="IN_RuleType">要添加的规则</param>/// <param name="IN_FeatureClass">添加规则的要素类</param>public void PUB_AddRuleToTopology(Enums.TopoErroType IN_RuleType, IFeatureClass IN_FeatureClass){if (Topology != null){ITopologyRule Temp_TopologyRule = new TopologyRuleClass();//设定参数Temp_TopologyRule.TopologyRuleType = PRV_ConvertTopologyRuleType(IN_RuleType);Temp_TopologyRule.Name = IN_RuleType.ToString();Temp_TopologyRule.OriginClassID = IN_FeatureClass.FeatureClassID;Temp_TopologyRule.AllOriginSubtypes = true;PRV_AddRuleTool(Temp_TopologyRule);}else{MessageBox.Show("请先构建拓扑");}}/// <summary>/// 双要素规则/// </summary>/// <param name="IN_RuleType">要添加的双要素规则</param>/// <param name="IN_FeatureClassA">第一个要素</param>/// <param name="IN_FeatureClassB">第二个要素</param>public void PUB_AddRuleToTopology(Enums.TopoErroType IN_RuleType, IFeatureClass IN_FeatureClassA, IFeatureClass IN_FeatureClassB){if (Topology != null){ITopologyRule Temp_TopologyRule = new TopologyRuleClass();//设定参数Temp_TopologyRule.TopologyRuleType = PRV_ConvertTopologyRuleType(IN_RuleType);Temp_TopologyRule.Name = IN_RuleType.ToString();Temp_TopologyRule.OriginClassID = IN_FeatureClassA.FeatureClassID;Temp_TopologyRule.DestinationClassID = IN_FeatureClassB.FeatureClassID;Temp_TopologyRule.AllOriginSubtypes = true;Temp_TopologyRule.AllDestinationSubtypes = true;PRV_AddRuleTool(Temp_TopologyRule);}else{MessageBox.Show("请先构建拓扑");}}/// <summary>/// 规则添加工具/// </summary>/// <param name="IN_TopologyRule"></param>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);//输出错误}/// <summary>/// 获取错误信息/// </summary>/// <param name="IN_TopologyRule"></param>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;}elseTemp_ErrorInfo = Temp_ErrorFeature.OriginOID.ToString();LI_AllErrorInfo.Add(Temp_ErrorInfo);//将错误信息加入ListTemp_ErrorFeature = Temp_EnumErrorFeature.Next();}}else{MessageBox.Show("请先构建拓扑");}}/// <summary>/// 提取所有拓扑错误信息/// </summary>/// <returns>错误信息集合</returns>public List<string> PUB_GetErrorInfo(){return LI_AllErrorInfo;}#region 辅助函数/// <summary>/// 获取拓扑图层/// </summary>/// <returns>拓扑图层Ilayer</returns>public ILayer PUB_GetTopoLayer(){if (L_TopoLayer == null){L_TopoLayer = new TopologyLayerClass();L_TopoLayer.Topology = Topology;}return L_TopoLayer as ILayer;}/// <summary>/// 获取数据集中所有包含的要素类/// </summary>/// <returns>返回数据集中所有包含的要素类 List<IFeatureClass></returns>public List<IFeatureClass> PUB_GetAllFeatureClass(){if (LI_FeatureClass.Count == 0){IFeatureClassContainer Temp_FeatureClassContainer = (IFeatureClassContainer)FeatureDataset_Main;IEnumFeatureClass Temp_EnumFeatureClass = Temp_FeatureClassContainer.Classes;IFeatureClass Temp_FeatureClass = Temp_EnumFeatureClass.Next();while (Temp_FeatureClass != null){LI_FeatureClass.Add(Temp_FeatureClass);Temp_FeatureClass = Temp_EnumFeatureClass.Next();}if (LI_FeatureClass.Count == 0){MessageBox.Show("空数据集!");}}return LI_FeatureClass;}#endregion#region 规则翻译//根据错误的中文描述转换成esri拓扑枚举private esriTopologyRuleType PRV_ConvertTopologyRuleType(Enums.TopoErroType IN_TopoRuleType){esriTopologyRuleType Temp_TopoRuleType;switch (IN_TopoRuleType){ case Enums.TopoErroType.任何规则:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAny;break;case Enums.TopoErroType.面要素之间无空隙:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaNoGaps;break;case Enums.TopoErroType.面要素间无重叠:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaNoOverlap;break;case Enums.TopoErroType.第二个图层面要素必须被第一个图层任一面要素覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaCoveredByAreaClass;break;case Enums.TopoErroType.两图层面要素必须互相覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaAreaCoverEachOther;break;case Enums.TopoErroType.第一个图层面要素必须被第一个图层任一面要素包含:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaCoveredByArea;break;case Enums.TopoErroType.图层间面要素不能相互覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaNoOverlapArea;break;case Enums.TopoErroType.线要素必须跟面图层边界的一部分或全部重叠:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineCoveredByAreaBoundary;break;case Enums.TopoErroType.线要素必须在面内:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineInsideArea;break;case Enums.TopoErroType.点要素必须落在面要素边界上:Temp_TopoRuleType = esriTopologyRuleType.esriTRTPointCoveredByAreaBoundary;break;case Enums.TopoErroType.点要素必须落在面要素内:Temp_TopoRuleType = esriTopologyRuleType.esriTRTPointProperlyInsideArea;break;case Enums.TopoErroType.面要素必须只包含一个点要素:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaContainOnePoint;break;case Enums.TopoErroType.线要素间不能有相互重叠部分:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoOverlap;break;case Enums.TopoErroType.线要素之间不能相交:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoIntersection;break;case Enums.TopoErroType.线要素不允许有悬挂点:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoDangles;break;case Enums.TopoErroType.线要素不允许有假节点:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoPseudos;break;case Enums.TopoErroType.第一个图层线要素应被第二个线图层线要素覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineCoveredByLineClass;break;case Enums.TopoErroType.第一个图层线要素不被第二个线图层线要素覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoOverlapLine;break;case Enums.TopoErroType.点要素应被线要素覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTPointCoveredByLine;break;case Enums.TopoErroType.点要素应在线要素的端点上:Temp_TopoRuleType = esriTopologyRuleType.esriTRTPointCoveredByLineEndpoint;break;case Enums.TopoErroType.点要素之间不相交:Temp_TopoRuleType = esriTopologyRuleType.esriTRTPointDisjoint;break;case Enums.TopoErroType.点要素重合点要素:Temp_TopoRuleType = esriTopologyRuleType.esriTRTPointCoincidePoint;break;case Enums.TopoErroType.面要素边界必须被线要素覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaBoundaryCoveredByLine;break;case Enums.TopoErroType.面要素的边界必须被另一面要素边界覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaBoundaryCoveredByAreaBoundary;break;case Enums.TopoErroType.线要素不能自重叠:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoSelfOverlap;break;case Enums.TopoErroType.线要素不能自相交:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoSelfIntersect;break;case Enums.TopoErroType.线要素间不能重叠和相交:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoIntersectOrInteriorTouch;break;case Enums.TopoErroType.线要素端点必须被点要素覆盖:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineEndpointCoveredByPoint;break;case Enums.TopoErroType.面要素内必须包含至少一个点要素:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAreaContainPoint;break;case Enums.TopoErroType.线不能是多段:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoMultipart;break;case Enums.TopoErroType.线要素必须不相交:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoIntersectLine;break;case Enums.TopoErroType.线必须不相交或内部接触:Temp_TopoRuleType = esriTopologyRuleType.esriTRTLineNoIntersectOrInteriorTouchLine;break;default:Temp_TopoRuleType = esriTopologyRuleType.esriTRTAny;//将此规则赋予拓扑会直接报错break;}return Temp_TopoRuleType;}//根据错误ID获取对应描述private string PRV_RecorverTopologyRuleType(int IN_TopoType){//根据枚举值获取枚举名string Temp_ErrorDiscripe=Enum.GetName(typeof(Enums.TopoErroType), IN_TopoType);if (Temp_ErrorDiscripe == null)return (IN_TopoType.ToString());//若规则不在列表内则直接返回规则号elsereturn Temp_ErrorDiscripe;}#endregion}}

4.拓扑规则窗体

using Com.XXW.NTSL.Base;
using Com.XXW.NTSL.FileManagement;
using Com.XXW.NTSL.Framework;
using Com.XXW.NTSL.Utils;
using ESRI.ArcGIS.Geodatabase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Com.XXW.NTSL.SpaceManagement
{public partial class TopologyRule : Form{private List<string> List_Layer;public bool Ok = false;public TopologyRule(List<string> list_Layer){InitializeComponent();List_Layer = list_Layer;}/// <summary>/// Load事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TopologyRule_Load(object sender, EventArgs e){//初始化要素foreach (string Layer in List_Layer){checkedFeature.Properties.Items.Add(Layer);}checkedFeature.SelectedIndex = 0;}/// <summary>/// 要素选择事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void checkedFeature_SelectedIndexChanged(object sender, EventArgs e){if (checkedFeature.SelectedItem == null) return;//获取选择图层string layer = checkedFeature.SelectedItem.ToString();//获取主窗体MainForm mainForm = MainForm.GetInstance();//返回指定名字图层的要素类型Enums.EnumFeatureGeometryType? geometryType = mainForm.GetLayerType(mainForm.Map, layer);if (geometryType != null){//初始化规则checkedRule.Properties.Items.Clear();if (geometryType == Enums.EnumFeatureGeometryType.点){//点拓扑规则foreach (string Rule in Constant.Point_TopologyRule){checkedRule.Properties.Items.Add(Rule);}checkedRule.SelectedIndex = 0;}if (geometryType == Enums.EnumFeatureGeometryType.线){//线拓扑规则foreach (string Rule in Constant.Line_TopologyRule){checkedRule.Properties.Items.Add(Rule);}checkedRule.SelectedIndex = 0;}if (geometryType == Enums.EnumFeatureGeometryType.面){//面拓扑规则foreach (string Rule in Constant.Polygon_TopologyRule){checkedRule.Properties.Items.Add(Rule);}checkedRule.SelectedIndex = 0;}}else{MessageBox.Show("选择图层为空!", "提示", MessageBoxButtons.OK);}}/// <summary>/// 拓扑规则选择事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void checkedRule_SelectedIndexChanged(object sender, EventArgs e){RuleSelectFeature();}/// <summary>/// 规则更改选择第二要素事件/// </summary>private void RuleSelectFeature(){if (checkedFeature.SelectedItem == null || checkedRule.SelectedItem == null) return;//获取选择图层string layer = checkedFeature.SelectedItem.ToString();//获取选择规则string rule = checkedRule.SelectedItem.ToString();//获取主窗体MainForm mainForm = MainForm.GetInstance();//返回指定名字图层的要素类型Enums.EnumFeatureGeometryType? geometryType = mainForm.GetLayerType(mainForm.Map, layer);if (geometryType != null){if (geometryType == Enums.EnumFeatureGeometryType.点){if (rule == "点要素之间不相交"){checkedFeatureClass.Text = "";checkedFeatureClass.Properties.Items.Clear();checkedFeatureClass.Enabled = false;}if (rule == "点要素重合点要素"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.点);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){if (Layer != layer){checkedFeatureClass.Properties.Items.Add(Layer);}}checkedFeatureClass.SelectedIndex = 0;}if (rule == "点要素应被线要素覆盖" || rule == "点要素应在线要素的端点上"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.线);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){checkedFeatureClass.Properties.Items.Add(Layer);}checkedFeatureClass.SelectedIndex = 0;}if (rule == "点要素必须落在面要素边界上" || rule == "点要素必须落在面要素内"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.面);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){checkedFeatureClass.Properties.Items.Add(Layer);}checkedFeatureClass.SelectedIndex = 0;}}if (geometryType == Enums.EnumFeatureGeometryType.线){if (rule == "线要素间不能有相互重叠部分" || rule == "线要素之间不能相交" || rule == "线要素不允许有悬挂点" || rule == "线要素不允许有假节点" || rule == "线要素不能自重叠" || rule == "线要素不能自相交" || rule == "线不能是多段" || rule == "线必须不相交或内部接触"){checkedFeatureClass.Text = "";checkedFeatureClass.Properties.Items.Clear();checkedFeatureClass.Enabled = false;}if (rule == "线要素端点必须被点要素覆盖"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.点);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){checkedFeatureClass.Properties.Items.Add(Layer);}checkedFeatureClass.SelectedIndex = 0;}if (rule == "第一个图层线要素应被第二个线图层线要素覆盖" || rule == 第一个图层线要素不被第二个线图层线要素覆盖  || rule == "线要素必须不相交" || rule == "线要素间不能重叠和相交"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.线);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){if (Layer != layer){checkedFeatureClass.Properties.Items.Add(Layer);}}checkedFeatureClass.SelectedIndex = 0;}if (rule == "线要素必须跟面图层边界的一部分或全部重叠" || rule == "线要素必须在面内"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.面);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){checkedFeatureClass.Properties.Items.Add(Layer);}checkedFeatureClass.SelectedIndex = 0;}}if (geometryType == Enums.EnumFeatureGeometryType.面){if (rule == "面要素间无重叠" || rule == "面要素之间无空隙"){checkedFeatureClass.Text = "";checkedFeatureClass.Properties.Items.Clear();checkedFeatureClass.Enabled = false;}if (rule == "面要素必须只包含一个点要素" || rule == "面要素内必须包含至少一个点要素"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.点);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){checkedFeatureClass.Properties.Items.Add(Layer);}checkedFeatureClass.SelectedIndex = 0;}if (rule == "面要素边界必须被线要素覆盖"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.线);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){checkedFeatureClass.Properties.Items.Add(Layer);}checkedFeatureClass.SelectedIndex = 0;}if (rule == "图层间面要素不能相互覆盖" || rule == "第二个图层面要素必须被第一个图层任一面要素覆盖" || rule == "两图层面要素必须互相覆盖" || rule == "面要素的边界必须被另一面要素边界覆盖" || rule == "第一个图层面要素必须被第一个图层任一面要素包含"){List<string> type_List = FeatureClassType(List_Layer, Enums.EnumFeatureGeometryType.面);//初始化要素类checkedFeatureClass.Enabled = true;checkedFeatureClass.Properties.Items.Clear();foreach (string Layer in type_List){if (Layer != layer){checkedFeatureClass.Properties.Items.Add(Layer);}}checkedFeatureClass.SelectedIndex = 0;}}}else{MessageBox.Show("未找到图层!", "提示", MessageBoxButtons.OK);}}/// <summary>/// 获取指定类型的图层列表/// </summary>/// <param name="List_Layer"></param>/// <param name="geometryType"></param>/// <returns></returns>private List<string> FeatureClassType(List<string> List_Layer, Enums.EnumFeatureGeometryType? geometryType){//指定类型的图层列表List<string> geometryType_Layer = new List<string>();//获取主窗体MainForm mainForm = MainForm.GetInstance();//初始化要素类foreach (string Layer in List_Layer){//返回指定名字图层的要素类型Enums.EnumFeatureGeometryType? Type = mainForm.GetLayerType(mainForm.Map, Layer);if (geometryType == Type){geometryType_Layer.Add(Layer);}}return geometryType_Layer;}/// <summary>/// 获取要素/// </summary>public string GetFeature{get { return checkedFeature.SelectedItem.ToString();}}/// <summary>/// /获取规则/// </summary>public string GetRule{get { return checkedRule.SelectedItem.ToString(); }}/// <summary>/// 获取要素类/// </summary>public string GetFeatureClass{get { return checkedFeatureClass.SelectedItem.ToString(); }}/// <summary>/// 确定按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOk_Click(object sender, EventArgs e){if (checkedFeatureClass.SelectedItem != null){Ok = true;this.Close();}else{MessageBox.Show("要素类不能为空!");}}/// <summary>/// 取消按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnCancel_Click(object sender, EventArgs e){this.Close();}}
}

5.拓扑规则枚举

     /// <summary>/// 点类型拓扑规则/// </summary>public static List<string> Point_TopologyRule = new List<string>(){"点要素必须落在面要素边界上","点要素应在线要素的端点上","点要素应被线要素覆盖","点要素必须落在面要素内 ","点要素重合点要素","点要素之间不相交"};/// <summary>/// 线类型拓扑规则/// </summary>public static List<string> Line_TopologyRule = new List<string>(){ "线要素间不能有相互重叠部分","线要素之间不能相交","第一个图层线要素应被第二个线图层线要素覆盖","第一个图层线要素不被第二个线图层线要素覆盖","线要素必须跟面图层边界的一部分或全部重叠","线要素不允许有悬挂点","线要素不允许有假节点","线要素不能自重叠","线要素不能自相交","线不能是多段","线必须不相交或内部接触","线要素端点必须被点要素覆盖","线要素必须不相交","线要素间不能重叠和相交","线要素必须在面内"};/// <summary>/// 面类型拓扑规则/// </summary>public static List<string> Polygon_TopologyRule = new List<string>(){ "面要素间无重叠","面要素之间无空隙","图层间面要素不能相互覆盖","第二个图层面要素必须被第一个图层任一面要素覆盖","两图层面要素必须互相覆盖","第一个图层面要素必须被第一个图层任一面要素包含","面要素边界必须被线要素覆盖","面要素的边界必须被另一面要素边界覆盖","面要素内必须包含至少一个点要素","面要素必须只包含一个点要素"};/// <summary>/// 拓扑规则类枚举/// </summary>public enum TopoErroType{任何规则 = 0,面要素之间无空隙 = 1,面要素间无重叠 = 2,第二个图层面要素必须被第一个图层任一面要素覆盖 = 3,两图层面要素必须互相覆盖 = 4,第一个图层面要素必须被第一个图层任一面要素包含 = 5,图层间面要素不能相互覆盖 = 6,线要素必须跟面图层边界的一部分或全部重叠 = 7,线要素必须在面内 = 8,点要素必须落在面要素边界上 = 9,点要素必须落在面要素内 = 10,面要素必须只包含一个点要素 = 11,线要素间不能有相互重叠部分 = 12,线要素之间不能相交 = 13,线要素不允许有悬挂点 = 14,线要素不允许有假节点 = 15,第一个图层线要素应被第二个线图层线要素覆盖 = 16,第一个图层线要素不被第二个线图层线要素覆盖 = 17,点要素应被线要素覆盖 = 18,点要素应在线要素的端点上 = 19,点要素之间不相交 = 20,点要素重合点要素 = 21,面要素边界必须被线要素覆盖 = 22,面要素的边界必须被另一面要素边界覆盖 = 23,线要素不能自重叠 = 24,线要素不能自相交 = 25,线要素间不能重叠和相交 = 26,线要素端点必须被点要素覆盖 = 27,面要素内必须包含至少一个点要素 = 28,线不能是多段 = 29,线要素必须不相交 = 30,线必须不相交或内部接触 = 31};

ArcGIS Engine - 拓扑检查相关推荐

  1. 使用ArcGIS进行拓扑检查

    使用ArcGIS进行拓扑检查 最近在项目中碰到一个问题:道路中心线如果有多部分组成,例如是MultiLineString的时候,由于数据采集处理的原因经常会造成,MultiLineString的各个部 ...

  2. ArcGIS Engine空间分析之拓扑分析的实现

    简单介绍: 拓扑学是一门研究几何图形位置关系的科学. GIS所关注的拓扑主要集中在拓扑关系--存在于地理实体间的拓扑关系. 拓扑关系在GIS中起着描述两个地理实体的相对空间位置的重要作用.它是GIS空 ...

  3. ArcGIS矢量化并进行拓扑检查

    土地利用数据每年都在发生变化,故每年都要根据去年的数据进行修改.请根据以下要求,修改A区域的数据并对B区域已做好的数据进行拓扑检查. 01 数据说明 1. 地类图斑A.shp:A区域需要编辑修改的图斑 ...

  4. ArcGIS Engine 中的多线程使用

    转自原文ArcGIS Engine 中的多线程使用 一直都想写写AE中多线程的使用,但一直苦于没有时间,终于在中秋假期闲了下来.呵呵,闲话不说了,进入正题! 大家都了解到ArcGIS中处理大数据量时速 ...

  5. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方 ...

  6. ArcGIS Engine基础开发教程(转)

    ArcGIS Engine基础开发教程(0)--目录 <ArcEngine9.3 基础开发教程>是面向初中级开发者的一份简单易用,功能全面的学习资料及参考文档.教程首先从如何来创建一个Ar ...

  7. ArcGIS Engine 10开发环境的一些常见问题(转载)

    转自:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=107612&extra=&page=1 许多版友在刚刚使用ArcGIS 1 ...

  8. AE开发 创建Feature后,需要进行拓扑检查

    在创建完Feature并赋予Geometry后,需要对当前的Feature.shape进行拓扑检查.利用 ITopologicalOperator接口中的IsSimple属性进行拓扑检查. 检查失败后 ...

  9. ArcGIS Engine开发之地图基本操作(3)

    地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...

最新文章

  1. SAP SD基础知识之信用控制范围
  2. 常考数据结构和算法:合并有序链表
  3. 【深度学习】如何配置一台深度学习工作站?
  4. final关键字_Java中的final关键字
  5. 连接远程电脑中的虚拟机---端口映射
  6. js取消气泡事件、阻止浏览器的默认行为
  7. 软件工程教学博客 (备份)
  8. java代码创建jar_Java 创建ZIP和JAR文件
  9. android_ratingbar的使用错误
  10. android 自定义view 水波纹进度球
  11. HBase MapReduce实例分析
  12. 关于SDWebImage
  13. 状压DP——子集DP
  14. Ubuntu20.04 Server+Xubuntu-desktop英文环境下安装百度五笔
  15. 分时电价模型,削峰填谷,转移24小时一天中用电率,减少谷峰差
  16. 计算机excel实验结果分析,使用Excel2013分析管理表格数据实训演练——想象力电脑应用...
  17. spring定时任务需要在项目启动时执行一次
  18. 省略to的动词不定式八种情况
  19. NET性能优化-推荐使用Collections.Pooled(补充)
  20. 微软认证解决方案专家

热门文章

  1. 高通CSR QCC300x i2s和AudioCodec 输出切换
  2. Thinkcmf伪静态设置,url美化
  3. 6小时精通反激开关电源与变压器设计-3反激电源变压器设计软件应用说明
  4. windowsbuilder安装笔记(swt,swing,gwt-designer三合一)
  5. easyui框架下table,每行实现上下移动
  6. 基于python大数据设计的汉语分析分词系统(完整的代码+数据)
  7. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java防疫物资捐赠系统r54w0
  8. docker mysql修改配置文件
  9. js异步编程的方法和原理
  10. 从源头看Dust3d | (十)meshsplitter:网格切割