ArcEngine中拓扑的使用
拓扑(ITopology)的使用包括
1.建立拓扑
2.验证拓扑
3.编辑过程中保证拓扑的正确
4.查询系统中存在的拓扑
1.首先 来看看建立拓扑
Topology实现了ITopology这个接口 但是给类是不能用来创建对象的。
必须要通过调用 ITopologyContainer::CreateTopology这个方法来建立一个Topology
FeatureDataset 实现了ITopologyContainer这个接口。那么 这就是说拓扑只能在一个
FeatureDataset的范围内建立。而不能独立存在于Workspace中。这样做的原因是需要保证
参与同一个拓扑的FeatureClass具有同一个投影坐标系统。 建立拓扑后需要将ObjectClass
加入到拓扑中去。这样这个拓扑就可以用来验证这几个ObjectClass 的对象之间的关系了。
验证关系就要有规则,规则是由ITopologyRule来表达的。ITopologyRule必须要被
加入到一个ITopologyRuleContainer中去。而Topology实现了这个接口。
一个ITopologyRule用来表达两个ObjectClass的对象之间的某个关系。
具体代码参看接口就可以了。
2.验证拓扑
ITopology有一个方法 ValidateTopology 用来验证指定区域内的拓扑。需要注意 没有版本
的拓扑可以在 任何时候验证。而有版本的拓扑必须在编辑回话中验证。
3.拓扑编辑
1.移动共用点
1.首先需要打开拓扑 建立拓扑图(ITopologyGraph)
代码如下:
//topoLayer 是一个打开的拓扑图层
ITopologyGraph pTG=topoLayer.Topology.Cache;
pTG.Build(pA.Extent,false);
2.然后 需要获得当前节点或者边 这个操作要使用拓扑图的点击测试
ITopologyElement topeEle
pTG.HitTest(... ref topeEle);
这个方法在点击测试成功的时候返回true.而且会通过topeEle这个ref 参数将选中的元素(点或者边)
返回.
3.还有一种获取节点的方法
首先调用拓扑图的Select方法 选中点击测试的元素(pTG.Select)
然后可以查询拓扑图的选中节点集合 就可以找到该节点(pTG.NodeSelection)
4.为该元素使用一个Feedback.
//其中 pNode 就是当前节点 sr 是参考坐标系 可以使用null
//还有给Feedback设置Display
m_pNodeFeedback =pTG.GetSplitMoveNodeFeedback(pNode,false,sr);
m_pNodeFeedback.Display= activeView.ScreenDisplay;
5.在鼠标移动的时候 调用Feedback的MoveTo 方法。
if(m_pNodeFeedback!=null)
{
//activeView 是活动的试图
//首先要把将点坐标转换为地图中的坐标。
//然后调用MoveTo 方法
IPoint pt=activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
m_pNodeFeedback.MoveTo(pt);
}
6.在鼠标释放的时候
//获取拓扑图
ITopologyGraph pTG=topoLayer.Topology.Cache;
//转换坐标
IPoint pt=pA.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
//获得正在做拓扑编辑的元素
ITopologyNode pTN=(ITopologyNode)m_pTopoElement;
//实施拓扑编辑
pTG.SplitMoveNode(pTN,pt,false);
//提交拓扑编辑结果
IEnvelope pE;
pTG.Post(out pE);
4.查询系统中的拓扑
还是ITopologyContainer 这个接口 这个接口有FeatureDataset这个唯一的实现。
CreateTopology 建立一个新的拓扑
DefaultClusterTolerance The default cluster tolerance as per the topology engine.
MaximumClusterTolerance The maximal cluster tolerance as per the topology engine.
MinimumClusterTolerance The minimal cluster tolerance as per the topology engine.
Topology 通过索引打开拓扑.
TopologyByID 通过ID打开拓扑.
TopologyByName 通过名字打开拓扑
TopologyCount 拓扑的数目