空间拓扑描述的是自然界地理对象的空间位置关系-相邻,重合,连通等,是地理对象空间属性的一部分.目前ESRI提供的数据存储方式中,Coverage和GeoDatabase能够建立拓扑,Shape格式的数据不能建立拓扑.
1. GeoDataBase建立拓扑的基础
1).GeoDatabase实现拓扑的基础是”几何重合”,Geodatabase中的地理对象都是实体存储,主要是根据节点坐标是否重合来判断地理要素之间是否存在某种拓扑关系
2).拓扑只能在要素集(FeatureDataset)中创建,参加创建拓扑的所有要素类(FeatureClass)必须具有相同的空间参考
3).参与拓扑创建的必须是简单要素类,注记类(Annoca),尺寸和几何网络要素类不能参与拓扑的创建
4)单个要素集可以创建多个拓扑
2. GeoDatabase拓扑中的重要概念
1).规则:表达要素之间的空间关系,ESRI提供了27中拓扑关系(见后面附表)
2).拓扑容限.决定在多大范围内要素能够被捕捉在一起(也称为聚类容限(cluster tolerance))
3).拓扑等级 控制在拓扑验证的过程中节点移动的级别.这时候,等级低的要素类将向等级高的要素类移动,最高级别为1,最低级别为-50
4).脏区(dirty area):脏区就是参与拓扑创建时被修改的地理要素(增,删,改)的区域
5).错误要素(Error Feature):只要素类中不符合拓扑规则的要素或者要素的一部分
3. 使用拓扑的详细步骤及代码
1).创建拓扑
ITopology是一个不可创建类,创建拓扑需通过调用ITopologyContainer:CreateTopology方法来建立拓扑,拓扑的规则要用ITopologyRule接口来表达,必须加到ITopologyRuleContainer中.
public void CreateTopology(IFeatureDataset featuredataset, string topologyName,esriTopologyRuleType rulename,double clusterTolerance,int classID)
{
try
{
ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset;
ITopology topology=topologyContainer.CreateTopology(topologyName, clusterTolerance, -1, "");
IFeatureClassContainer featureclassContainer = (IFeatureClassContainer)featureDataset;
ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology;
ITopologyRule topologyRule = new TopologyRuleClass();
topologyRule.TopologyRuleType = rulename;
topologyRule.OriginClassID = classID;
if (topologyRuleContainer.get_CanAddRule(topologyRule))
{
topologyRuleContainer.AddRule(topologyRule);
}
}
catch (COMException ex)
{
MessageBox.Show(ex.Message);
}
}
2).验证拓扑
通过调用ITopology:ValidateTopology 方法来验证指定区域内的拓扑,没有版本的拓扑可以在任何时候验证,指定版本的拓扑必须在编辑会话中验证
例如验证整个区域的拓扑的代码片段,假设已经存在创建好的拓扑ITopology topo
IGeoDataset geodataset=(IGeoDataset) topo;
topo. ValidateTopology(geodataset. Extent.Envelope);
3).编辑拓扑
拓扑编辑的两个重要方面就是:共享点和共享边的编辑
采用的主要接口: ITopologyGraph, ITopologyNode, ITopologyEdge, IDisplayFeedback
ITopologyLayer
以移动共享点为例
一、打开拓扑,建立拓扑图(ITopologyGraph)
//topoLayer 是一个打开的拓扑图层
ITopologyGraph topoGraph =topoLayer.Topology.Cache;
topoGraph.Build(extent,false);//extent是数据集的区域
二、.使用HitTest方法取得要移动的点(ITopologyElement对象)
ITopologyElement node;
topoGraph.HitTest(….,ref node);
如果HitTest方法返回一个True,反之返回一个False
三、使用IMovePointFeedback在鼠标移动时,移动点
四、.鼠标释放时
//获取拓扑图
ITopologyGraph topoGraph =topoLayer.Topology.Cache;
//转换坐标
IPoint point=mapcontrol.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
//获得正在做拓扑编辑的元素
ITopologyNode topoNode=(ITopologyNode)topoElement;//移动的ITopologyElement对象
//实施拓扑编辑
topoGraph.SplitMoveNode(topoNode, poin,false);
//提交拓扑编辑结果
IEnvelope envelope;
topoGraph.Post(out envelope);
4).查询系统中的拓扑
将ITopologyContainer这个接口转换为IFeatureDataset接口,然后查询即可
4. 参考资料
1. 探讨GIS中拓扑实现的原理 刑超等 ESRI中国通讯22期
2. ArcEngine9.0的开发帮助
3. ESRI中国社区
附图-ESRI的拓扑规则
| esriTRTAny | 任何拓扑规则. 查询拓扑的时候用 |
| esriTRTFeatureLargerThanClusterTolerance | 地理要素小于聚类容限被删除 |
| esriTRTAreaNoGaps | 面是封闭的 |
| esriTRTAreaNoOverlap | 面不相交 |
| esriTRTAreaCoveredByAreaClass | The rule is an area covered by area class rule. |
| esriTRTAreaAreaCoverEachOther | 两个区域完全重合 |
| esriTRTAreaCoveredByArea | 一个区域被另一个区域覆盖 |
| esriTRTAreaNoOverlapArea | 一个面没有相交的面 |
| esriTRTLineCoveredByAreaBoundary | 线被区域的边线覆盖 |
| esriTRTPointCoveredByAreaBoundary | 点在面的边界上 |
| esriTRTPointProperlyInsideArea | 点完全在面内 |
| esriTRTLineNoOverlap | 无重合的线 |
| esriTRTLineNoIntersection | 无相交的线 |
| esriTRTLineNoDangles | 无摇摆的线 |
| esriTRTLineNoPseudos | 线不存在伪节点 |
| esriTRTLineCoveredByLineClass | The rule is a line covered by line class rule. |
| esriTRTLineNoOverlapLine | The rule is a line-no overlap line rule. |
| esriTRTPointCoveredByLine | 点被线覆盖 |
| esriTRTPointCoveredByLineEndpoint | 点被线的尾节点覆盖 |
| esriTRTAreaBoundaryCoveredByLine | 一个面的边界被线覆盖 |
| esriTRTAreaBoundaryCoveredByAreaBoundary | 一个面的边界被另一个面的边界覆盖 |
| esriTRTLineNoSelfOverlap | 不存在自重合的线 |
| esriTRTLineNoSelfIntersect | 不存在自相交的线 |
| esriTRTLineNoIntersectOrInteriorTouch | The rule is a line-no intersect or interior touch rule. |
| esriTRTLineEndpointCoveredByPoint | 线的尾节点被点覆盖 |
| esriTRTAreaContainPoint | 面包含点 |
| esriTRTLineNoMultipart | The rule is a line cannot be multipart rule. |
在arcgis中有关topolopy操作,有两个地方,一个是在arccatalog中,一个是在arcmap中。通常我们将在arccatalog中建立拓扑称为建立拓扑规则,而在arcmap中建立拓扑称为拓扑处理。
arccatalog中所提供的创建拓扑规则,主要是用于进行拓扑错误的检查,其中部分规则可以在溶限内对数据进行一些修改调整。建立好拓扑规则后,就可以在arcmap中打开些拓扑规则,根据错误提示进行修改。
arcmap中的topolopy工具条主要功能有对线拓扑(删除重复线、相交线断点等,topolopy中的planarize lines)、根据线拓扑生成面(topolopy中的construct features)、拓扑编辑(如共享边编辑等)、拓扑错误显示(用于显示在arccatalog中创建的拓扑规则错误,topolopy中的error inspector),拓扑错误重新验证(也即刷新错误记录)。
[第二部分]
因为有人问到,补充一点:在arccatalog中创建拓扑规则的具体步骤?
要在arccatalog中创建拓扑规则,必须保证数据为geodatabase格式,且满足要进行拓扑规则检查的要素类在同一要素集下。
因此,首先创建一个新的geodatabase,然后在其下创建一个要素集,然后要创建要素类或将其它数据作为要素类导入到该要素集下。
进入到该要素集下,在窗口右边空白处单击右键,在弹出的右键菜单中有new->topolopy,然后按提示操作,添加一些规则,就完成拓扑规则的检查。
最后在arcmap中打开由拓扑规则产生的文件,利用topolopy工具条中错误记录信息进行修改。
[第三部分][转帖]
有关geodatabase的topology规则,以前在网上有人发表过,现在转帖如下,供大家一起学习参考。
多边形topology
1.must not overlay:单要素类,多边形要素相互不能重叠
2.must not have gaps:单要素类,连续连接的多边形区域中间不能有空白区(非数据区)
3.contains point:多边形+点,多边形要素类的每个要素的边界以内必须包含点层中至少一个点
4.boundary must be covered by:多边形+线,多边形层的边界与线层重叠(线层可以有非重叠的更多要素)
5.must be covered by feature class of:多边形+多边形,第一个多边形层必须被第二个完全覆盖(省与全国的关系)
6.must be covered by:多边形+多边形,第一个多边形层必须把第二个完全覆盖(全国与省的关系)
7.must not overlay with:多边形+多边形,两个多边形层的多边形不能存在一对相互覆盖的要素
8.must cover each other:多边形+多边形,两个多边形的要素必须完全重叠
9.area boundary must be covered by boundary of:多边形+多边形,第一个多边形的各要素必须为第二个的一个或几个多边形完全覆盖
10.must be properly inside polygons:点+多边形,点层的要素必须全部在多边形内
11.must be covered by boundary of:点+多边形,点必须在多边形的边界上
线topology
1.must not have dangle:线,不能有悬挂节点
2.must not have pseudo-node:线,不能有伪节点
3.must not overlay:线,不能有线重合(不同要素间)
4.must not self overlay:线,一个要素不能自覆盖
5.must not intersect:线,不能有线交叉(不同要素间)
6.must not self intersect:线,不能有线自交叉
7.must not intersect or touch interrior:线,不能有相交和重叠
8.must be single part:线,一个线要素只能由一个path组成
9.must not covered with:线+线,两层线不能重叠
10.must be covered by feature class of:线+线,两层线完全重叠
11.endpoint must be covered by:线+点,线层中的终点必须和点层的部分(或全部)点重合
12.must be covered by boundary of:线+多边形,线被多边形边界重叠
13.must be covered by endpoint of:点+线,点被线终点完全重合
14.point must be covered by line:点+线,点都在线上
三、关于arcgis中的拓扑关系
有关topolopy操作有两个:建立拓扑规则及验证 和 拓扑处理(arcinfo ,arcmap)。
一 。 关于建立拓扑规则及验证
∙说明:arccatalog中所提供的创建拓扑规则,主要是用于进行拓扑错误的检查,其中部分规则可以在溶限内对数据进行一些修改调整。建立好拓扑规则后,就可以在arcmap中打开些拓扑规则,根据错误提示进行修改。
∙在arccatalog中创建拓扑规则的具体步骤:要在arccatalog中创建拓扑规则,必须保证数据为geodatabase格式,且满足要进行拓扑规则检查的要素类在同一要素集下。因此,首先创建一个新的geodatabase,然后在其下创建一个要素集,然后要创建要素类或将其它数据作为要素类导入到该要素集下。进入到该要素集下,在窗口右边空白处单击右键,在弹出的右键菜单中有new->topolopy,然后按提示操作,添加一些规则,就完成拓扑规则的检查。最后在arcmap中打开由拓扑规则产生的文件,利用topolopy工具条中错误记录信息进行修改
∙geodatabase的topology规则:
多边形topology
1.must not overlay:单要素类,多边形要素相互不能重叠
2.must not have gaps:单要素类,连续连接的多边形区域中间不能有空白区(非数据区)
3.contains point:多边形+点,多边形要素类的每个要素的边界以内必须包含点层中至少一个点
4.boundary must be covered by:多边形+线,多边形层的边界与线层重叠(线层可以有非重叠的更多要素)
5.must be covered by feature class of:多边形+多边形,第一个多边形层必须被第二个完全覆盖(省与全国的关系)
6.must be covered by:多边形+多边形,第一个多边形层必须把第二个完全覆盖(全国与省的关系)
7.must not overlay with:多边形+多边形,两个多边形层的多边形不能存在一对相互覆盖的要素
8.must cover each other:多边形+多边形,两个多边形的要素必须完全重叠
9.area boundary must be covered by boundary of:多边形+多边形,第一个多边形的各要素必须为第二个的一个或几个多边形完全覆盖
10.must be properly inside polygons:点+多边形,点层的要素必须全部在多边形内
11.must be covered by boundary of:点+多边形,点必须在多边形的边界上
线topology
1.must not have dangle:线,不能有悬挂节点
2.must not have pseudo-node:线,不能有伪节点
3.must not overlay:线,不能有线重合(不同要素间)
4.must not self overlay:线,一个要素不能自覆盖
5.must not intersect:线,不能有线交*(不同要素间)
6.must not self intersect:线,不能有线自交*
7.must not intersect or touch interrior:线,不能有相交和重叠
8.must be single part:线,一个线要素只能由一个path组成
9.must not covered with:线+线,两层线不能重叠
10.must be covered by feature class of:线+线,两层线完全重叠
11.endpoint must be covered by:线+点,线层中的终点必须和点层的部分(或全部)点重合
12.must be covered by boundary of:线+多边形,线被多边形边界重叠
13.must be covered by endpoint of:点+线,点被线终点完全重合
14.point must be covered by line:点+线,点都在线上
∙补充:Geodatabase组织结构
Geodatabases中,将地理数据组织成为数据对象(data objects)。这些数据对象存储于要素类(feature class)、对象类(object class)或要素集(feature datasets)中。
对象类(object class)用于存储非空间信息。
要素类(feature class)则存储了空间信息及其相应的属性信息,在同一个要素类中,空间要素的几何形状必须一致,比如必须都是点、线或者面。简言之,要素类是同类要素的集合。
要素集(feature dataset)用于存放具有同一空间参考(spatial reference)的要素类。存放了简单要素的要素类可以存放于要素集中,也可以作为单个要素类直接存放在Geodatabase的目录下。直接存放在Geodatabase目录下的要素类也称为要素类(standalone feature)。存储拓扑关系的要素类必须存放到要素集中,使用要素集的目的是确保这些要素类具有统一的空间参考,以利于维护拓扑。Geodatabase支持要素类之间的逻辑完整性,体现为对复杂网络(complex networks)、拓扑规则和关联类等的支持。下面描述Geodatabase中的数据对象(data objects)。
要素类(Feature class)
要素类,可称为点、线或面类型要素的集合,同时,地图的文本信息也可用注记(annotation)要素类存储。非要素类,也就是相关联的要素类(如参与拓扑规则或者几何网络的要素类),以要素集的形式管理到一起。
栅格数据集(Raster data set)
以栅格表的形式管理的单或多波段栅格数据。
表(Tables)
描述非空间信息的表。
关联类(Relationships)
关联类是一种机制:从一个表(要素类)中选择记录以后,可以在相关联的表(要素类)中可以获取到相应记录。
域(Domains)
列有效值的一个列表(或范围)。
子类(Subtypes)
将要素类中的要素进行了逻辑分组,每一个分组便是一个子类。每一个这样的都有其完整性规则和GIS行为(如高速公路,是道路要素的一个子集)。
空间关系(Spatial relationships)
在拓扑工具(topologies)或几何网络(Geometric network)中定义。拓扑规则可以指定要素类中的要素之间有何种空间关系,如地块之间不能重叠(overlap),或者多个不同要素类中的要素之间的空间关系,比如国家首都(点要素)必须位于该国家疆土(面要素)上。
元数据(Metadata)
数据库中的每个元素的描述文档。
拓扑处理
arcmap中的topolopy工具条主要功能有对线拓扑(删除重复线、相交线断点等,topolopy中的planarize lines)、根据线拓扑生成面(topolopy中的construct features)、拓扑编辑(如共享边编辑等)、拓扑错误显示(用于显示在arccatalog中创建的拓扑规则错误,topolopy中的error inspector),拓扑错误重新验证(也即刷新错误记录)。
四、区分CLEAN和BUILD命令
在ARC/INFO中可用CLEAN或BUILD命令,通过建立拓扑多边形自动生成面。拓扑结构由ARC或ARCEDIT中的BUILD和CLEAN两条命令自动生成和修改。要注意的是建立拓扑结构前,要认真检查,修改输入数据,使弧段标识码及多边形标识码唯一。BUILD与CLEAN命令定义特征拓扑关系和生成特征属性方面有许多相同的功能,但也有以下几条重要区别:
①、BUILD带POINT参数可生成点特征,而CLEAN不能生成点特征。
②、CLEAN命令对弧段坐标进行分析,决定是否弧,计算新的交点,取消短于(FUZZY)容差的弧段和短于(DANGLE)容差的悬挂弧段。而BUILD命令不作这种调整。
③、BUILD命令不能处理在生成多边形时交叉的线段,而CLEAN可以。对线特征,BUILD命令不相迭交的线段,但仍生成层的AAT表。
④、CLEAN命令总是生成或更新线、点拓扑关系,而BUILD带LINE参数不能。
⑤、如果覆盖层已有一张AAT表格,则BUILD与CLEAN带POLY参数都将重新自动生成一张新的属性表。
⑥、BUILD与CLEAN在生成覆盖特征有时都要产生一个临时文件,该文件是该层所占空间的三到四倍。
鉴于BUILD与CLEAN的区别,在建立拓扑关系时就应考虑选用适合命令:
①、建立点特征拓扑关系选用BUILD命令带POINT参数。
②、仅建立多边形拓扑关系时,覆盖层中的弧段无重叠选用BUILD命令带POLY参数;如果段有重叠或不清楚时选用CLEAN。
③、建立线的拓扑关系时,覆盖层中的弧段无交叉选用BUILD命令带LINE参数;如果弧段有交叉或不清楚时选用CLEAN。 下载本文