/// <summary> /// 从工作空间中获得指定的拓扑 /// </summary> /// <param name="featureWorkspace">要素工作空间</param> /// <param name="topoDatasetName">包含拓扑的要素数据集名称</param> /// <param name="topoName">拓扑名称</param> /// <returns></returns> public static ITopology GetTopologyByName(this IFeatureWorkspace featureWorkspace, string topoDatasetName, string topoName) { IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset(topoDatasetName); ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset; return(topologyContainer.get_TopologyByName(topoName)); }
/// <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_TopoName">要生成拓扑的名称</param> /// <param name="IN_Tolerance">拓扑容差,可选,默认0.001</param> public void PUB_TopoBuild(string IN_TopoName, double IN_Tolerance = 0.001) { TP_topoName = IN_TopoName; ITopologyContainer topologyContainer = (ITopologyContainer)FeatureDataset_Main; try//若不存在同名拓扑则添加 { Topology = topologyContainer.get_TopologyByName(IN_TopoName); CommonClass common = new CommonClass(); common.DeleteTopolgyFromGISDB(Topology); DeleteFeature(TP_topoName); } catch { } try { Topology = topologyContainer.CreateTopology(IN_TopoName, IN_Tolerance, -1, ""); } catch (COMException comExc) { MessageBox.Show(String.Format("拓扑创建出错: {0} 描述: {1}", comExc.ErrorCode, comExc.Message)); } }
/// <summary> /// 设置检查用到的拓扑 /// </summary> private void SetCheckTopo() { #region 从MAP上获取其要素操作空间及数据集名称 string FeatureDataset_Name = ""; //要素数据集的名字 IFeatureWorkspace pFeatureWorkspace; //定义要素操作空间 ///通过MAP上的图层获取我们所需要的数据集 ILayer layer = null; //定义用来接收指定组下面的图层 int L_count = _AppHk.MapControl.LayerCount; //MAP上总图层数 if (L_count == 0) { return; //当MAP上是空,就返回 } for (int G = 0; G < L_count; G++) { ILayer temp_layer = _AppHk.MapControl.get_Layer(G); //判别是不是组,如果是,就从组中取一个层 if (temp_layer is IGroupLayer && temp_layer.Name == SetCheckState.CheckDataBaseName) { ICompositeLayer grouplayer = temp_layer as ICompositeLayer;//把组图层转成组合图层 if (grouplayer.Count == 0) { return; } layer = grouplayer.get_Layer(0);//得到MAP中其中一个层 break; } } IFeatureLayer f_layer = layer as IFeatureLayer; IFeatureClass cl = f_layer.FeatureClass;//得到对应的要素类 if (cl.FeatureDataset == null) { SetCheckState.Message(pAppFormRef, "提示", "您所操作的数据是离散的,请先做数据预处理!"); return; } else { pFeatureWorkspace = cl.FeatureDataset.Workspace as IFeatureWorkspace; FeatureDataset_Name = cl.FeatureDataset.Name;//得到要素类的数据集名称 } #endregion IFeatureDataset pfd = pFeatureWorkspace.OpenFeatureDataset(FeatureDataset_Name);//打开一个DATASET数据集 IGeoDataset pGeoDataset = pfd as IGeoDataset; if (pGeoDataset != null) { SetCheckState.Geodatabase = pGeoDataset; } ITopologyContainer pTc = pfd as ITopologyContainer;//转成创建拓扑需要的对应对象接口 #region 创建拓扑,后面的检查都使用这个拓扑 if (SetCheckState.pT == null) { ITopology pT_temp = null;//定义一个临时的拓扑 try { if (SetCheckState.CheckDataBaseName == "更新修编数据" || SetCheckState.CheckDataBaseName == "工作库数据") { pT_temp = pTc.get_TopologyByName("Rule");//查找拓扑 } else if (SetCheckState.CheckDataBaseName == "现势库数据") { pT_temp = pTc.get_TopologyByName("Rule1");//查找拓扑 } if (pT_temp != null) { SetCheckState.pT = pT_temp;//如果拓扑已存在,我们就把原先的拓扑赋值给定义的全局拓扑 SetCheckState.pRuleCont = SetCheckState.pT as ITopologyRuleContainer; } } catch { if (SetCheckState.CheckDataBaseName == "更新修编数据" || SetCheckState.CheckDataBaseName == "工作库数据") { SetCheckState.pT = pTc.CreateTopology("Rule", pTc.DefaultClusterTolerance, -1, "");//创建了个名叫Rule的拓扑。 } else if (SetCheckState.CheckDataBaseName == "现势库数据") { SetCheckState.pT = pTc.CreateTopology("Rule1", pTc.DefaultClusterTolerance, -1, "");//创建了个名叫Rule的拓扑。 } SetCheckState.pRuleCont = SetCheckState.pT as ITopologyRuleContainer; for (int l = 0; l < L_count; l++) { ILayer layer_1 = _AppHk.MapControl.get_Layer(l); //通过索引得到对应的层 #region //判别是不是组,如果是,就从组中取一个层 if (layer_1 is IGroupLayer && layer_1.Name == SetCheckState.CheckDataBaseName) { ICompositeLayer grouplayer_1 = layer_1 as ICompositeLayer;//把组图层转成组合图层 int group_count = grouplayer_1.Count; if (group_count == 0) { return; } for (int g = 0; g < group_count; g++) { ILayer layer_temp = grouplayer_1.get_Layer(g); IFeatureLayer pFeaturelayer = layer_temp as IFeatureLayer; IFeatureClass pFeatureClass = pFeaturelayer.FeatureClass; #region 将所有的要素类加入到拓扑中 if (pFeatureClass.Search(null, false).NextFeature() == null || pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation) { continue; } SetCheckState.pT.AddClass(pFeatureClass, 5, 1, 1, false);//将要验证的要线素类放入拓扑中。 #endregion } break; } #endregion } } } #endregion }
/// <summary> /// 从要素数据集中获得指定的拓扑 /// </summary> /// <param name="topoFeatureDataset">包含拓扑的要素数据集名称</param> /// <param name="topoName">拓扑名称</param> /// <returns></returns> public static ITopology GetTopologyByName(this IFeatureDataset topoFeatureDataset, string topoName) { ITopologyContainer topologyContainer = (ITopologyContainer)topoFeatureDataset; return(topologyContainer.get_TopologyByName(topoName)); }
/// <summary> /// 移除拓扑 /// </summary> /// <param name="pFeaDataet">数据集</param> /// <param name="pTopoName">拓扑名</param> /// <param name="outError">异常</param> public void RemoveTopo(IFeatureDataset pFeaDataet, string topoName, out Exception outError) { outError = null; //topoName = topoName + "_Topology"; IWorkspace pWorkspace = pFeaDataet.Workspace; IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace; IFeatureWorkspaceManage pFeatureWorkspaceManage = pFeatureWorkspace as IFeatureWorkspaceManage; //if (!((IWorkspaceEdit)pWorkspace).IsBeingEdited()) //{ // //((IWorkspaceEdit)pWorkspace).StartEditing(true); // //((IWorkspaceEdit)pWorkspace).StartEditOperation(); //} // int iCount = 0; // try // { try { ITopologyContainer pTopoCon = pFeaDataet as ITopologyContainer; ITopology pTopo = pTopoCon.get_TopologyByName(topoName); //ISchemaLock pLock = pTopo as ISchemaLock; //pLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock); ////删除该拓扑下所有的拓扑规则 //RemoveTopoRule(pTopo, out outError); //if (outError != null) return; ////删除该拓扑下左右的拓扑图层 //RemoveTopoClass(pTopo, out outError); //if (outError != null) return; //删除拓扑 IDataset pTopoDt = pTopo as IDataset; IName pName = pTopoDt.FullName; IDatasetName ptopodatasetname = pName as IDatasetName; pFeatureWorkspaceManage.DeleteByName(ptopodatasetname); //(pTopo as IDataset).Delete(); //pTopo.FeatureDataset.Delete(); //Marshal.ReleaseComObject(pTopo); pTopo = null; //++iCount; //pLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock); } catch (Exception ex) { ////********************************************* ////guozheng 2010-12-24 平安夜 added 系统异常日志 //if (ModData.SysLog == null) ModData.SysLog = new clsWriteSystemFunctionLog(); //ModData.SysLog.Write(ex); ////********************************************** outError = ex; } //} //finally //{ // if (((IWorkspaceEdit)pWorkspace).IsBeingEdited()) // { // if (iCount > 0) // { // ((IWorkspaceEdit)pWorkspace).StopEditOperation(); // ((IWorkspaceEdit)pWorkspace).StopEditing(true); // } // { // ((IWorkspaceEdit)pWorkspace).AbortEditOperation(); // ((IWorkspaceEdit)pWorkspace).StopEditing(true); // } // } //} }