Arcengine拓扑分析
Arcgis拓扑规则及应用
Arcgis拓扑规则及应用[第一部分_拓扑规则介绍]拓扑规则有若干专用术语相交(Intersect):线和线交叉,并且只有一点重合,该点不是结点(端点),称之相交。
接触(Touch):某线段的端点和自身或其他线段有重合,称为接触。
悬结点(Dangle Node,Dangle):线段的端点悬空,没有和其他结点连接,这个结点(端点)称为悬结点。
伪结点(Pseudo Node):两个结点相互接触,连接成一个结点,称为伪结点。
拓扑规则的种类可以按点、线、面(多边形)来分。
以下介绍Geodatabase的拓扑规则,点拓扑规则举例点拓扑规则一:Must be covered by boundary of,点必须在多边形边界上。
例如,有一个点要素类代表公共汽车站,另有一个多边形要素类代表地块,按本规则,公共汽车站必须位于地块的边界上。
另一个例子是行政界碑必须落在行政区多边形的边界上。
不满足该规则的点要素被标记为错误。
点拓扑规则二:Must be covered by endpoint of,点要素必须位于线要素的端点上。
例如,阀门为点要素,必须位于线要素类输水管的尽端。
不满足该规则的点要素被标记为错误。
点拓扑规则三:Point must be covered by line,点要素必须在线要素之上。
例如,点要素代表河流上的航标灯,线要素代表河流,航标灯必须位于河流上。
另一个例子是:汽车站(点要素类)必须在道路(线要素类)上。
不满足该规则的点要素被标记为错误。
点拓扑规则四:Must be properly inside polygons,点要素必须在多边形要素内(在边界上不算)。
比如,省行政区为多边形,省会城市为点,省会一定要在该省内。
另一个例子是代表住宅地址的点必须在住宅用地多边形内。
不满足该规则的点要素被标记为错误。
可以看出,点要素本身不能建立拓扑规则,必须和线要素或多边形要素一起才能建立拓扑规则。
修正错误的常用方法是删除或移动错误点(移动也可以理解为删除后立即添加)。
ARCGIS拓扑检查
ARCGIS拓扑检查步骤与修正拓扑错误技巧将数据装载如个人地理数据库,用拓扑功能自动检查数据错误启动ArcCatlalog;任意选择一个本地目录,"右键"->"新建"->"创建个人personal GeoDatabase";选择刚才创建的GeoDatabase,"右键"->"新建"->"数据集dataset";设置数据集的坐标系统,如果不能确定就选择你要进行分析的数据的坐标系统;选择刚才创建的数据集,"右键"->"导入要素类inport --feature class single",导入你要进行拓扑分析的数据;选择刚才创建的数据集,"右键"->"新建"->"拓扑",创建拓扑,根据提示创建拓扑,添加拓扑处理规则;进行拓扑分析。
最后在arcmap中打开由拓扑规则产生的文件,利用topolopy工具条中错误记录信息进行修改将数据集导入ARCMAP中,点击edit按钮进行编辑。
打开eidt下拉菜单,选择more editing tools--topology出现拓扑编辑工具栏。
选择要拓扑的数据,点击打开error inspector按钮。
在error inspector对话框中点击search now,找出所有拓扑的错误。
对线状错误进行Mark as Exception。
对polygon错误逐个检查,首先选择错误的小班,点击右键选择zoom to,然后点击merge,选择合适的图班进行merge处理,这样不会丢失小班信息。
另一个说法:用catalog建一个个人地理数据库,new一个featuredataset把要修改错误的shp文件导入到featuredataset下面然后右键点featuredataset,new一个topoloy数据层,点击下一步,勾选刚才导入的shp 层,下一步,添加拓扑检查规则,这一步很重要,你要显示断线,没接上的线,出头线等,都要选相应的拓扑规则!选完之后,点下一步完成catalog生成一个拓扑检查层文件,用arcmap打开该文件就可以看见你需要显示的错误,这样再用编辑工具修改起来就方便好多。
ARCGIS拓扑检查方法与步骤
拓扑关系式空间分析的基础,拓扑关系的正确性事衡量空间数据质量的关键指标。
下面看一下ArcGIS中的拓扑的概念及拓扑检查的方法。
1.什么是拓扑过去的观点认为,拓扑是一种空间数据结构,旨在保证彼此相关联的数据间能够形成一种一致而清晰简洁的空间结构。
现在的观点认为,拓扑是一组规则和关系的集合,是地理实体行为和属性的实现,是GIS中的一个语义场景;从更专业的角度上来说,拓扑是指规则和关系的集合再加上一系列的工具和技术,旨在揭示地理空间世界中的地理几何关系。
在GIS技术中,我们可以将拓扑理解为一种描述地理空间关系的模型,一种维护地理空间实体间空间几何关系的机制。
而拓扑关系是指地理空间实体间的一种关系,这种关系不会因为地理空间实体的地理空间变换而改变,例如点在面内,经典的举例就是橡皮擦模型。
在GIS中,拓扑的主要功能就是用于保证数据质量,同时也为模拟地理空间现象提供一个模型框架,在这个框架中,地理实体被赋予了行为、有效性规则、属性域以及默认值。
利用这些特征,我们能够通过计算机描述的空间实体真实地模拟现实的地理空间。
2.ArcGIS中拓扑的几个基本概念:族容限tolerance:在ArcGIS中可分为x、y族容限和Z族容限,x、y族容限是指当两个要素顶点被判定为不重合时他们之间的最小水平距离,同一族容限内的顶点被定义为重合并且合并到一起,而Z族容限定义了高程上的最小差异,或则重合的顶点间的最小z值;在族容限范围内的顶点会被捕捉到一起。
脏区Dirty Area:在初始拓扑校验过程以后,已被改变的要素的周围区域,且该要素还需执行额外的拓扑校验来发现错误。
拓扑规则Topology Rule:定义地理数据库中一个给定要素内或两个不同要素类之间所许可的要素关系指令。
3.ArcGIS中拓扑关系创建的方法(1)起动ArcCatlalog →任意选择一个本地目录,"右键"→ "新建"→ "创建个人personal GeoDatabase";(2)选择刚才创建的GeoDatabase,"右键"→ "新建"→ "数据集dataset";设置数据集的坐标系统,如果不能确定就选择你要进行分析的数据的坐标系统; (3)选择刚才创建的数据集,"右键"→ "导入要素类inport → feature class single",导入你要进行拓扑分析的数据;(4)选择刚才创建的数据集,"右键"→ "新建"→ "拓扑",创建拓扑,根据提示创建拓扑,添加拓扑处理规则;3.ArcGIS中拓扑关系的方法(1)将数据集导入ARCMAP中,点击edit按钮进行编辑。
ArcGIS空间数据库中拓扑错误的检查与批量处理方法
ArcGIS空间数据库中拓扑错误的检查与批量处理方法
李江;周浩;罗吴亮
【期刊名称】《北京测绘》
【年(卷),期】2015(0)2
【摘要】随着计算机技术的普及,GIS的应用不断深入于城市规划、交通、房产等领域,提高GIS空间数据库的质量成为一项日益重要的基础工作.本文基于ArcGIS 拓扑接口,利用ArcEngine10.1开发组件包,介绍了对ArcGIS空间数据库进行拓扑错误的检查与批量处理方法,可大幅减少数据修复工作的时间和人力资源.
【总页数】5页(P5-8,4)
【作者】李江;周浩;罗吴亮
【作者单位】南京集艾思软件科技有限公司,江苏南京210009;南京集艾思软件科技有限公司,江苏南京210009;南京集艾思软件科技有限公司,江苏南京210009【正文语种】中文
【中图分类】P208
【相关文献】
1.ArcGIS拓扑检查在地上房屋确权登记中的应用 [J], 韩涛;田峰
2.ArcGIS 10.1地理信息系统软件在国情地表覆盖数据处理中的应用和拓扑检查[J], 黄亮
3.ArcGIS编绘25万区域构造图常见拓扑错误修改方法 [J], 张艺;李苗;丁晓光
4.基于ArcGIS Engine的栅格数据批量处理方法 [J], 张建永;梁春利;石海岗;张春
雷
5.如何利用ArcGIS对面拓扑错误批量修改 [J], 黄思明
因版权原因,仅展示原文概要,查看原文内容请购买。
arcgis培训之八拓扑检查和错误处理
数据:8.拓扑检查和处理\面的相同检查.mdb\DS
中科地信出品 闫磊编写
2.3拓扑容差
拓扑容差是拓扑错误关键因素,不同容 差,错误个数也不一样,甚至在指定容差 下有拓扑错误,如0.001,而容差为0.005, 就没有了。 拓扑容差大小与数据要素有关,一般和 数据自身的精度一致,如0.001m,就可以了
中科地信出品
闫磊编写
两个线层是否相同检查和不同
数据:8.拓扑检查和处理\检查线相同和不同.gdb\d
中科地信出品 闫磊编写
2.2.5两个图层之间拓扑 面面之间
中科地信出品
闫磊编写
两个面层相同和不同检查
中科地信出品
闫磊编写
4.2拓扑错误处理
①重叠(线、面) 不能重叠 ②悬挂(线) ③伪节点 ④省边界和县的边界不重合
中科地信出品
闫磊编写
重叠线
① 完全重叠的话,1)选中其中一条删除 2) 选中重叠几条, 使用打断相交线处理,重叠只保留一个 ② 部分重叠,1)在错误上右键,选择去除重复部分2)选中 较短一条删除, 3) 选中重叠几条,使用打断相交线处 理后,自动分段,后再合并 打断相交线还可以处理交叉线,在交叉点自动打断,八字图 交叉也可以,面的交叉使用
中科地信出品
闫磊编写
三.拓扑建立和拓扑检查-内容
1、建拓扑 是ArcCatalog中, 2、拓扑检查:可以在ArcCatalog,或ArcMap中,拓扑 错误处理是在ArcMap。 3、拓扑检查实际会改变数据,不仅仅是拓扑检查。一 定要备份数据, 级别(Rank)(高级) 在拓扑验证的过程中,有自动捕捉的过程,要素会移 动。在ArcGIS拓扑关系中每一个要素类是根据Rank值 的大小来控制移动程度的。Rank等级越高的要素移动 程度越小。ArcGIS10提供的Rank范围在(1-50), Rank值等于1的为最高等级。只有两个图层时才有效
ArcEngine教程-第7章--矢量数据空间分析
① 添加缓冲区分析操作工具; ② 在其OnMouseDown方法中执行点击查询要素操作; ③ 将查询结果要素通过ITopologicalOperator. Buffer方法进行缓冲区生成操 作; ④ 将缓冲区生成结果利用空间要素渲染方式展示到地图上。
1. 空间拓扑分析
• 其程序设计具体步骤为:
① 向工程项目中添加继承自BaseTool类的文件,该类实现了BaseCommand 基础类和ITool接口的所有方法; ② 添加ToolBufferAnalysis 类中的OnClick方法的实现代码,用以判定是否符 合缓冲区操作的前提条件(地图中是否加载图层),并修改鼠标样式; ③ 添加ToolBufferAnalysis 类的OnMouseDown方法的实现,生成缓冲区并 将生成的缓冲区要素添加到地图中;
2. 空间关系运算
• 实例详解-查找一多边形要素的所有邻接要素
• 本例通过在地图上点击选择任意一个多边形,系统自动获取与该 多边形要素相邻接的其它多边形并显示到地图上。
核心代码
3. 叠加分析
• 叠加分析(也称叠置分析)是将同一区域,相同参考系统、相同 比例尺的两个或多个数据进行叠加产生一个新数据层的操作,其 结果综合了原来两层或多层要素所具有的属性信息,并且还能从 已有的数据中提取空间隐含的信息。 • 相关类与接口(IBasicGeoprocessor接口)
ArcEngine实现空间拓扑空间关联空间距离运算-推荐下载
Simplify SymmetricDifference Union
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术0艺料不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试22下卷,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看2度并22工且22作尽22下可22都能2可地护1以缩关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编5试要写、卷求重电保技要气护术设设装交备备4置底高调、动。中试电作管资高气,线料中课并3敷试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
ArcEngine接口详细说明
ArcEngine接口详细说明ARCENGINE接口详细说明目录ARCGIS接口详细说明 (1)1.IField接口(esriGeoDatabase) (2)2.IFieldEdit接口(esriGeoDatabase) (2)3.IFields接口(esriGeoDatabase) (2)4. IRow接口(esriGeoDatabase) (3)5. ITable接口(esriGeoDatabase) (3)6. IArea接口(esriGeometry) (4)7. IEnvelope接口(esriGeometry) (4)8. IPoint接口(esriGeometry) (5)9. IPointArray接口(esriGeometry) (5)10. IPointCollection接口(esriGeometry) (6)11. IPolyline接口(esriGeometry) (6)12. IGeometry接口(esriGeometry) (6)13. IFeature接口(esriGeoDatabase) (7)14. IFeatureLayer接口(esriCarto) (8)15. IFeatureClass接口(esriGeoDatabase) (8)16. IFeatureCursor接口(esriGeoDatabase) (18)17. ISpatialFilter接口(esriGeoDatabase) (19)18. IQueryFilter接口(esriGeoDatabase) (21)19. IFeatureSelection接口(esriCarto) (21)20. IMap接口(esriCarto) (21)21. IPropertySet接口(esriSystem) (22)22. IFeatureWorkspace接口(esriGeoDatabase) (22)23. IWorkspaceEdit接口(esriGeoDatabase) (25)24. IWorkspaceFactory接口(esriGeoDatabase) (25)25. ITopologicalOperator接口(esriGeometry) (31)1.IField接口(esriGeoDatabase)IField接口的第一个属性AliasName(只读,获得字段的别名)IField接口的第二个方法CheckValue(Value)(方法,对于指定的属性字段,基于字段类型判断参数值是否有效,有效,则返回True,否则返回False)例子代码:IFeatureClass pFC_SCP_PT;editPT = new FieldClass();editPT.Precision_2 = 8;editPT.Scale_2 = 3;/doc/dc10163898.html,_2 = "ELEV1";editPT.Type_2 = esriFieldType.esriFieldTypeDouble;IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称)2.IFieldEdit接口(esriGeoDatabase)所有该接口的属性均为可读可写,经常用与对新建字段的设置,因为字段一旦被设置,其基本属性就不能被更改,所以就需要该接口类型的变量去转换,方法为:IFeatureClass pFC_SCP_PT;IFieldEdit editPT = new FieldClass();pFC_SCP_PT.AddField((IField)editPT);如果在vb中去编写代码,则赋值和获取均为同一属性,而在C#中,为了区分设置和获取,属性均有两个,类似于Name和Name_2,这样就可以区分了,普遍用设置的带有_2的那个属性。
基于ArcEngine的地籍要素空间拓扑关系判定与实现
空洞 HA
[8]
体间的拓扑关系定义,可以将带岛宗 地块拆分为外部多边形和内部多边 形,再分别定义其与简单实体间的拓 扑关系。
A
带岛宗 A
总区域 A*
图 2 带岛宗 A 及其总区域 A*与空洞 HA
若将带岛宗 A 拆分为外多边形和内多边形,则总区域 A*可以用 A 的外多边形表示,空洞 H 以转换为两个简单地块与简单地籍实体间的拓扑关系定义。
地籍空间要素查询主界面测绘通报测绘科学前沿技术论坛论文集四结束语基于ae交模型相结合的方法设计界址点界址点界址点界址线界址点地块界址线界址线界址线地块地块地块间的空间拓扑关系判定算法同时研究基于目标分解交模型相结合的复杂地籍实体间的拓扑关系判定算法这些算法不但能对正确的地籍空间数据进行拓扑关系判定对于有质量问题的地籍空间数据间的拓扑关系也能进一步区分是地籍空间数据质量检查的基础
A P2 P1 P4B P3
界址线与界址线的拓扑关系是通过将两个界址线实体 分解为边界和内部,再根据这些构造实体与另一个实体间 的拓扑关系(如相交、相离、相接、包含等)来判断其 9 交模型矩阵值,如图 4 所示,P1、P2 和 P3、P4 分别为 A 和 B 的边界,内部则为线的内部。
图 4 线与线拓扑关系判定实例
《测绘通报》测绘科学前沿技术论坛论文集
3
如表 1 所示,在 AE 中不能区分的空间拓扑关系能利用 9 交模型进一步区分,并且每种拓扑 关系都不一样。 表 1 界址线间的拓扑关系判定
图例
AE 拓扑关系判定结果 Disjoint 相离 Touches 相接 Touches 相接 Contains 包含 Contains 包含 Touches 相交 Touches 相交 Touches 相交 Touches 相交 Touches 相交 Touches 相交
拓扑一致性检查
基于ArcEngine的土地资源数据拓扑一致性质量检查
根据GB/T 13989-1992 国家基本比例尺地形图分幅和编号、GB/T 21336-2008/ISO 19114:2003 地理信息质量评价过程和GB/T 21337-2008/ISO19113:2002 地理信息质量原则,完成对土地资源数据的拓扑一致性检验。
在第二次全国土地调查的农村土地利用数据库中,点状要素主要包括控制点、高程注记点和零星地物; 线状要素主要包括等高线、行政界线、线状河流及沟渠、线状道路和地类界线; 面状要素主要包括行政区、地类图斑和基本农田。
拓扑一致性,检验点、线、面拓扑的关系,是否按规定建立拓扑关系,建立的拓扑关系是否正确,如线状实体相交建立结点、多边形封闭、不存在多余标识点、悬挂节点、坐标点重叠、线和弧段自相交等现象;不同图层间的共用界线保持唯一,有向线状实体的方向正确等。
数据检查方法包括计算机自动检查、人工检查。
以拓扑一致性检查为基础,将接边检查、涉及高程的DEM检查和属性检查等做为拓展内容,根据完成进度适当增加系统的内容。
根据《土地利用总体规划数据质量检查细则》,拓扑一致性检查内容如下:。
ArcEngine实现空间拓扑空间关联空间距离运算
【051】◀▶ ArcEngine实现空间分析1.熟悉ITopologicalOperator 接口(用于空间拓扑运算)的使用2.熟悉IRelationalOperator 接口(用于空间关联运算)的使用3.熟悉IProximityOperator 接口(用于空间距离运算)的使用●·● 目录:A1 ………… ITopologicalOperator5 接口∙公共方法:∙Buffer 方法:∙Boundary 方法:∙Clip 方法:∙ConvexHull 方法:∙Cut 方法:∙Union 方法:∙Intersect 方法:∙Difference 方法:A2 ………… IRelationalOperator 接口∙公共方法:∙Contains 方法:∙Overlaps 方法:A3 ………… IPoint 接口A4 ………… ICurve3 接口A5 ………… ISegment 接口A6 ………… ICircularArc 接口---------------------------------------------------------------------------------------------------------写在前面:使用空间分析的时候,会提示这样的错误“异常来自HRESULT:0x80040215”,其原因就是:在使用 ITopologicalOperator求交集等操作的时候,有时会出现“ HRESULT:0x80040215”这个异常,原来是空间参考不一样所致。
因此只要SpatialReference属性设为同一空间参考就不会出现“ HRESULT:0x80040215”异常。
所以在进行空间分析之前,要保证所建立的shapefile文件具有相同的SpatialReference!---------------------------------------------------------------------------------------------------------╔════════╗╠════╣第A1个╠══════════════════════════════════════════════════╣╚════════╝●·● ITopologicalOperator5 接口:1. Provides additional information on non-simple geometries.【拓扑操作】MembersCoClasses that implement ITopologicalOperator※| ※→公共代码部分://公共变量!~IMap pMap;IActiveView pActiveView;IEnvelope pEnv;ISelectionEnvironment pSelectionEnv;IEnumFeature pEnumFeature;IGraphicsContainer pGraphicsContainer;IFeature pFeature;IGeometry pGeometry;IEnvelope pEnvClip;IPolyline pLineCut;IPolygon pFirstPolygon;//鼠标点击事件!~private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;if (isClip) //此时要拉Clip框{pEnvClip = axMapControl1.TrackRectangle();isClip = false;}else if (isCut){pLineCut = axMapControl1.TrackLine() as IPolyline;isCut = false;}else if (isFirstIn){pMap = axMapControl1.Map;pActiveView = pMap as IActiveView;pEnv = axMapControl1.TrackRectangle();pSelectionEnv = new SelectionEnvironment();pSelectionEnv.DefaultColor = GetColor(0, 255, 0);pMap.SelectByShape(pEnv, pSelectionEnv, false);pActiveView.Refresh();pEnumFeature = axMapControl1.Map.FeatureSelection as IEnumFeature; }else{pMap = axMapControl1.Map;pActiveView = pMap as IActiveView;pEnv = axMapControl1.TrackRectangle();pSelectionEnv = new SelectionEnvironment();pSelectionEnv.DefaultColor = GetColor(255, 0, 0);pMap.SelectByShape(pEnv, pSelectionEnv, false);pActiveView.Refresh();pEnumFeature = axMapControl1.Map.FeatureSelection as IEnumFeature; }}//RGB颜色!~private IRgbColor GetColor(int r, int g, int b){IRgbColor pColor = new RgbColor();pColor.Red = r;pColor.Green = g;pColor.Blue = b;return pColor;}※| ※→Buffer:private void button1_Click(object sender, EventArgs e){while (true){pGraphicsContainer = pMap as IGraphicsContainer; //定义容器pFeature = pEnumFeature.Next(); //遍历要素if (pFeature == null) //若不存在要素,则推出循环break;pGeometry = pFeature.Shape; //获取要素的GeometryITopologicalOperator pTopoOperator = pGeometry as ITopologicalOperator; //QI到拓扑操作IGeometry pBufferGeo = pTopoOperator.Buffer(2); //缓冲区分析IElement pElement = new PolygonElement();pElement.Geometry = pBufferGeo; //获取得到的缓冲区pGraphicsContainer.AddElement(pElement, 0); //显示缓冲区pActiveView.Refresh();}}※| ※→Boundary:private void button2_Click(object sender, EventArgs e){while (true){pGraphicsContainer = pMap as IGraphicsContainer; //定义容器pFeature = pEnumFeature.Next(); //遍历要素if (pFeature == null) //若不存在要素,则推出循环break;pGeometry = pFeature.Shape; //获取要素的GeometryITopologicalOperator pTopoOperator = pGeometry as ITopologicalOperator; //QI到拓扑操作IGeometry pBoundary = pTopoOperator.Boundary; //获取边界ILineElement pLineEle = new LineElementClass();ISimpleLineSymbol pSLS = new SimpleLineSymbol();IRgbColor pColor = GetColor(0, 255, 0);pSLS.Color = pColor;pSLS.Width = 5;pLineEle.Symbol = pSLS;IElement pElement = pLineEle as IElement;pElement.Geometry = pBoundary;pGraphicsContainer.AddElement(pElement, 0); //显示边界 pActiveView.Refresh();}}※| ※→Clip:bool isClip = false;private void button3_Click(object sender, EventArgs e){isClip = true;}private void button4_Click(object sender, EventArgs e){while (true){pGraphicsContainer = pMap as IGraphicsContainer; //定义容器pFeature = pEnumFeature.Next(); //遍历要素if (pFeature == null) //若不存在要素,则推出循环break;pGeometry = pFeature.Shape; //获取要素的GeometryITopologicalOperator pTopoOperator = pGeometry as ITopologicalOperator; //QI到拓扑操作pTopoOperator.Clip(pEnvClip);IElement pElement = new PolygonElement();pElement.Geometry = pGeometry; //获取得到的缓冲区pGraphicsContainer.AddElement(pElement, 0); //显示缓冲区pActiveView.Refresh();}}※| ※→ConvexHull:private void button5_Click(object sender, EventArgs e){while (true){pGraphicsContainer = pMap as IGraphicsContainer; //定义容器pFeature = pEnumFeature.Next(); //遍历要素if (pFeature == null) //若不存在要素,则推出循环break;pGeometry = pFeature.Shape; //获取要素的GeometryITopologicalOperator pTopoOperator = pGeometry as ITopologicalOperator; //QI到拓扑操作IGeometry pBufferGeo = pTopoOperator.ConvexHull();IElement pElement = new PolygonElement();pElement.Geometry = pBufferGeo; //获取得到的缓冲区pGraphicsContainer.AddElement(pElement, 0); //显示缓冲区pActiveView.Refresh();}}※| ※→Cut:bool isCut = false;private void button6_Click(object sender, EventArgs e){isCut = true;}private void button7_Click(object sender, EventArgs e){while (true){pGraphicsContainer = pMap as IGraphicsContainer; //定义容器pFeature = pEnumFeature.Next(); //遍历要素if (pFeature == null) //若不存在要素,则推出循环break;pGeometry = pFeature.Shape; //获取要素的GeometryITopologicalOperator pTopoOperator = pGeometry as ITopologicalOperator; //QI到拓扑操作ryIGeometry pGeoRight = new PolygonClass();IGeometry pGeoLeft = new PolygonClass();pTopoOperator.Cut(pLineCut, out pGeoLeft, out pGeoRight);IElement pElement = new PolygonElement();IFillShapeElement pFillEle = pElement as IFillShapeElement; ISimpleFillSymbol pSFS = new SimpleFillSymbol();pSFS.Color = GetColor(255, 255, 0);pFillEle.Symbol = pSFS;pElement.Geometry = pGeoLeft; //获取得到的缓冲区pGraphicsContainer.AddElement(pElement, 0); //显示缓冲区pSFS = new SimpleFillSymbol();pSFS.Color = GetColor(255, 0, 255);pFillEle.Symbol = pSFS;pElement = new PolygonElement();pElement.Geometry = pGeoRight; //获取得到的缓冲区pGraphicsContainer.AddElement(pElement, 0); //显示缓冲区pActiveView.Refresh();}}※| ※→Union:private void button8_Click(object sender, EventArgs e){IGeometry pUnionGeo = new PolygonClass();pGraphicsContainer = pMap as IGraphicsContainer; //定义容器while (true){pFeature = pEnumFeature.Next(); //遍历要素if (pFeature == null) //若不存在要素,则推出循环break;pGeometry = pFeature.Shape; //获取要素的GeometryITopologicalOperator pTopoOperator = pUnionGeo as ITopologicalOperator; //QI到拓扑操作rypUnionGeo = pTopoOperator.Union(pGeometry);}IElement pElement = new PolygonElement();IFillShapeElement pFillEle = pElement as IFillShapeElement;ISimpleFillSymbol pSFS = new SimpleFillSymbol();pSFS.Color = GetColor(255, 255, 0);pFillEle.Symbol = pSFS;pElement.Geometry = pUnionGeo; //获取得到的缓冲区pGraphicsContainer.AddElement(pElement, 0); //显示缓冲区pActiveView.Refresh();}※| ※→Intersect:bool isFirstIn = false;private void button10_Click(object sender, EventArgs e){isFirstIn = true;}private void button11_Click(object sender, EventArgs e){isFirstIn = false;pFirstPolygon = new PolygonClass();while (true){pFeature = pEnumFeature.Next();if (pFeature == null)break;pGeometry = pFeature.Shape;ITopologicalOperator pTopoOperator = pFirstPolygon as ITopologicalOperator;pFirstPolygon = pTopoOperator.Union(pGeometry) as IPolygon; }}private void button12_Click(object sender, EventArgs e){IGeometry pIntersectGeo = new PolygonClass();IGeometry pSecondPolygon = new PolygonClass();pGraphicsContainer = pMap as IGraphicsContainer;while (true){pFeature = pEnumFeature.Next();if (pFeature == null)break;pGeometry = pFeature.Shape;ITopologicalOperator pTopoOperator = pSecondPolygon as ITopologicalOperator;pSecondPolygon = pTopoOperator.Union(pGeometry) as IPolygon;}ITopologicalOperator pTopo = pSecondPolygon as ITopologicalOperator; pIntersectGeo = pTopo.Intersect(pFirstPolygon,esriGeometryDimension.esriGeometry2Dimension) as IPolygon;IElement pElement = new PolygonElementClass();pElement.Geometry = pIntersectGeo;pGraphicsContainer.AddElement(pElement, 0);IFeatureLayer pFeatureLayer = pMap.get_Layer(0) as IFeatureLayer;pFeatureLayer.Visible = false;pFeatureLayer = pMap.get_Layer(1) as IFeatureLayer;pFeatureLayer.Visible = false;pActiveView.Refresh();}※| ※→Difference:(需要前面两部分)private void button13_Click(object sender, EventArgs e){IGeometry pIntersectGeo = new PolygonClass();IGeometry pSecondPolygon = new PolygonClass();pGraphicsContainer = pMap as IGraphicsContainer;while (true){pFeature = pEnumFeature.Next();if (pFeature == null)break;pGeometry = pFeature.Shape;ITopologicalOperator pTopoOperator = pSecondPolygon as ITopologicalOperator;pSecondPolygon = pTopoOperator.Union(pGeometry) as IPolygon;}ITopologicalOperator pTopo = pSecondPolygon as ITopologicalOperator; pIntersectGeo = pTopo.Difference(pFirstPolygon) as IPolygon;IElement pElement = new PolygonElementClass();pElement.Geometry = pIntersectGeo;pGraphicsContainer.AddElement(pElement, 0);IFeatureLayer pFeatureLayer = pMap.get_Layer(0) as IFeatureLayer;pFeatureLayer.Visible = false;pFeatureLayer = pMap.get_Layer(1) as IFeatureLayer;pFeatureLayer.Visible = false;pActiveView.Refresh();}---------------------------------------------------------------------------------------------------------╔════════╗╠════╣第A2个╠══════════════════════════════════════════════════╣╚════════╝●·● IRelationalOperator 接口:1. Provides access to members that determine if a certain spatial relationship exists between two geometries.MembersCoClasses that implement IRelationalOperator※| ※→公共代码部分:IMap pMap;IActiveView pActiveView;IEnvelope pEnv;ISelectionEnvironment pSelectionEnv;IEnumFeature pEnumFeature;IFeature pFeature;IGeometry pGeometry;IGeometry pBasicGeo;private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;pMap = axMapControl1.Map;pActiveView = pMap as IActiveView;pEnv = axMapControl1.TrackRectangle();pSelectionEnv = new SelectionEnvironment();pSelectionEnv.DefaultColor = GetColor(255, 0, 0);pMap.SelectByShape(pEnv, pSelectionEnv, false);pActiveView.Refresh();pEnumFeature = pMap.FeatureSelection as IEnumFeature;}private IRgbColor GetColor(int r, int g, int b){IRgbColor pColor = new RgbColor();pColor.Red = r;pColor.Green = g;pColor.Blue = b;return pColor;}private IGeometry GetBasicGeometry(){IFeatureLayer pFeatureLayer = axMapControl1.Map.get_Layer(1) as IFeatureLayer;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);IFeature pF = pFeatureCursor.NextFeature();IGeometry pUnionGeo = new PolygonClass();pUnionGeo = pF.Shape;while(pF != null){ITopologicalOperator pUnionTopo = pUnionGeo as ITopologicalOperator; pUnionGeo = pUnionTopo.Union(pF.Shape);pF = pFeatureCursor.NextFeature();}return pUnionGeo;}private void Form1_Load(object sender, EventArgs e){(axMapControl1.get_Layer(1) as IFeatureLayer).Selectable = false;}※| ※→Contains:private void button5_Click(object sender, EventArgs e){pBasicGeo = GetBasicGeometry();pGeometry = new PolygonClass();while (true){pFeature = pEnumFeature.Next();if (pFeature == null)break;ITopologicalOperator pTopo = pGeometry as ITopologicalOperator; pGeometry = pTopo.Union(pFeature.Shape);}IRelationalOperator pRO = pBasicGeo as IRelationalOperator;bool IsContains = pRO.Contains(pGeometry);if (IsContains){MessageBox.Show("Basic图层数据包含选中数据!");}else{MessageBox.Show("Basic图层数据不包含选中数据!");}}※| ※→Overlaps:private void button2_Click(object sender, EventArgs e){pBasicGeo = GetBasicGeometry();pGeometry = new PolygonClass();while (true){pFeature = pEnumFeature.Next();if (pFeature == null)break;ITopologicalOperator pTopo = pGeometry as ITopologicalOperator; pGeometry = pTopo.Union(pFeature.Shape);}IRelationalOperator pRO = pGeometry as IRelationalOperator;bool IsContains = pRO.Overlaps(pBasicGeo);if (IsContains){MessageBox.Show("选中数据重叠 Basic图层数据!");}else{MessageBox.Show("选中数据不重叠 Basic图层数据!"); }}。
ARCGIS拓扑检查
ARCGIS拓扑检查步骤与修正拓扑错误技巧将数据装载如个人地理数据库,用拓扑功能自动检查数据错误启动ArcCatlalog;任意选择一个本地目录,"右键"->"新建"->"创建个人personal GeoDatabase";选择刚才创建的GeoDatabase,"右键"->"新建"->"数据集dataset";设置数据集的坐标系统,如果不能确定就选择你要进行分析的数据的坐标系统;选择刚才创建的数据集,"右键"->"导入要素类inport --feature class single",导入你要进行拓扑分析的数据;选择刚才创建的数据集,"右键"->"新建"->"拓扑",创建拓扑,根据提示创建拓扑,添加拓扑处理规则;进行拓扑分析。
最后在arcmap中打开由拓扑规则产生的文件,利用topolopy工具条中错误记录信息进行修改将数据集导入ARCMAP中,点击edit按钮进行编辑。
打开eidt下拉菜单,选择more editing tools--topology出现拓扑编辑工具栏。
选择要拓扑的数据,点击打开error inspector按钮。
在error inspector对话框中点击search now,找出所有拓扑的错误。
对线状错误进行Mark as Exception。
对polygon错误逐个检查,首先选择错误的小班,点击右键选择zoom to,然后点击merge,选择合适的图班进行merge处理,这样不会丢失小班信息。
另一个说法:用catalog建一个个人地理数据库,new一个featuredataset把要修改错误的shp文件导入到featuredataset下面然后右键点featuredataset,new一个topoloy数据层,点击下一步,勾选刚才导入的shp 层,下一步,添加拓扑检查规则,这一步很重要,你要显示断线,没接上的线,出头线等,都要选相应的拓扑规则!选完之后,点下一步完成catalog生成一个拓扑检查层文件,用arcmap打开该文件就可以看见你需要显示的错误,这样再用编辑工具修改起来就方便好多。
ArcEngine中拓扑的使用
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,最低级别为-504).脏区(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 topoIGeoDataset geodataset=(IGeoDataset) topo;topo. ValidateTopology(geodataset. Extent.Envelope);3).编辑拓扑拓扑编辑的两个重要方面就是:共享点和共享边的编辑采用的主要接口: ITopologyGraph, ITopologyNode, ITopologyEdge, IDisplayFeedbackITopologyLayer以移动共享点为例一、打开拓扑,建立拓扑图(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接口,然后查询即可。
基于ArcEngine的管线碰撞分析算法设计与实现
基于ArcEngine的管线碰撞分析算法设计与实现廉光伟;寇付友;翟林;赵虎川【摘要】地下管线作为城市的生命线,随着城市的建设变得越来越重要。
庞大复杂的现状地下管线为新的管线铺设带来了困难,在管线设计阶段解决管线碰撞问题急需解决,针对这一问题,提出了管线碰撞分析算法。
首先介绍了管线碰撞分析算法的研究现状,然后阐述了几何形状下管线出现碰撞的可能情况,并给出了相应的算法设计,最后基于ArcEngine开发环境进行了算法的程序实现,并进行了结果验证和实际应用。
%As the lifeline of the city ,pipeline becomes more and more important .Complex situation of underground pipeline brings difficulty for the new pipeline .During the stage of pipeline design ,it is necessary to solve the collision problem.In order to solve thisproblem ,propose algorithm of pipeline collision analysis .First,introduces the current re-search on algorithm analysis pipeline collision .Then describes the possible collision geometry pipeline ,and gives corre-sponding solving algorithms ,Finaly,implement the algorithm based on the ArcEngine development environment ,verify the results of the algorithm and make practical application .【期刊名称】《城市勘测》【年(卷),期】2014(000)006【总页数】4页(P96-99)【关键词】管线碰撞;算法设计;ArcEngine;程序实现【作者】廉光伟;寇付友;翟林;赵虎川【作者单位】天津市测绘院,天津 300381;天津市测绘院,天津 300381;天津市测绘院,天津 300381;天津市测绘院,天津 300381【正文语种】中文【中图分类】P209随着城市的现代化进程不断加快,城市地下管网变得越来越复杂,与人们的生活也越来越密切,由于深埋于地下,且种类繁多,规模庞大,再加上经常施工引发的变动、记载资料不全等原因,城市地下管线具有隐蔽性、复杂性和多变性等特性,使得设计新的地下管线和维护现有管线比较困难。
]ARCGIS常见拓扑错误的修改方法
]ARCGIS常见拓扑错误的修改方法一、先看看在ArcInfo里面的拓扑的实现:其中在ArcGIS 8以后,Geodatabase成为一种全新的空间数据模型。
它采用一种开放的结构将空间数据(包括:矢量、栅格、影像、三维地形等)及其相关的属性数据统一存放在工业标准的数据库管理系统DBMS中。
空间要素类(Feature Class),如:河流、国界、宗地、电杆等,对应了DBMS中的表,而具体的一个要素(Feature)则是表中的一条记录。
具有共同空间参考的一组空间要素类又可以组成更大的结构,称为要素数据集合(Feature Data Set)。
除了空间要素类以外,Geodatabase中还可以建立关系类、几何网络、定义要素子类型、值域及规则等。
所有的要素类均可以借助通用的CASE工具(如:Visio、Rational Rose等)进行模型定义和扩展。
Geodatabase引入了拓扑关系规则。
拓扑关系规则可作用于同一要素数据集中的不同要素类或者同一要素类中的不同要素。
用户可以指定空间数据必须满足的拓扑关系约束,譬如:要素之间的相邻关系、连接关系、覆盖关系、相交关系、重叠关系等。
所有这些关系都对应相应的规则。
比如在土地调查规划应用中,两个相邻的地块之间不能有"飞地",我们可以有一条对应的规则:"相邻多边形间不能存在间隙"。
再如,当以河流作为国界、省界、或者任何边界时,河流(线状)与界线必须一致,可用规则:"线必须被多边形边线覆盖"。
用户通过选择若干规则的组合构成对空间数据必须满足的拓扑关系的灵活指定。
为了检查和维护空间数据的拓扑关系正确性,在ArcGIS Desktop中给出了一组(编辑)工具,用于对空间数据根据用户指定的拓扑关系规则进行编辑,并帮助用户及时发现可能存在的拓扑关系错误。
Geodatabase中并不实际保存拓扑关系。
不同要素类之间的公共点、公共边等要素是在拓扑编辑过程中动态地检测到的。
ArcGIS_Engine—空间分析
ArcGIS_Engine—空间分析ArcGIS Engine——空间分析空间分析功能是GIS的主要功能之⼀,本章将为读者介绍⼀些GIS开发常⽤的功能涉及到的空间拓扑运算,空间关系运算,空间临近运算所使⽤到的接⼝。
例如开发⼀个缓冲区分析功能,获取两个⼏何要素的最短距离,判断两个⼏何要素的拓扑关系等都需要使⽤到这些接⼝,使⽤这些接⼝可以极⼤提⾼开发者的开发效率。
1.1⽬标1.熟悉ITopologicalOperator接⼝(⽤于空间拓扑运算)的使⽤2.熟悉IRelationalOperator接⼝(⽤于空间拓扑运算)的使⽤3.熟悉IProximityOperator接⼝(⽤于空间拓扑运算)的使⽤1.1 ITopologicalOperator接⼝ 1.1.1 ITopologicalOperator接⼝简介ITopologicalOperator接⼝⽤来通过对已存在的⼏何对象做空间拓扑运算以产⽣新的结合对象。
实现该接⼝的类有Point,Multipoint,Polyline,Polygon,MultiPatch这些都是⾼级⼏何对象,另外GeometryBag也实现了该接⼝,低级的构建⼏何对象如Segments(Line,Circular Arc,Elliptic Arc,Bezier Curve),Paths或者Rings如果想使⽤该接⼝需包装成⾼级⼏何对象。
ITopologicalOperator接⼝在GIS开发中使⽤⾮常⼴泛,通常GIS系统中缓冲区分析,裁剪⼏何图形,⼏何图形差分操作,⼏何图形合并操作等都需要使⽤此接⼝。
下表是ITopologicalOperator接⼝主要的⽅法说明:⽅法名称说明Boundary⼏何图形对象的边界Buffer对⼏何图形对象进⾏缓冲区空间拓扑操作Clip对⼏何图形对象进⾏裁剪空间拓扑操作ConstructUnion ⾼效的合并多个枚举⼏何对象与单个⼏何对象合并为单个⼏何对象,这对于⼤量⼏何对象的合并⾮常⾼效ConvexHull构建⼏何对象的凸边形Cut切割⼏何对象Difference ⼀个⼏何图形减去它与另⼀个⼏何图形相交的部分Intersect两个同维度⼏何对象的交集部分Simplify使⼏何对象拓扑⼀致SymmetricDifference 对称差分将两个⼏何图形的并集部分减去两个⼏何图形交集的部分Union合并两个同维度的⼏何对象为单个⼏何对象1. Boundary属性如图所⽰Polygon⼏何对象的Boundary是组成它的Polyline⼏何对象Polyline⼏何对象的[Boundary是组成它的顶点Point⼏何对象⽽Point⼏何对象的Boundary是空对象,⽰意图如下图所⽰:2.Buffer⽅法:Buffer⽅法可以给⼀个⾼级⼏何对象产⽣⼀个缓冲区,⽆论是Polygon,Polyline,Point它们的缓冲区都是具有⾯积的⼏何对象,如下图所⽰:3.Clip⽅法Clip⽅法可以将⽤⼀个Envelope对象对⼀个⼏何对象进⾏裁剪,参见结果是⼏何对象被Envelope 对象所包围的部分如图所⽰:4.ConvexHull⽅法ConvexHull⽅法可以产⽣⼀个⼏何图形的最⼩的边框凸多边形(没有凹⾯包含⼏何图形的最⼩多边形)5.Cut⽅法Cut⽅法不⽀持GeometryBags⼏何对象,它可以指定⼀条切割曲线和⼀个⼏何图形,经过切割运算后把⼏何图形分为左右两部分,做,右两部分是相对曲线的⽅向⽽⾔。
ArcGIS空间数据库中拓扑错误的检查与批量处理方法
ArcGIS空间数据库中拓扑错误的检查与批量处理方法李江;周浩;罗吴亮【摘要】随着计算机技术的普及,GIS的应用不断深入于城市规划、交通、房产等领域,提高GIS空间数据库的质量成为一项日益重要的基础工作.本文基于ArcGIS 拓扑接口,利用ArcEngine10.1开发组件包,介绍了对ArcGIS空间数据库进行拓扑错误的检查与批量处理方法,可大幅减少数据修复工作的时间和人力资源.【期刊名称】《北京测绘》【年(卷),期】2015(000)002【总页数】5页(P5-8,4)【关键词】ArcGIS;拓扑接口;空间数据库;拓扑错误;批量处理【作者】李江;周浩;罗吴亮【作者单位】南京集艾思软件科技有限公司,江苏南京210009;南京集艾思软件科技有限公司,江苏南京210009;南京集艾思软件科技有限公司,江苏南京210009【正文语种】中文【中图分类】P2081 引言地理信息系统(GIS)自诞生以来,其地位和作用越来越明显,它不仅能管理空间信息和数据库属性数据,而且能对这些空间数据进行各种复杂的分析计算。
数字地图既是GIS的输入,也是GIS输出的主要形式。
目前,生产数字地图的主要手段是利用原有地形图进行数字化或全野外采集的方式,因此,生产高质量、符合GIS 要求的数字地图产品是GIS的一项重要基础工作[1]。
ArcGIS是目前国际上应用最为广泛的GIS软件之一[2]。
从ArcGIS8.3开始,空间数据库Geodatabase中引入了基于规则的拓扑关系管理这一新的概念和技术,使其拓扑关系表达和管理能力有了质的飞跃[3]。
为了检查和维护空间数据的拓扑关系正确性,ArcGIS定义了一组拓扑接口,用于用户定制拓扑关系规则,帮助用户发现存在的拓扑关系错误。
本文基于ARCGIS拓扑接口,利用ArcEngine10.1开发组件包,介绍了如何检查ArcGIS空间数据库中的拓扑错误与批量处理方法,因为篇幅原因,无法列出完整代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
System.Runtime.InteropServices.Marshal.ReleaseComObject(pCursor);
GC.Collect();
pWSEdit.StopEditOperation();
IFeature pFeature = null;
ESRI.ArcGIS.Geometry.esriNonSimpleReasonEnum reason;
ITopologicalOperator4 pTopo = null;
pTopo.IsKnownSimple_2 = false;
bl = pTopo.get_IsSimpleEx(out reason);
if (bl == false && reason == esriNonSimpleReasonEnum.esriNonSimpleRingOrientation)
pTopo.IsKnownSimple_2 = false;
bl = pTopo.get_IsSimpleEx(out reason);
if (bl == false && reason == esriNonSimpleReasonEnum.esriNonSimpleRingOrientation)
{
pTopo.Simplify();
pFeature.Shape = pTopo as IGeometry;
pFeature.Store();
}
MessageBox.Show("处理完成!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pCursor);
GC.Collect();
pWSEdit.StopEditOperation();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pCursor);
GC.Collect();
pWSEdit.StopEditOperation();
pWSEdit.StartEditOperation();
pCursor = pClass.Search(null, false);
pFeature = pCursor.NextFeature();
{
try
{
IWorkspaceEdit pWSEdit = ((IDataset)pClass).Workspace as IWorkspaceEdit;
IFeatureCursor pCursor = null;
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
pFeature = pCursor.NextFeature();
bool bl = false;
if (pWSEdit.IsBeingEdited() == false)
{
pWSEdit.StartEditing(false);
{
pTopo.Simplify();
pFeature.Shape = pTopo as IGeometry;
pFeature.Store();
pCursor = pClass.Search(null, false);
pFeature = pCursor.NextFeature();
while (pFeature != null)
pWSEdit.StopEditing(true);
}
else
{
pWSEdit.StartEditOperation();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
pFeature = pCursor.NextFeature();
namespace LGGIS.GIS.TopologyAnalysis
{
public class TopologyAnalysisClass
{
public delegate void Check_AreaRingOrientationDelegate(IFeatureClass pClass);
public delegate void Check_FeatureNonShapeDelegate(IFeatureClass pClass);
public void Check_AreaRingOrientation(IFeatureClass pClass)
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
pFeature = pCursor.NextFeature();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
pFeature = pCursor.NextFeature();
IFeatureCursor pCursor = null;
IFeature pFeature = null;
pCursor = pClass.Search(null, false);
if (pWSEdit.IsBeingEdited() == false)
{
pWSEdit.StartEditing(false);
pWSEdit.StartEditOperation();
pFeature = pCursor.NextFeature();
while (pFeature != null)
{
if (pFeature.Shape == null)
{
pFeature.Delete();
while (pFeature != null)
{
if (pFeature.Shape != null)
{
pTopo = pFeature.Shape as ITopologicalOperator4;
{
if (pFeature.Shape != null)
{
pTopo = pFeature.Shape as ITopologicalOperator4;
pWSEdit.StopEditing(true);
}
else
{
pWSEdit.StartEditOperation();
}
}
public void Check_FeatureNonShape(IFeatureClass pClass)
{
try
{
IWorkspaceEdit pWSEdit = ((IDataset)pClass).Workspace as IWorkspaceEdit;