DEM数据文件的读取和保存_第1页
DEM数据文件的读取和保存_第2页
DEM数据文件的读取和保存_第3页
DEM数据文件的读取和保存_第4页
DEM数据文件的读取和保存_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、dem数据文件的读取和保存引言在上一篇文章中建立了opengl应用程序框架,为场景的绘制提供了环境支持。要绘制某一区域场地的场景自然需要通过对该区域各点坐标数据的建模来实现。由于这些点的坐标取值描述了该区域的基本地貌特征,因此建模后的场景能够无失真的再现该区域从而达到仿真的目的。但是在实际操作时不可能取该区域的全部点进行建模,无论是数据量还是运算速度都是不允许的。一般的做法是进行网格抽取,可以在该区域纵横方向各每隔1米、10米、100米或是1千米取一个点,以这些点的坐标值来模拟真实场景,网络抽取间隔应以抽取后的网格足够描述原区域地貌特征为准。由于网格间隔固定,因此网格的平面坐标能够很容易的推算

2、出来而无须记录,真正有价值的是各点的高程数据,这种由高程数据组成的均匀间隔网格模型在gis中通称为数字高程模型(dem)。本文将就dem数据的读取和生成进行重点介绍。dem数据结构的定义dem数据并没有统一的标准格式,常用的标准有美国地理dem数据标准和日本dem数据标准等多种,这类dem数据定义的信息较多,而这里只使用了高程数据,如果使用上述格式标准则信息利用率太低。因此,这里将建立自己的dem数据格式,并以此来存储某一区域的地景特征数据。如果要满足在引言中提到的dem数据定义标准,至少需要定义网格的长、宽节点数、网格间隔以及各节点的高程数据。其中,各节点的高程数据以整型点阵数据方式存储记录

3、,其余各参数可以作为文件头进行定义。由此可以定义数据结构demfileheader来描述dem文件头,该文件头除了定义上述几个必须字段外,还定义了一些保留字段以备将来扩展使用:typedef struct tagdemfileheader / 定义dem数据的头文件格式int map6; / 保留int idemy; / dem格网y方向上的点数int idemx; / dem格网x方向上的点数float sx; / x方向缩放系数float sy; / y方向缩放系数float interval; / dem格网点的采样间隔 demfileheader;dem数据文件的生成dem数据文件的生

4、成主要包括两部分:文件头的生成和网格数据的生成。如果数据量不大,可以用手工填表的方式将采集到的网格化高程数据写入到dem数据文件。但在实际使用时,数据量往往是比较巨大的。应当采取某种自动化处理措施使其实用化。这里采取从位图导入高程数据的方式,通过前期处理将通过卫星遥感手段得到的某一地区的高程数据作为图象颜色值而以位图的形式给出,这样一来,只需要读取该位图信息,图象的宽度和高度就是dem文件的x方向和y方向的网格节点数,图象颜色值为高程数据,用户只需手工输入根据比例换算而来的网格间隔即可。下面这段代码是实现这部分功能的主要代码:demheader.idemx = set.m_nxpoint; /

5、 填充文件头 demheader.idemy = set.m_nypoint;demherval = set.m_ninterval;/ 选择待生成的dem文件cfiledialog filedlg(false, *.dem, *.dem, ofn_hidereadonly | ofn_overwriteprompt, 地形数据文件(*.dem)|*.dem|, null);if (filedlg.domodal() = idok) / 申请dem数据缓冲区int* pdata = new intset.m_nwidthbytes * set.m_nypoint + 100;

6、if (set.m_buserandom = false) byte r, g, b; / 24位图象将真彩数据转换为灰度数据保存for (int i = 0; i set.m_nypoint; i+) for (int j = 0; j set.m_nxpoint; j+) b = set.m_pdatai * set.m_nwidthbytes + j * 3;g = set.m_pdatai * set.m_nwidthbytes + j * 3 + 1;r = set.m_pdatai * set.m_nwidthbytes + j * 3 + 2;pdatai * demheader

7、.idemx + j = (int)(9798.0f * r + 19235.0f * g + 3735.0f * b) / 32768.0f);elsefor (int i = 0; i set.m_nxpoint * set.m_nypoint; i+) / 用随机数填充dem数据pdatai = (int)(rand() % set.m_nlimit);cfile file; / 保存dem数据到文件file.open(filedlg.getpathname(), cfile:modecreate | cfile:modereadwrite);if (pdata != null) fil

8、e.write(lpstr)&demheader, sizeof(demheader);file.writehuge(lpstr)pdata, demheader.idemx * demheader.idemy * sizeof(int);file.close();delete pdata;其中, set.m_nxpoint、set.m_nypoint和set.m_ninterval分别为从图象获取得到的网格节点数和用户输入的网格间隔。这几个参数填充到demfileheader 结构对象demheader中后将作为dem文件头保存到新创建的dem数据。set.m_pdata指向的缓冲区保存有以

9、rgb颜色值方式给出的各节点高程数据,经过换算后保存到dem数据文件既然已经清楚dem数据文件的存储格式,数据的读取就不是一件困难的事情了。下面先给出执行函数readdem(cstring sdemfile)的实现过程:cfile file(sdemfile, cfile:moderead); / 打开文件 dword length = file.getlength(); / 得到文件长度if (file.read(lpstr)&demheader, sizeof(demfileheader) != sizeof(demfileheader) / 读入dem头文件messagebox(文件头信

10、息错误!,提示信息);return false;m_ndemx = demheader.idemx; / 从文件头中取数据m_ndemy = demheader.idemy;m_ninterval = (int)demherval; / 网络间隔m_pdemx = new int(m_ndemx + 1) * (m_ndemy + 1); / x坐标m_pdemy = new int(m_ndemx + 1) * (m_ndemy + 1); / y坐标m_pdemh = new intlength - sizeof(demfileheader); / z坐标m_nhsize

11、 = length - sizeof(demfileheader);m_nsumpointofdem = m_ndemx * m_ndemy; / 网格总点数int m_nsumfaceofdem = 2 * (m_ndemx - 1) * (m_ndemy - 1); / 网格总面数file.readhuge(m_pdemh, length - sizeof(demfileheader); / 读取数据file.close(); / 关闭文件至此,已经取出dem文件头信息和高程点阵数据。这只是原始信息,为了能够在后面将要进行的场景绘制中以此来建模,还要标定格网点的x、y坐标并将坐标原点移动到

12、地形的中心:for (int i = 0; i m_ndemy; i+) for (int j = 0; j m_ndemx; j+) m_pdemxm_ndemx * i + j = m_ninterval * j - (m_ndemx / 2) * m_ninterval;m_pdemym_ndemx * i + j = m_ninterval * i - (m_ndemy / 2) * m_ninterval;至此,已经从dem文件恢复出各节点的坐标参数(x,y,z坐标数据分别存放在m_pdemx、m_pdemy和m_pdemh指向的缓冲区中)。如果需要将当前正在显示的地景仿真数据保存,只需简单的将demfileheader 结构对象demheader中的数据保存到dem文件头、将整型数组m_pdemh中的数据保存到dem文件高程点阵即可:cfile file(m_sdemfile, cfile:modereadwrite); / 保存文件 file.write(lpstr)&demheader, sizeof(demheader);file.writehuge(lpstr)m_pdemh, demheader.idemx * d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论