spring20002
路人甲
路人甲
  • 注册日期2004-09-23
  • 发帖数86
  • QQ
  • 铜币286枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1975回复:1

3DGIS专题1--数据建库

楼主#
更多 发布于:2008-01-17 02:19
<P align=left>       很长一段时间,我想做个东西,当然想做一个很漂亮的软件,都是直接开始编,而且我发现把大量的时间都用在了界面编程上,呵呵,当然也是有所小成,回过头来再一看,花了这么长时间,要做的东西只是一个框架,功能虽说也算实现了些,但要是提些相似的问题,就又得重新开始,当然是  界面--功能。。。我发现这样效率很低,有时候很没意思,要知道 ,程序员如果没了兴趣的话,那么编程就是纯粹的编程了。多次思考后,我觉得我忽视了一个最重要的问题---数据。总结了一下:你所要处理的数据;数据的预处理;数据建库(如果要做完整GIS的话)。我想,我要做的软件应该是为数据服务的,而且也是搭建在数据这个基础上的。</P>
<P>       呵呵,我的表达能力一般,下面开始正题吧,写得不好,但也是我在开发中的体会和经验总结。</P>
<P>3DGIs要处理的数据无非是用(x,y,z)代表的所有实体。主要有如下几类:</P>
<OL>
<LI>地面数据(包括Dem, Dom, Dlg等)</LI>
<LI>地质数据(用来构建地层模型或特定场模型的数据)(这个比较特殊,也很复杂,可以单独拿出来做专业的软件, 这里先主要介绍地面上的三维,有时间再讨论地质体三维)</LI>
<LI>实体模型数据</LI>
<LI>矢量辅助数据(如矢量线来代表无实体的边界等)(欢迎大家补充哈。。。)</LI></OL>
<P>          向我最初作的地形浏览软件,包括稍微专业些的设计软件,都是先加载地面高程数据(一般是Tin模型),然后叠加影像,再加入实体模型,在这个基础上进行一些诸如漫游,查询,分析方面的工作,呵呵,这其实才是我们大多数人为什么会怀疑三维GIS究竟有什么用处的最初原因,因为它基本上就是看,就算你的界面再漂亮,飞行再流畅,也是这样。其实任何三维软件的基本数据操作流程都是这样的,关键是如果这些数据时多元,多尺度,海量的,其间蕴藏着丰富的信息时,三维立体的呈现出来是二维GIS无法比拟的,当然有也很强的经济价值,举几个例子:</P>
<OL>
<LI>森林防火:公路不可能连接到林区的每个地方,人员装备肯定是要从防火站出发,沿公路走到离火场最近的地方(当然是最优路径),然后上山灭火。传统的二维就是发给你一个路径,而不考虑山路的陡峭和可通过否。</LI>
<LI>公路设计,目前的公路设计软基本上都是用三维CAD软件在设计。</LI>
<LI>地质勘探,一个钻孔的话费少则十几万,多则几十万,三维查值计算与再现一定程度上弥补了这点。</LI></OL>
<P dir=ltr style="MARGIN-RIGHT: 0px">       (呵呵,太废话了,讲数据建库,转到三维GIS的必要性上来了,不好意思哈)</P>
<P >       处理以上几种数据的数据结构再此就不介绍了,网络上有很多资源可以利用。下面直接介绍建库流程及实现的大概方法。</P>
<P >        地形的三维可视化首要处理的就是地形高程数据,也就是使Dem。首先就是将Dem建库,并建立空间索引标准,层结构也好(如OpenFlight),树结构也罢,总之这是必须的,因为我们要考虑到这是平台,是要处理海量数据的。当然针对数据量小的时候可以进行单独处理,比如下面的方式: CTerrain ------- CLodTerrain,CStaticTerrain。当数据量小的时候直接构建CStaticTerrain, 否则通过调度LodTerrain生成StaticTerrain再进行渲染。</P>
<P >        如果我们在做一个项目,或是数据量不是特别大的时候,用动态Lod就可以应付,但考虑到比如高达20G数据量的情况,或像Google那样处理全球数据的时候,就必须考虑一下静态Lod方法了,典型的以空间换时间方式。</P>
<P >       也就是要首先对Dem分块组织(或者也将她看作高程影像构建金字塔后分块处理--分层分块),或者像某些软件采取的是Tile--Block--Grid方式,现分Tile, 每个Tile包含4*4的Block(有篇论文推荐12*8),每个Block包含具体的高程数据数组。</P>
<P >        相应的,其他数据也要进行这样的处理,当然,处理的程度不同,像影像,为了渲染使得效率最好同Dem处理方式一样,而且每块的范围应该是一样的,诸如代表边界等的矢量文件,如果要达到Google那样的效果,也要进行这样的处理;而模型仅需按照分块的空间索引存储即可,因为它的Lod可以通过动态的多变性简化实现,块只是决定它显示与否。(我在自己的系统中作过测试,矢量文件的动态简化和加密还是比较费时的,而且这个简化和加密的经验参数不好设定,而模型没有这个问题,我只要按照地形分的层数和在最精细一层时离视点的距离就可判断它是否该改变)</P>
<P >        当然,还要考虑多尺度的数据问题,比如某个区域的数据是1:10000的,在其间部分地区还存在1:2000的,数据融合问题,朱庆教授的文章和书中都有介绍,可以参照一下哈。</P>
<P >       别怕麻烦,毕竟这是离线的,想想我们的内存和显存,就知道我们为什么要这么做了。</P>
<P >       通过上面的步骤,基本的数据处理就完成了,你可以用文件库来存储或分发数据(如Google) ,也可以采用如Sql Server等关系型数据库,当然,数据引擎的编写就不是一言两语能讲清楚的了。(google是个特例,但哪个公司敢说他的服务器能达到Google的水平)</P>
<P >       这样一个基本的建库模块就完成了,以后就是对他的完善了,比如添加新的数据源,边界已有数据,输出数据等,就看你的需求啦。</P>
<P > </P>
<P >       我也就能写个大概思路,再往下写就是。。问题啦,希望致力于平台软件研发的朋友多交流,呵呵。</P>
<P > </P>
<P >                     </P>

<P>       </P>
喜欢0 评分0
nash13
路人甲
路人甲
  • 注册日期2008-03-28
  • 发帖数86
  • QQ
  • 铜币316枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2008-05-26 11:20
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em02.gif" />写的很好!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部