注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

naigeer的知识库

不断学习,用知识武装头脑,用头脑创造未来!

 
 
 

日志

 
 

ArcGIS内复杂多边形的拓扑运算问题  

2009-07-22 21:13:44|  分类: ArcGIS开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这几天实现一个多边形综合的功能,发现了一个问题:调用ITopologicalOperator内的Union方法时,若是简单多边形(只有一个ring的多边形),和其他多边形合并之后一切正常,但是对于复杂多边形(a polygon containing many disjoint rings,由多个ring组成的多边形,这种多边形内可能有洞或岛),调用Union方法运行后新生成的多边形并不可见,但是其在要素属性表中仍然存在!在arcgis中对这类复杂多边形要素进行手工Union操作时,操作无法正常完成!

这个问题困扰了很久,今天总算找到了解决方法:

使用ITopologicalOperator接口进行拓扑运算时,最好每次都先设置IsKnownSimple为False,然后Simplify,最后进行拓扑运算不光适用于Union操作,对其它拓扑运算操作也同样适用。代码例子:

Dim pTopOp As ITopologicalOperator2
    Set pTopOp = Polygon0
    pTopOp.IsKnownSimple = False
    pTopOp.Simplify
    Set Polygon0 = pTopOp.Union(Polygon1)

'其中,Polygon0和Polygon1均为IPolygon对象

对于IsKnownSimple和Simplify,在网上找到一篇博文:

http://blog.csdn.net/complayer/archive/2006/12/27/1464127.aspx

转载如下:

第一次阅读总是忽略很多细节,当你明白怎么回事后再去读这段文字时发现原来已经说得很清楚了,下面就是一个例子:
ITopologicalOperator::IsSimple
Indicates whether this geometry is known (or assumed) to be topologically correct, after explicitly determining this if the geometry is not already known (or assumed) to be simple.
表示几何对象是否被认为(或假设)是拓扑正确的,进行显式判定如果几何对象不被认为(或假设)是简单的。

ITopologicalOperator2::put_IsKnownSimple

Indicates whether this geometry is known (or assumed) to be topologically correct.


表示几何对象是否被认为或假设是拓扑正确的。


Returns TRUE when the geometry is aware that it is Simple.  IsKnownSimple may return FALSE even if the geometry is simple as long as the geometry is not aware of its IsSimple state.  Calling either IsSimple or Simplify makes the IsSimple state known to the geometry.  Topologically altering the geometry makes the IsKnownSimple state FALSE until the IsSimple state is again checked.
返回TRUE如果几何对象知道是简单的。只要它不知道它的IsSimple状态,即便它是几何简单的,IsKnownSimple也可以返回FALSE。调用IsSimple或Simplify使几何对象知道IsSimple状态。几何对象的拓扑变化使得IsKnownSimple状态为FALSE直到IsSimple状态被再次检查。
而且在以下几种情况下,IsKnownSimple为TRUE
1、几何对象直接来自要素类(A geometry coming directly from a feature class)
2、空的几何对象
3、ITopologicalOperator接口方法的输出几何对象(Output geometry of any method on ITopologicalOperator)

大多数情况下我们会注意到IsSimple方法会影响IsKnownSimple,但是不会注意IsKnownSimple也会影响IsSimple方法。IsSimple方法说得很明白,如果几何对象知道自己是拓扑正确的,那么直接返回结果,否则就进行显式判定。根据什么来判断是否已经知道自己是拓扑正确的呢,IsKnownSimple方法,通过该方法了解几何对象是否知道自己的IsSimple状态。
        但是有些情况下,IsKnownSimple返回TRUE,但是几何对象的却拓扑不正确,因为IsKnownSimple为TRUE,所以IsSimple也不去做判定,这样一来IsSimple即便拓扑不正确也会返回TRUE。最常见的例子就是从Personal Geodatabase中读出来Feature的Geometry,因为PGDB保存时不检查拓扑是否正确,而直接从FeatureClass读出来Geometry,IsKnownSimple肯定为TRUE。还有Shapefile也有这样的问题,直接用IsSimple根本判断不出来是否拓扑正确。解决办法也非常简单调用IsSimple前把IsKnownSimple置为FALSE,强制它进行拓扑正确的判定。
       我是在ESRI的论坛上看到这个解决办法的,知道这个解决办法后回头再去看文档时,发现里面也提到了一星半点的只是我没有注意到而已。

  评论这张
 
阅读(1215)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017