创建拓扑
拓扑(Topology)是在同一个要素集(FeatureDataset)下的要素类(Feature
Class)之间的拓扑关系的集合。所以要参与一个拓扑的所有要素类,必须在同一个要素集内。一个要素集可以有多个拓扑,但每个要素类最多只能参与一个拓
扑。
使用ArcCatalog创建Topology,在生成要素集及其下的要素类后,先不要进行注册版本,而先要根据创建拓扑向导创建拓扑层,之后再进行注册版本。
不能建立拓扑的情况:
目标要素类已参与了一个Topology或Geometry Network
目标要素类是一个注记层或多维图层
目标要素类已被注册为有版本
在ArcEngine应用程序中虽然可通过ITopologyContainer接口创建Topology,但这仅适合于要素类没有注册版本的情况。对于
已注册版本的要素集,这种创建拓扑方法会使WorkSpace失效。一般使用ArcSDE,要素类很少不注册版本的;没有注册版本就无法实现版本追溯,甚
至连编辑的撤销重做都无法实现。
拓扑检查
对于有注册版本的拓扑检查,必须在一个Edit Operation间进行。
''' <summary>
''' 对指定图层执行拓扑检查,并将拓扑结果层添加到Map
''' </summary>
''' <param name="pFeatureClass">参与拓扑的要素类</param>
''' <param name="pMap"></param>
''' <remarks></remarks>
Public Sub ValidateTopology(ByVal pFeatureClass As IFeatureClass, ByVal pMap As IMap)
Dim pTopoClass As ITopologyClass = pFeatureClass
'如果要素类参与了拓扑
If pTopoClass.IsInTopology Then
'StartEditOperation()
'执行拓扑检查
Dim pTopo As ITopology = pTopoClass.Topology
Dim pGeoDS As IGeoDataset = pTopo
Dim pValidatedEnv As IEnvelope = pTopo.ValidateTopology(pGeoDS.Extent.Envelope)
'EndEditOperation()
'将检查结果添加到Map
Dim pTopoLayer As ITopologyLayer = New TopologyLayer
pTopoLayer.Topology = pTopo
Dim pLayer As ILayer = pTopoLayer
pLayer.Name = pFeatureClass.AliasName & "_拓扑"
pMap.AddLayer(pLayer)
End If
End Sub
''' 对指定图层执行拓扑检查,并将拓扑结果层添加到Map
''' </summary>
''' <param name="pFeatureClass">参与拓扑的要素类</param>
''' <param name="pMap"></param>
''' <remarks></remarks>
Public Sub ValidateTopology(ByVal pFeatureClass As IFeatureClass, ByVal pMap As IMap)
Dim pTopoClass As ITopologyClass = pFeatureClass
'如果要素类参与了拓扑
If pTopoClass.IsInTopology Then
'StartEditOperation()
'执行拓扑检查
Dim pTopo As ITopology = pTopoClass.Topology
Dim pGeoDS As IGeoDataset = pTopo
Dim pValidatedEnv As IEnvelope = pTopo.ValidateTopology(pGeoDS.Extent.Envelope)
'EndEditOperation()
'将检查结果添加到Map
Dim pTopoLayer As ITopologyLayer = New TopologyLayer
pTopoLayer.Topology = pTopo
Dim pLayer As ILayer = pTopoLayer
pLayer.Name = pFeatureClass.AliasName & "_拓扑"
pMap.AddLayer(pLayer)
End If
End Sub