我公司正在开发一个高校三维系统,该系统为GIS+MIS。我们负责GIS部分,二次开发平台选用Supermap Objects。
    提到超图,在GIS行业口碑甚佳,有中科院这个强大的技术背景,很多公司(包括我们)都对其实力深信不疑。
    在GIS二维上,超图稳定的性能以及良好的扩展性给我以舒爽之感,我在这个平台上开发的一套框架在继承其控件的良好性能基础上大幅的提高了开发效率,使我们的程序在可扩展性、可维护性、可复用性等多个方面表现优越,这个框架的具体情况会在本系列的下一个专题中详细阐述。然而,超图的GIS三维,唉!
    为了更好的说明本专题的“深远”意义,我还是介绍一下超图的GIS三维吧。
    GIS三维就是在三个地理坐标轴上展现地理信息,这将是GIS行业的必然归宿,它更加贴合人的经验、习惯,当硬件技术不再成为瓶颈时,GIS三维将成为主流。显然国内的各个GIS厂商已经意识到了这一点,灵图走的更远一些,由于没有用它做过实际的开发,所以没有什么发言权,但就其demo和介绍来看,效果还是不错的。超图的三维功能就相对弱了一些,这里是看在其GIS二维的面子上嘴下留情了。
    超图的GIS三维就其效果,还是可以唬人一气的,但是在大场景上,你可不要轻易的乱动,否则后果自负。超图宣称其三维系统基于OpenGL,但在不同的显卡上其工作效率基本一致,并且性能低下,应该是采用了纯软件模式,假如能够使用硬件加速的话,那么部署起来也会增加工作量;在展现方式上,这里的三维说白了就是原地拔高,在数据库中的每一行记录(一个面对象)中,会有两个字段分别表示base和top,到了三维控件中将来自二维控件的一个面转变为一个以base为底部高程、top为顶部高程、面对象为上下表面的一个直棱柱对象(soGeoRegionCylinder),在其普通三维图层中只能存在这一种对象,很显然,局限性很大。比如学校中的某个教学楼屋顶是尖的,就无法用一个直棱柱对象来表现了,要想模拟这样的效果,就需要多个直棱柱对象相互组合,用近似的方法拼接出来,这样就增加了大量的小直棱柱,进一步影响系统的性能,至于贴图的方式和性能这些小问题,我就不提了,我来说说最不能让人忍受的地方。
    在我们在做的系统中,会涉及到对各种管线进行管理,这些管线会在三维空间中到处乱窜,很显然用直棱柱的形式是痴心妄想,好在超图的三维控件提供了一个在所有图层之上的跟踪层,在这个跟踪层上可以绘制一些类库提供的三维对象,当然三维线对象位于其中。将三维管线绘制出来,效果还不错,但是,灾难性的,它无法选中,超图的选中方法是鼠标命中某个对象的外接长方体,然而一条三维线可能横跨几公里,会拐好几个弯,这样的一个外接长方体可能会包括整个学校!三维线会有成百上千上万条,外接长方体相互交叉,如果想用鼠标选中某条三维线,那就是个蜀道难。
    基于以上的局限性,最后项目组决定由我来尝试开发一个以Managed DirectX9为三维支撑,与超图类库紧密集成的三维控件,换句话说就是把超图的数据在托管DirectX上显示。这样会有很多好处,首先在性能上由于是自己开发控制起来较有把握;如果开发成功会成为这个项目的一个副产品,具有一定的商业价值等等。
    在GIS二维中,主要存在点、线、面三种对象,点、线到三维的变换比较容易,面对象则相对复杂。大家知道在D3D中要想表现一个面需要用一系列的三角形将其拼接出来,因此要想在D3D中显示GIS二维的面对象,需要首先将面对象转变为一系列的三角形,然后按照D3D的数据结构进行组织,继而显示出来,这样摆在我面前的第一个问题就是任意多边形的三角剖分。在GIS二维系统中,什么样的多边形都可能出现,凸多边形、凹多边形、有洞多边形、自相交多边形、分离多边形(这个是我自己起的名字)等等,因此这个问题注定是复杂而富有挑战的,经过两个星期左右的奋战,在查阅了大量文献后,创造了一种新的剖分算法,我会在本专题中详细阐述这种新的算法,分析它的优劣。我的实现是建立在超图对象基础之上的,在行文过程中,我会适当的介绍一些超图对象,以帮助园友更好的理解算法。


目录:
    第一回:回望经典,看看别人是怎么干的
    第二回:漫谈新思路,是我们自己干的时候了
    第三回:实现步骤显示,一步一步看得见
    第四回:掌握数学工具,没个好帮手怎么行
    第五回:设计数据结构,存好了数据好干活
    第六回:寻找交点,离胜利就剩一步 之 纽带
    第六回:寻找交点,离胜利就剩一步 之 开找
    第七回:寻找三角形,夺取红旗
    第八回:梳理和总结

 

 posted on 2008-03-25 10:43  floodpeak  阅读(3848)  评论(9编辑  收藏  举报