|
阅读:1550回复:1
一个完备的要素SHAPE裁剪函数
<DIV class=postText>
<P>要素裁剪的问题,即如何裁剪要素的SHAPE,还有许多网友在询问,其实这并没有什么特别之处。除了AO自带的Clip函数以外,我一般都是使用ITopologicalOperator接口提供的拓扑方法来自己搞定,原因很简单,每一条要素的裁剪情况都能自己掌握。</P> <P>要素裁剪无非两种情况,一是不处理裁剪面边缘上的要素,统统删除,这个没有什么问题,空间关系选择Intersect即可;另一个是裁剪边缘上的要素,如Polygon如果与裁剪面相交,则保留不想交的部分,如果Polyline与裁剪面相交,也是保留面外面的一部分线段。</P> <P>这几个拓扑方法在很多时候会爆出异常,其实解决的方法在网上早就有了,关键是两个Geoemtry的SpatialReference需要一致才行。下面给出一个完备的函数:<BR> public static IGeometry getUpdateOuterGeometry2(IGeometry srcGeo, IGeometry refPolygon) <BR> {<BR> if (srcGeo.SpatialReference != null ;; refPolygon.SpatialReference == null)<BR> refPolygon.Project(srcGeo.SpatialReference);<BR> if (srcGeo.SpatialReference == null ;; refPolygon.SpatialReference != null)<BR> srcGeo.Project(refPolygon.SpatialReference);</P> <P> IGeometry pGeo = null;<BR> ITopologicalOperator2 pTopo;<BR> ITopologicalOperator2 pTopo2;<BR> switch (srcGeo.GeometryType) <BR> {<BR> case esriGeometryType.esriGeometryPolyline:<BR> pTopo = (ITopologicalOperator2)refPolygon ;<BR> pTopo.IsKnownSimple_2 = false;<BR> pTopo.Simplify();<BR> pTopo2 = (ITopologicalOperator2)srcGeo;<BR> pTopo2.IsKnownSimple_2 = false;<BR> pTopo2.Simplify();<BR> pGeo = pTopo2.Difference(pTopo.Intersect(srcGeo, esriGeometryDimension.esriGeometry1Dimension));<BR> break;<BR> case esriGeometryType.esriGeometryPolygon:<BR> pTopo = (ITopologicalOperator2)srcGeo;<BR> pTopo.IsKnownSimple_2 = false;<BR> pTopo.Simplify();<BR> pGeo = pTopo.Difference(refPolygon);<BR> break;<BR> default:<BR> pGeo = srcGeo;<BR> break;<BR> }<BR> return pGeo;<BR> }</P></DIV> |
|
|
|
1楼#
发布于:2008-11-19 13:10
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
|
|