1.调用ITopologicalOperator 相关方法之后,最好用 Simplify(),按照官方说明:
Simplify | Makes this geometry topologically correct. |
否则可能会产生不可预知的问题,比如面积为负数之类的。
2.调用Intersect,Difference等接口,组合实现一业务逻辑。测试的时候,把中间数据都保存到一featureclass中,结果一切正常。取消测试数据的保存,发现结果很奇葩,多了一些奇怪的碎线。
根据业务逻辑,此处不应该产生碎线,推测应该为拓扑问题。做了一大堆的Simplify()之类的操作,发现只要中间数据不保存,结果都是会产生一大堆碎线。
推测是Tolerance的问题,发现把数据集的SpatialReferene清除掉,则结果一切正常。
后来慢慢尝试发现,调用ITopologicalOperator接口的Boundary()方法,获取面要素的边界线,经过测试发现,该接口获取到的Polyline,无SpatialReference,而原始数据是有SpatialReference的,因此,后来在处理的时候,先把线增加了要素集的SpatialReference,再测试,结果一切正常。
解决问题的时候走了一大堆弯路,一直想办法如何修改ITopologicalOperator接口的Tolerance,没有检索到任何有意义的方法。
结论:
(1)调用ITopologicalOperator接口的相关方法时,处理结束后,记得需要Simplify()
(2)调用Boundary()方法时,记得一定需要配置结果的SpatialReference,其他方法未测试
(3)如果产生了奇葩的结果,考虑是否中间数据的SpatialReference丢失