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("文件头信息错误!","提示信息"); return false; } m_nDemX = DemHeader.iDemX; // 从文件头中取数据 m_nDemY = DemHeader.iDemY; m_nInterval = (int)DemHeader.interval; // 网络间隔 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 int[length - sizeof(DEMFILEHEADER)]; // Z坐标 m_nHSize = 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坐标并将坐标原点移动到地形的中心:
for (int i = 0; i < m_nDemY; i++) { for (int j = 0; j < m_nDemX; j++) { m_pDemX[m_nDemX * i + j] = m_nInterval * j - (m_nDemX / 2) * m_nInterval; m_pDemY[m_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 * DemHeader.iDemY * sizeof(int)); file.Close(); |
小结
本文主要介绍了对DEM数字高程模型数据的一般使用方法,为三维地景仿真处理系统的场景绘制提供了基本的数据来源。读者需要掌握的技术主要有对DEM文件的创建和对DEM文件的读写访问等。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |