ArcEngine拓扑

空间拓扑描述的是自然界地理对象的空间位置关系-相邻,重合,连通等,是地理对象空间属性的一部分.目前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.   }} 

2).验证拓扑

通过调用ITopology:ValidateTopology 方法来验证指定区域内的拓扑,没有版本的拓扑可以在任何时候验证,指定版本的拓扑必须在编辑会话中验证

例如验证整个区域的拓扑的代码片段,假设已经存在创建好的拓扑ITopology topo

IGeoDataset geodataset=(IGeoDataset) topo; 

topo. ValidateTopology(geodataset. Extent.Envelope); 

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.

时间: 2024-11-07 00:56:27

ArcEngine拓扑的相关文章

ArcEngine的拓扑分析之ITopologicalOperator

先来看看ITopologicalOperator的成员:截图来自帮助文档: 简要介绍下各个成员的汉语翻译: 1.Boundary,边界,获取一个Geometry的边界: 用法: ITopologicalOperator pTopologBoundary = pGeo as ITopologicalOperator; IGeometry pGeometry = pTopologBoundary.Boundary; (1)多边形Polygon的边界获取的是Polyline (2)Polyline获得

arcengine 开发经典帖 【强烈推荐仔细研读】

转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine的产品. 第二部分:ArcEngine9.2的新特性及变化.(续)--类对比及变化.(续)--(代码转换插件).(续)--ArcEngine新命令,工具.菜单和面板 第三部分:使用 ArcGIS Engine开发应用程序(自定义或嵌入) 第四部分:开发Engine 应用程序的基本原理.(续).(续)

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

AE创建拓扑

转自原文 AE创建拓扑 /// <summary> /// 创建拓朴 /// </summary> /// <param name="featureWorkspace">要素集工作空间</param> /// <param name="featuredatasetName"></param> /// <param name="featureClassName">&

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu

hdu1285(拓扑排序)

这道题要求没有输赢关系的两个元素必须按照升序输出,有输赢关系的,赢得在输的前面,所以用队列或者栈来降低时间复杂度的优化过的拓扑排序会出错. 比如这组输入 5 3 1 2 2 3 4 5 至少我写的两种拓扑排序都wa了.但是不用队列或者栈来优化的话, 1.每次都从头至尾扫描一遍,找到一个没标记过的节点, 2.将它标记 3.然后删除从它出来的每条边. 重复这三个操作,加标记的次序,就是题目要的答案. 下面的代码中用到了队列,但只是用来保存答案而已.并没有用它优化的意思. #include <iost

uva 10305 Ordering Tasks(拓扑排序)

拓扑排序,不用判断是否有环,dfs挺简单的 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int visit[105]; int c[105]; int n,m,t; void dfs(int x) { visit[x] = 1; for(int i=1; i<=n; i++) { if(!visit[i]&&map[i][x]==1)