多Paht和Ring的Geometry的坐标转换问题
很久以前就写过坐标转换的程序,原理当然十分简单,通过IPointCollection接口取出每一个Geometry的组成节点,转换为新点后再次组合起来即可。但在刚开始的时候没有考虑Polyline的多Path和Polygon的多Ring情况,以至于一出现有洞的面或多路径的线时,转换的数据就是乱七八糟。
我后来也曾经试图通过寻找Polygon的外环和外环中的内环等方法来解决,这个玩意就两个字:复杂,尚若洞中还有环,这个Geometry的解析就无比复杂。拖拖拉拉半年之后,刚刚数据部接到一个宁波坐标转WGS84的任务,用以前的工具一转,点和大部分线还马马虎虎,那些面就真见了鬼了。
由于时间不多,思量之下,突然想到使用IGeometryCollection接口的方法,譬如对一个有两个洞的Polygon,可以这样处理:
IGeometryCollection pGeoCol=pPolygon as IGeometryCollection;
console.writeline(pGeoCol.GeometryCount);
我们会发现结果为3,即两个内环和一个外环都同时取出了。如果将三个环分别转换生成,当然还是用IPointCollection的接口,然后使用IGeometryCollection的方式进行组合,就刚刚好:
IGeoemtryCollection pNewGeo=new PolygonClass();
pNewGeo.AddGeometry(......)
立刻修改程序,4小时15分41秒,成功转换了大约1146889条记录。转换质量较高。
Related Items
Comments
没有用到AO投影中的什么接口,因为许多地方坐标系转换参数是保密的,测绘机构一般都只会提供一个计算的DLL。没法自己写。![]()
看看这几篇吧
AO单点坐标转换的图形处理之一--点
http://www.3snews.net/index.php?uid-8925-action-viewspace-itemid-18241
AO单点坐标转换的图形处理之二--线
http://www.3snews.net/index.php?uid-8925-action-viewspace-itemid-18286
AO单点坐标转换的图形处理之三--面
http://www.3snews.net/index.php?uid-8925-action-viewspace-itemid-18328
AO单点坐标转换的图形处理之三--面(续)
http://www.3snews.net/index.php?uid-8925-action-viewspace-itemid-18351
http://www.3snews.net/index.php?uid-8925 ,这上面有对点线面单点坐标转换完整的说明,可以看看。另外,代码的效率似乎有问题,100多万个面的处理时间太长了,不知道你机器配置如何,2G的cpu,速度应该在1小时左右
http://www.3snews.net/?8925 上有对点线面单点转换更为完整的代码,可以看看
处理的机器并不算太好,06年买的机器,CPU大概只有1.2G[现在没法看],内存512M。
我看了你介绍的文章,我之前处理的写法正是那样的,但在IPolygon.QueryInteriorRings方法中,一旦IRing大于2时,AO就自己抛出了异常,不可调试的异常,正因为如此我才使用的IGeometryCollection,其实使用IGeometryCollection比去遍历内外环更加简单。
想问一下,如果不采用内外ring的方式处理,不知道是否能正确处理环套环的图形,即有多个ExteriorRing,牵涉到重新组合环,只是通过IGeometryCollection重新生成能自动处理吗(你的数据中存在这种情况吗)?
另外“IPolygon.QueryInteriorRings方法中,一旦IRing大于2时,AO就自己抛出了异常,不可调试的异常”,是普遍还是个别现象?似乎只有图形本身有问题时才会产生这种情况?
是的,如果你用过IGeometryCollection接口,就会惊奇地发现AO自己会根据传入的IRing对象的位置生成合适的IPolygon。例如你传入的是大环套小环,那么小环部分自动会成为一个洞。我用IGeometryCollection正是为了最简单地使处理多环的情况。
IRing在一个外环中有两个或以上的内环时抛出系统异常,我测试过数十个这样的面均存在这种情况。正是在这个问题无法解决的情况下我才使用的IGeometryCollection接口,结果比遍历外环和内环的方式简单得多。
嗯,谢谢,我再试试看,如果是这样,代码应该简单多了
在做数据接边时,根据你给出的思路基本没什么问题,接边地物配对时,相离的面(小于容差)该如何进行合并,搜索到的论文提的方法是用约束delauney三角网法,想请教一下,你在做面合并时如何处理?
跟数据源质量有很大关系,我做过1:500地形图的接边工作,一般判断有两点在容差范围内就接边,但需要把多边形全部打散,重新串点,比较复杂
如果数据源很复杂,那就不好处理了,要考虑的情况很多,只能依据数据情况逐步完善代码了
数据的批量重新处理非常有意思,因为作业人员绘图的问题,我们会碰到很多复杂的数据情况,你根本想不到他们会用什么奇怪的方法作图,但总会发现他们的作图方法真的提高了作图效率,但对我们批量处理数据是个灾难,呵呵
这个也不尽然,难道你们没有制图标准?不过标准图幅转成MDB后的再处理工作量也不小。
上面你说的问题,我都想到了,线的接边、面相邻和重叠都做了,就是面相离这种情况做起来比较复杂,网上说有构约束delauney三角网来做,看起来很复杂,你说的打散和串点我也想过,但无法实现,因为无法判定add的规则,另外在多边形有多条相邻边时根本就做不下去,所以否决了这个思路,看有没有其他更好的想法。
aaaaa b cccccccccccc
a a b c c
a a b cccc c
aaaaa a b c c
a a b c c
a aaaa b c c
a a b c c
aaaaaaa b cccccc
a为多边形1,b为接边线,c为多边形2,小于容差的边有两条,中间为挖空的ring,接边的思路?
1111111 2 3333333
1 1 2 3 3
1 1111 2 333 3
1 1 2 3 3
1 1111 2 333 3
1 1 2 3 3
1111111 2 3333333
11111111*2*333333333
11111111*2*333333333
11111111*2*333333333
111111***2****333333
111111***2****333333
111111***2****333333
11111111*2*333333333
11111111*2*333333333
11111111*2*333333333
11111111*2*333333333
11111111*2*333333333
11111111*2*333333333
111111***2****333333
111111***2****333333
111111***2****333333
11111111*2*333333333
11111111*2*333333333
11111111*2*333333333
多边形1,接边线2,多边形3,小于容差的边有两条,中间为挖空的ring,接边的思路?
楼主你太强了!向你好好学习!请问你的QQ是多少啊?
Leave a comment
Or, take a look at Archives and Categories
请问楼主做坐标转换的时候,用到了AE中的哪些接口??
还是说完全是自己写的算法?